您的位置:首页 > 理论基础 > 数据结构算法

链式队列

2017-01-17 22:01 99 查看
链式队列具有内存动态分配,内存利用率高的特点,在一些无法预先估计所需队列大小的场合使用链式队列是一个十分好的选择。下面是我最近学习链式队列的代码。注意这里的头结点不存储数据。

首先,要实现链式队列,首先要构造相应的数据结构,这里考虑使用两个指针分别指向队列的队头和队尾,队列使用单链表实现。代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"queue.h"
/*链式队列*/
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QNodePtr;
typedef struct
{
QNodePtr front;//头指针
QNodePtr rear;//尾指针
}LinkQueue,*LinkQueuePtr;


接下来写出链式队列的基本函数

/*链式队列相关函数*/
/*功能:创建一个链式队列
返回值:返回指向链式队列的一个指针
*/
LinkQueue *Creat_LinkQueue()
{
LinkQueue *Q;//定义变量
Q=(LinkQueuePtr)malloc(sizeof(LinkQueue));//为队列指针分配内存
Q->front=Q->rear=(QNodePtr)malloc(sizeof(QNode));//为队列的队头节点分配内存
if(Q->front==NULL)//判断内存是否分配成功
{
printf("there is no enough memory aviable\n");
exit(0);
}
Q->front->next=NULL;//空队列中的front指针指向NULL
return Q;
}
/*功能:数据入队
参数:Q:指向链式队列的指针
data:待入队的数据
返回值:0:入队成功
*/
int EnQueue_L(LinkQueuePtr Q,QElemType data)
{
QNodePtr p;//定义一个节点的指针变量
p=(QNodePtr)malloc(sizeof(QNode));//为节点申请内存
if(p==NULL)//判断申请内存是否成功
{
printf("there is no enough memory aviable\n");
exit(0);
}
p->data=data;//将数据加入节点
p->next=NULL;//新加入的节点在队尾,所以next 指向NULL
Q->rear->next=p;//使新的节点和原来的队尾相连
Q->rear=p;//尾指针指向队尾
return 0;
}
/*功能:数据出队
参数:Q:指向链式队列的指针
返回值: 出队的数据
*/
QElemType DeQueue_L(LinkQueuePtr Q)
{
QElemType x;
QNodePtr p;
if(Q->front==Q->rear)//检查队列是否为空队列
{
printf("the linkQueue is empty\n");
exit(0);
}
p=Q->front->next;//p指针队头(存储数据的第一个节点,这里的Q->front节点不存储数据)
x=p->data;//提取队头的数据
Q->front->next=p->next;//将头节点的next指针向后移动一个节点
if(Q->rear==p)Q->rear=Q->front;//若出队的节点为最后一个节点,要防止尾指针丢失
free(p);//释放队头的节点内存
return x;
}
/*功能:判断队列是否为空
参数:Q:指向链式队列的指针
返回值:0:队列不为空
1:队列为空
*/
int IsQueueEmpty_L(LinkQueuePtr Q)
{
if(Q->front==Q->rear)return 1;
else  return 0;
}
/*功能:销毁队列
参数:Q:指向链式队列的指针
返回值:0:销毁成功
*/
int DestroyQueueu_L(LinkQueuePtr Q)
{
QNodePtr p;
while(Q->front)
{
Q->rear=Q->front->next;//将尾指针指向第一个节点
p=Q->front;//p指向尾指针前面的那个节点
free(p);//释放该节点
Q->front=Q->rear;//将头指针移动到尾指针处
}
return 0;
}


实现的任务:先将1-10存入链式队列,在将队列的前五个元素出队,销毁余下的队列,并判断销毁的队列是否为空队列。

由此,写出主函数如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"queue.h"
int main(void)
{
/*链式队列的测试*/
LinkQueue *Q;
int i,result;
printf("创建链式队列\n");
Q=Creat_LinkQueue();
printf("入队数据如下\n");
for(i=1;i<=10;i++)
{
result=EnQueue_L(Q,i);
if(result==0)printf("%d\t",i);
}
printf("将前5个数据出队\n");
for(i=1;i<=5;i++)
{
result=DeQueue_L(Q);
printf("%d\t",result);
}
printf("\n");
printf("销毁队列\n");
result=DestroyQueueu_L(Q);
if(result==0)printf("销毁队列成功\n");
printf("判断队列是否为空\n");
result=IsQueueEmpty_L(Q);
if(result==1)printf("队列为空\n");

system("pause");
return 0;
}


在VS2010中的运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息