链队列--队列的链式表示和实现
2015-12-09 15:23
330 查看
和栈一样,队列也是操作受限的线性表,只允许在队尾插入元素,在队头删除元素。对于链队列结构,为了便于插入元素,设立了队尾指针。这样,插入元素的操作与队列长度无关。
(1)
单链队列的节点的类型:
struct QNode
{
int data;
QNode *next;//指向QNode类型的next指针
};
(2)
LinkQueue类型:
struct LinkQueue
{
QueuePtr front,rear;
};
具有2个节点的单链队列的示例:
(3)空队列和销毁后的队列
销毁后的队列 空队列
(4)入队列:
(5)出队列:
(6)程序的运行结果:
//链队列--队列的链式表示和实现 #include<stdio.h> #include<malloc.h> #include<process.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 typedef int Status; #define OVERFLOW -2 #define OK 1 //队列的链式存储结构 struct QNode { int data; QNode *next;//指向QNode类型的next指针 }; typedef QNode* QueuePtr; struct LinkQueue { QueuePtr front,rear; }; //队列是操作受限的线性表,只允许在对头删除元素,在队尾插入元素 //构造一个空的队列 void InitQueue(LinkQueue &Q) { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; } //销毁队列Q void DestroyQueue(LinkQueue &Q)//&Q 引用 { while(Q.front) { Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } } //若Q为空队列,返回TRUE Status QueueEmpty(LinkQueue Q) { if(Q.front->next == NULL) return TRUE; else return FALSE; } //求队列的长度(该队列带有头结点) int QueueLength(LinkQueue Q) { int i=0; QNode *p; p=Q.front; while(p != Q.rear) { i++; p=p->next; } return i; } //为了插入元素设立了队尾指针,这样插入元素的操作就与队列的长度无关 //插入元素e为新的队尾元素(入队列) void EnQueue(LinkQueue &Q,int e) { QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e; p->next=NULL; Q.rear->next=p;//讲结点链入队列中 Q.rear=p;//队尾指针指向队尾元素 } //如果队列不空,删除Q的队头元素,用e返回其值,并返回OK(出队列) Status DeQueue(LinkQueue &Q,int &e) { QueuePtr p; if(Q.front == Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear == p) Q.rear=Q.front; free(p); return OK; } //从队列的头到队列的尾依次打印队列中的元素 void PrintQueue(LinkQueue Q) { QNode *p; p=Q.front->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } //主函数 void main() { int i,e; LinkQueue q; InitQueue(q); EnQueue(q,-5); EnQueue(q,5); EnQueue(q,10); printf("是否为空队列%d(1:是,0:否)\n",QueueEmpty(q)); printf("队列中的元素个数为 %d\n",QueueLength(q)); printf("打印队列:q="); PrintQueue(q); i=DeQueue(q,e); if(i) printf("出队列一个元素为:%d",e); else printf("出队列失败!"); printf("\n"); printf("队列中的元素个数为 %d\n",QueueLength(q)); }
(1)
单链队列的节点的类型:
struct QNode
{
int data;
QNode *next;//指向QNode类型的next指针
};
(2)
LinkQueue类型:
struct LinkQueue
{
QueuePtr front,rear;
};
具有2个节点的单链队列的示例:
(3)空队列和销毁后的队列
销毁后的队列 空队列
(4)入队列:
(5)出队列:
(6)程序的运行结果:
相关文章推荐
- STM32之CAN---错误管理分析
- raknet for unity3d手机版的编译方法
- 夺命雷公狗---Smarty NO:02 几个常用属性
- 夺命雷公狗---Smarty NO:01 环境的安装和部署
- CodeForces 15C Industiral Nim Nim游戏
- 解决OpenStack创建实例不超过10个
- UI -知识点回顾 三
- 【Oracle】--PL/SQL导入Oracle sql脚本"傻瓜教程"
- 被牺牲的小虾米
- 1010. 一元多项式求导 (25)
- Toast自定义及源码解析
- Bug2---mfc中错误2039:“GetCheck”: 不是“CWnd”的成员
- UVa 10529 - Dumb Bones
- Debian 的 preinst, postinst, prerm, 和 postrm 脚本
- Chrome开发者工具不完全指南(五、移动篇)
- Chrome开发者工具不完全指南(四、性能进阶篇)
- Android Studio 下使用NDK
- Pch文件预编译
- Backbone学习笔记 - View篇
- 1009. 说反话 (20)