链式队列的基本操作
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef char ElemType;
typedef struct DataNode
{
ElemType data;
struct DataNode *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 *p=q->front,*r; //p指向队头数据结点
if(p!=NULL) //释放数据结点占用空间
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;r=p->next;
}
}
free(p);
free(q); //释放链队结点占用空间
}
//判断队列是否为空
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;
e=t->data;
free(t);
return true;
}
//显示队列中所有元素
bool DisplayLinkQueue(LinkQuNode *q)
{
DataNode *p;
int i=0;
p=q->front;
if(p==NULL)
printf("队列为空"); //队列为空
else{
while(p){ //否则显示队列中所有元素
printf("[%d:%c]",++i,p->data);
p=p->next;
}
printf("\n");
}
return true;
}
//输出队列的长度
int LinkQueueLength(LinkQuNode *q){
int i=1;
DataNode *p=q->front;
while(p!=q->rear){
i++;
p=p->next;
}
return i;
}
int main()
{
LinkQuNode *LQ;
ElemType e;
int flag=1,ch,len;
bool temp;
printf("本程序实现链式结构队列的操作。\n");
printf("可以进行入队列、出队列等操作。\n");
InitQueue(LQ);
while(flag){
printf("请选择:\n");
printf("1.显示队列所有元素\n");
printf("2.入队列\n");
printf("3.出队列\n");
printf("4.求队列的长度\n");
printf("5.退出程序\n");
scanf("%d",&ch);
getchar();
switch(ch){
case 1:DisplayLinkQueue(LQ);break;
case 2:printf("请输入要入队的元素:");
scanf("%c",&e);
enQueue(LQ,e);
DisplayLinkQueue(LQ);
break;
case 3:temp=deQueue(LQ,e);
if(temp==true){
printf("出队一个元素:%c\n",e);
DisplayLinkQueue(LQ);
}
else printf("队列为空!\n");
break;
case 4:len=LinkQueueLength(LQ);
printf("队列的长度为:%d\n",len);
break;
default:flag=0;
printf("程序运行结束,按任意键退出!\n");
}
}
}
输出结果:
本程序实现链式结构队列的操作。
可以进行入队列、出队列等操作。
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
1
队列为空请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
2
请输入要入队的元素:abcdfh
[1:a]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
请输入要入队的元素:[1:a][2:c]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
请输入要入队的元素:[1:a][2:c][3:f]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
请输入要入队的元素:[1:a][2:c][3:f][4:
]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
3
出队一个元素:a
[1:c][2:f][3:
]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
4
队列的长度为:3
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序
1
[1:c][2:f][3:
]
请选择:
1.显示队列所有元素
2.入队列
3.出队列
4.求队列的长度
5.退出程序