链式队列
2017-01-17 22:01
99 查看
链式队列具有内存动态分配,内存利用率高的特点,在一些无法预先估计所需队列大小的场合使用链式队列是一个十分好的选择。下面是我最近学习链式队列的代码。注意这里的头结点不存储数据。
首先,要实现链式队列,首先要构造相应的数据结构,这里考虑使用两个指针分别指向队列的队头和队尾,队列使用单链表实现。代码如下:
接下来写出链式队列的基本函数
实现的任务:先将1-10存入链式队列,在将队列的前五个元素出队,销毁余下的队列,并判断销毁的队列是否为空队列。
由此,写出主函数如下:
在VS2010中的运行结果:
首先,要实现链式队列,首先要构造相应的数据结构,这里考虑使用两个指针分别指向队列的队头和队尾,队列使用单链表实现。代码如下:
#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中的运行结果:
相关文章推荐
- 链式队列
- 数据结构 一 (栈 & 循环队列 & 链式队列)
- 队列的链式存储的实现及操作
- 队列的链式实现源码
- 链式队列基本功能的简单实现
- 【郝斌数据结构自学笔记】35-46_队列的定义、分类_链式队列伪算法的讲解_循环队列伪算法的讲解
- java自己实现的链式队列
- 数据结构之java实现链式队列(三)
- 数据结构与算法-----队列-使用链表(链式结构)实现
- 链式存储队列
- 3-7-队列的链式存储-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
- 队列的链式结构实现
- 链式队列
- 再回首,数据结构——链式队列上的常见操作
- Java队列(链式实现)
- 链式队列
- 20.链式队列
- 实现链式队列
- 有序链式队列
- C++实现队列之链式存储结构