【问题描述】链队列Q,实现链队列的初始化、元素入队、出队等操作
typedef struct QNode{ //结点的定义
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{ //链队列的定义
QueuePtr front; //队头指针 front
QueuePtr rear; //队尾指针rear
}LinkQueue;
依次执行以下操作
LinkQueue Q; //定义队列Q
InitQueue(&Q); //初始化
CreateQueue(&Q); //元素依次入队
DeQueue(&Q); //执行一次出队
QueueTraverse(&Q); //遍历出队后的队列
ClearQueue(&Q); //清空链队列
QueueTraverse(&Q); //遍历空队列
【样例输入】7
12 59 56 53 62 5 50
【样例输出】59 56 53 62 5 50
【样例说明】队列长度为7,CreateQueue(&Q)函数实现12 59 56 53 62 5 50共7个元素依次入队Q,执行一次出队操作后,队列Q为:59 56 53 62 5 50
【运行结果如下】
【代码如下】
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR -1
typedef int QElemType;
typedef void Status;
/*结点的定义*/
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
/*链队列的定义*/
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
/*构造一个空队列*/
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front) exit(OVERFLOW); //存储分配失败
Q.front->next = NULL;
}
/*队列判空*/
bool QueueEmpty(LinkQueue &Q)
{
if (Q.front == Q.rear)
return true;
return false;
}
/*入队*/
Status EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode)); //创建结点
if (!p) exit(OVERFLOW); //存储分配失败
p->data = e;
p->next = NULL; //指空
Q.rear->next = p; //入队
Q.rear = p; //尾指针移动
}
Status CreateQueue(LinkQueue &Q)
{
QElemType i, j;
QElemType count; //元素个数
scanf("%d",&count);
for(i = 0; i<count; i++) {
scanf("%d",&j);
EnQueue(Q,j); //入队
}//for
}
/*出队*/
int DeQueue(LinkQueue &Q)
{
QElemType e;
QueuePtr pre; //当前指针
if (Q.front == Q.rear) exit(OVERFLOW); //队列为空
pre = Q.front->next; //指向第一个结点
e = pre->data;
Q.front->next = pre->next;
if (Q.rear == pre) //遇到最后一个结点时,将尾指针指向头结点
Q.rear = Q.front;
free(pre); //释放当前指针
return e;
}
/*清空链队列*/
Status ClearQueue(LinkQueue &Q)
{
if(!QueueEmpty(Q))
DeQueue(Q); //队列不为空时,执行出队操作
}
/*遍历队列*/
Status QueueTraverse(LinkQueue &Q)
{
while (!QueueEmpty(Q)) {
printf("%d ",DeQueue(Q)); //队列不为空时,输出队列中的元素
}
}
int main()
{
LinkQueue Q; //定义队列Q
InitQueue(Q); //初始化
CreateQueue(Q); //元素依次入队
DeQueue(Q); //执行一次出队
QueueTraverse(Q); //遍历出队后的队列
ClearQueue(Q); //清空链队列
QueueTraverse(Q); //遍历空队列
return 0;
}
本文章仅供学习和参考!
欢迎交流~