链式队列的9种基本操作

链式队列的9种基本操作

定义常量

/*一些经常用到的头文件,预定义常量等*/
//常用头文件
#include 
#include 
#include 
#include 
#include 
//函数结果状态代码
#define TRUE	1
#define FALSE	0
#define OK		1
#define ERROR	0
#define INFEASIBLE	0
//新建函数类型,表示函数运行结果
typedef int Status;

结构体定义和函数声明

#pragma once
typedef int QElemType;
typedef struct QNode
{
	QElemType data;
	struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{
	QueuePtr front;	//队头指针 
	QueuePtr rear;	//队尾指针 
}LinkQueue; 

//构造空队列
Status InitQueue(LinkQueue* Q);
//销毁队列
Status DestroyQueue(LinkQueue* Q);
//清空队列 
Status ClearQueue(LinkQueue* Q);
//判队列空
Status QueueEmpty(LinkQueue Q);
//队列长度
int QueueLength(LinkQueue Q);
//取队头元素,用e返回
Status GetHead(LinkQueue Q, QElemType* e);
//插入元素
Status EnQueue(LinkQueue* Q, QElemType e);
//删除元素
Status DeQueue(LinkQueue* Q, QElemType* e);
//遍历队列
Status QueueTraverse(LinkQueue Q, void (*visit)(QElemType));
//辅助函数
void visit(QElemType e); 

函数定义

//构造空队列
Status InitQueue(LinkQueue* Q)
{
	Q->front = (QueuePtr)malloc(sizeof(QNode));
	if (!Q->front)	exit(-1);
	Q->rear = Q->front;
	Q->rear->next = NULL;
	return OK;
}
//销毁队列
Status DestroyQueue(LinkQueue* Q)
{
	while (Q->front)
	{
		Q->rear = Q->front->next;
		free(Q->front);
		Q->front = Q->rear;
	}
	return OK;
}
//清空队列 
Status ClearQueue(LinkQueue* Q)
{
	//保存指针 
	QueuePtr p, q;
	p = Q->front->next;
	//截断 
	Q->rear = Q->front;
	Q->front->next = NULL;
	//逐个释放节点
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	return OK;
}

//判队列空
Status QueueEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
		return TRUE;
	else
		return FALSE;
}
//队列长度
int QueueLength(LinkQueue Q)
{
	int len = 0;
	QueuePtr p = Q.front->next;
	while (p)
	{
		len++;
		p = p->next;
	}
	return len;
}
//取队头元素,用e返回
Status GetHead(LinkQueue Q, QElemType* e)
{
	if (Q.front == Q.rear)
		return ERROR;
	*e = Q.front->next->data;
	return OK;
}
//插入元素(队尾)
Status EnQueue(LinkQueue* Q, QElemType e)
{
	QueuePtr temp = (QueuePtr)malloc(sizeof(QNode));
	if (!temp)	exit(-1);
	temp->data = e;
	//连接 
	Q->rear->next = temp;
	temp->next = NULL;
	Q->rear = temp;
	return OK;
}
//删除元素(队头) 
Status DeQueue(LinkQueue* Q, QElemType* e)
{
	if (Q->front == Q->rear)
		return ERROR;
	QueuePtr p, h;
	h = Q->front;		//头结点指针 
	p = h->next;		//第一个节点指针 
	h->next = h->next->next;	//头节点链接第二个节点
	*e = p->data;		//返回第一个结点信息 
	free(p);			//释放第一个节点
	return OK;
}
//遍历队列
Status QueueTraverse(LinkQueue Q, void (*visit)(QElemType))
{
	QueuePtr p = Q.front->next;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return 0;
}

测试

int main()
{
	//构造空队列
	LinkQueue Q;
	if (InitQueue(&Q))
		printf("创建成功!\n");
	else
		printf("创建失败!\n");
	//判空
	if (QueueEmpty(Q))
		printf("空队列!\n");
	else
		printf("非空队列!\n");
	//插入元素
	int i;
	for (i = 1; i <= 8; i++)
	{
		EnQueue(&Q, i);
	}
	//遍历元素
	QueueTraverse(Q, visit);
	//取首元素
	QElemType e;
	if (GetHead(Q, &e))
		printf("首元素为:%d\n", e);
	else
		printf("获取失败!\n");
	//队长
	printf("队长为:%d\n", QueueLength(Q));
	//删除元素
	if (DeQueue(&Q, &e))
		printf("删除结点成功:%d\n", e);
	else
		printf("删除失败!\n");
	if (DeQueue(&Q, &e))
		printf("删除结点成功:%d\n", e);
	else
		printf("删除失败!\n");
	//取首元素
	if (GetHead(Q, &e))
		printf("首元素为:%d\n", e);
	else
		printf("获取失败!\n");
	//队长
	printf("队长为:%d\n", QueueLength(Q));
	//遍历元素
	QueueTraverse(Q, visit);
	//清空队列
	if (ClearQueue(&Q))
		printf("清空成功!\n");
	else
		printf("清空失败!\n");
	//判空
	if (QueueEmpty(Q))
		printf("空队列!\n");
	else
		printf("非空队列!\n");
	//取首元素
	if (GetHead(Q, &e))
		printf("首元素为:%d\n", e);
	else
		printf("获取失败!\n");
	//队长
	printf("队长为:%d\n", QueueLength(Q));
	//销毁队列
	if (DestroyQueue(&Q))
		printf("销毁成功!\n");
	else
		printf("销毁失败!\n");
	return 0;
}

//辅助函数
void visit(QElemType e)
{
	printf("%d ", e);
}

运行结果

链式队列的9种基本操作_第1张图片

你可能感兴趣的:(数据结构,队列,链式队列,数据结构,严蔚敏)