链式队列的C++实现
一、数据结构
struct QNode //定义队列结点的数据结构 { QNode *next; //指针域,指向下一个结点 double data; //数据域,存储队列信息 }; struct LinkQueue //定义队列的数据结构 { QNode *front; //队首指针,指向QNode类型的指针 QNode *rear; //队尾指针 };
void InitQueue(LinkQueue &Q) //构造一个空的队列 int IsEmpty(LinkQueue &Q) //判断队列是否为空 void EnQueue(LinkQueue &Q,double e) //从队列尾部插入一个结点 void DeQueue(LinkQueue &Q, double &e) //从队列首部删除一个结点 void DestoryQueue(LinkQueue &Q) //销毁一个队列
二、完整代码
#include "stdafx.h" #include <iostream> #include <cstdlib> using namespace std; struct QNode //定义队列结点的数据结构 { QNode *next; //指针域,指向下一个结点 double data; //数据域,存储队列信息 }; struct LinkQueue //定义队列的数据结构 { QNode *front; //队首指针,指向QNode类型的指针 QNode *rear; //队尾指针 }; void InitQueue(LinkQueue &Q) //构造一个空的队列 { QNode *q; q = new QNode; //申请一个结点的空间 q->next = NULL; //当作头结点 //队首与队尾指针都指向这个结点,指针域为NULL Q.front = q; Q.rear = q; } int IsEmpty(LinkQueue &Q) //判断队列是否为空 { if (Q.rear == Q.front) return 0; else return 1; } void EnQueue(LinkQueue &Q,double e) //从队列尾部插入元素 { QNode *p; //新创建一个结点 p = new QNode; p->next = NULL; p->data = e; //输入数据信息 //将新结点插入队列尾部 Q.rear->next = p; Q.rear = p; //设置新的尾结点 } void DeQueue(LinkQueue &Q, double &e) //从队列首部删除一个结点 { QNode *p; p = Q.front->next; e = p->data; //保存要出队列的数据 Q.front->next = p->next; //将下一个结点当作头结点后面链接的第一个结点 if (Q.rear == p) //如果要删除的元素即为尾结点,则将头指针赋予尾指针,一同指向头结点,表示队列为空 Q.rear = Q.front; delete p; } void DestoryQueue(LinkQueue &Q) //销毁一个队列 { while (Q.front) { Q.rear = Q.front; //从头节点开始,一个一个删除队列结点,释放空间 delete Q.front; Q.front = Q.rear; } } int _tmain(int argc, _TCHAR* argv[]) { LinkQueue *Q; //定义一个队列Q Q = new LinkQueue; InitQueue(*Q); cout << "开始往队列里输入数据,以-1作为结束符" << endl; cout << "请输入一个数:" << endl; double a, x; cin >> a; while (a != -1) { EnQueue(*Q, a); cout << "请输入一个数:" << endl; cin >> a; } //输出队列元素,队首->队尾 QNode *p; p = Q->front->next; if (p == NULL) //如果为空表,直接退出 { cout << "队列为空!" << endl; return 0; } cout << "队列数据依次为:" << endl; while (p!=NULL) { cout << p->data << " "; p = p->next; } cout << endl; //删除队列元素 while (!IsEmpty(*Q)) { DeQueue(*Q, x); cout << x << " "; } //释放内存空间 delete Q->front; delete Q; return 0; }
五、总结
之所以写的这么详细,我是因为深受网络之苦,在老师心中我的智商还蛮高的,但每次自己上网求助,看一些别人写博客时,特别郁闷与无力,有的基本没注释,有的有注释,但太敷衍塞责,有的思路太混乱,自己都没搞清楚,就写出来害人,看着看着就没兴趣了,完全不是给人看的,相信除了作者,没人能够看懂。所以,我本着良心,既然发了博客,就坚持写的能够让绝大部分人看懂,自己宁愿多花点 时间写注释,也不愿意网友看了我的博客而扫了兴致。通过这个算法,我对队列有了更好的认识,因为它要定义两个结构体,一般单链表就一个结构体,所以,我刚开始花了些时间才明白为什么,让后自己一个一个函数去实现功能,最后经过main测试,得到最后的想要的结果。我相信实践是最能提升编程水平的,大家自己私下一定要好好思考问题,实在不懂就可以问,查,但最后,自己一定要自己实现一遍,不然忘的会很快。。。后面还会陆续更新严蔚敏的数据结构(c语言版)的各种算法实现,我也是现学现卖,希望各位朋友可以批评指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lfeng_coding/article/details/47614765