程序实现一个链队列,任意输入一串儿字符,以@为结束标志,然后将队列中的元素逐一取出,打印在屏幕上。代码如下所示:
#include"stdio.h"
typedef char ElemType;
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; /*队头指针*/
QueuePtr rear; /*队尾指针*/
}LinkQueue;
initQueue(LinkQueue *q){
/*初始化一个空队列*/
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
/*创建一个头结点,队头队尾指针指向该结点*/
if(!q->front)
exit(0); /*创建头结点失败*/
q->front->next = NULL; /*头结点指针域置NULL*/
}
EnQueue(LinkQueue *q,ElemType e){
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode)); /*创建一个队列元素结点*/
if(!q->front) /*创建头结点失败*/
exit(0);
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
DeQueue(LinkQueue *q,ElemType *e){
/*如果队列q不为空,删除q的队头元素,用e返回其值*/
QueuePtr p;
if(q->front == q->rear)
return; /*队列为空,返回*/
p = q->front->next;
*e = p->data;
q->front->next = p->next;
if(q->rear==p)
q->rear=q->front; /*如果队头就是队尾,则修改队尾指针*/
}
/*测试函数*/
main()
{
ElemType e;
LinkQueue q;
initQueue(&q); /*初始化一个队列q*/
printf("Please input a string into a queue\n");
scanf("%c",&e);
while(e!='@'){
EnQueue(&q,e); /*向队列中输入字符串,以@表示结束*/
scanf("%c",&e);
}
printf("The string into the queue is\n");
while(q.front!=q.rear){ /*将队列中的元素出队列,并打印在屏幕上*/
DeQueue(&q,&e);
printf("%c",e);
}
printf("\n");
getche();
}
实现结果如下图所示:
实例与分析:
1.在入队列操作中,我犯了一个错误,把q->front写成了p->front,刚开始还比较纳闷,为啥错了,后来感觉是自己不注意......大家需要注意链队列的定义,它是首先定义了一个QNode类,它是一个队列的元素类(队列中每个元素的类型都是QNode),说白了就是先定义一个链表,再用链表定义一个队列,就是所谓的链队列了。在入队列操作中,p只是一个活动指针,它是QNode类型,而不是LinkQueue类型,所以没有p->front。
2.为什么在出队列操作中,如果队头就是队尾(也就是队列中只有一个元素的情况),要修改队尾指针?由于此时删除队头元素后该队列为空,所以要修改队尾指针,否则下次判断的时候无法知道队列已经空了。