版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct qnode
{
ElemType data;
struct qnode *next;
} DataNode;
typedef struct
{
DataNode *front;
DataNode *rear;
} LinkQuNode;
void InitQueue(LinkQuNode *&q)
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
void DestroyQueue(LinkQuNode *&q)
{
DataNode *pre=q->front,*p;//pre指向队首结点
if (p!=NULL) //p指向结点pre的后继结点
{ p=pre->next;
while (p!=NULL)//p不空循环
{ free(pre);//释放pre结点
pre=p;p=p->next;//pre,p同步后移
}
}
free(pre);//释放最后一个结点
free(q); //释放 lian'dui
}
bool QueueEmpty(LinkQuNode *q)
{
return(q->rear==NULL);
}
void enQueue(LinkQuNode *&q,ElemType e)
{ DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode));//创建新结点
p->data=e;
p->next=NULL;
if (q->rear==NULL) //若链队为空,则新结点是队首结点又是队尾结点
q->front=q->rear=p;
else
{ q->rear->next=p; //将p结点链到队尾,并将rear指向它
q->rear=p;
}
}
bool deQueue(LinkQuNode *&q/*,ElemType &e*/)
{ DataNode *t;
if (q->rear==NULL) //队列为空
return false;
t=q->front; //t指向第一个数据结点
if (q->front==q->rear) //队列中只有一个结点时
q->front=q->rear=NULL;
else //队列中有多个结点时
q->front=q->front->next;
printf("%c\n",t->data);
//e=t->data;
free(t);
return true;
}
int main()
{
LinkQuNode *q;
InitQueue(q);
printf("初始化完毕\n");
if(QueueEmpty(q))
{
printf("链队为空\n");
}
else
{
printf("链队不为空\n");
}
enQueue(q,'a');
enQueue(q,'b');
enQueue(q,'c');
printf("进队完毕\n");
deQueue(q);
printf("a已经出队\n");
enQueue(q,'d');
enQueue(q,'e');
enQueue(q,'f');
deQueue(q);
deQueue(q);
deQueue(q);
deQueue(q);
deQueue(q);
DestroyQueue(q);
return 0;
}