链式队列的C++实现


链式队列的C++实现

一、数据结构

[plain]  view plain  copy
  1. struct QNode    //定义队列结点的数据结构  
  2. {  
  3.     QNode *next; //指针域,指向下一个结点  
  4.     double data;    //数据域,存储队列信息  
  5. };  
  6.   
  7. struct LinkQueue    //定义队列的数据结构  
  8. {  
  9.     QNode *front;      //队首指针,指向QNode类型的指针  
  10.     QNode *rear;       //队尾指针  
  11. };  

[cpp]  view plain  copy
  1. void InitQueue(LinkQueue &Q)     //构造一个空的队列  
  2. int IsEmpty(LinkQueue &Q)    //判断队列是否为空  
  3. void EnQueue(LinkQueue &Q,double e)     //从队列尾部插入一个结点  
  4. void DeQueue(LinkQueue &Q, double &e)   //从队列首部删除一个结点  
  5. void DestoryQueue(LinkQueue &Q)       //销毁一个队列  

二、完整代码

[cpp]  view plain  copy
  1. #include "stdafx.h"  
  2.   
  3. #include <iostream>  
  4. #include <cstdlib>  
  5. using namespace std;  
  6.   
  7. struct QNode    //定义队列结点的数据结构  
  8. {  
  9.     QNode *next; //指针域,指向下一个结点  
  10.     double data;    //数据域,存储队列信息  
  11. };  
  12.   
  13. struct LinkQueue    //定义队列的数据结构  
  14. {  
  15.     QNode *front;      //队首指针,指向QNode类型的指针  
  16.     QNode *rear;       //队尾指针  
  17. };  
  18.   
  19. void InitQueue(LinkQueue &Q)     //构造一个空的队列  
  20. {  
  21.     QNode *q;  
  22.     q = new QNode;    //申请一个结点的空间  
  23.     q->next = NULL;   //当作头结点  
  24.     //队首与队尾指针都指向这个结点,指针域为NULL  
  25.     Q.front = q;  
  26.     Q.rear = q;  
  27. }  
  28.   
  29. int IsEmpty(LinkQueue &Q)    //判断队列是否为空  
  30. {  
  31.     if (Q.rear == Q.front)  
  32.         return 0;  
  33.     else  
  34.         return 1;  
  35. }  
  36.   
  37. void EnQueue(LinkQueue &Q,double e)     //从队列尾部插入元素  
  38. {  
  39.     QNode *p;    //新创建一个结点  
  40.     p = new QNode;  
  41.     p->next = NULL;  
  42.     p->data = e;  //输入数据信息  
  43.     //将新结点插入队列尾部  
  44.     Q.rear->next = p;       
  45.     Q.rear = p;       //设置新的尾结点  
  46. }  
  47.   
  48. void DeQueue(LinkQueue &Q, double &e)   //从队列首部删除一个结点  
  49. {  
  50.     QNode *p;  
  51.     p = Q.front->next;  
  52.     e = p->data;    //保存要出队列的数据  
  53.     Q.front->next = p->next;       //将下一个结点当作头结点后面链接的第一个结点  
  54.     if (Q.rear == p)    //如果要删除的元素即为尾结点,则将头指针赋予尾指针,一同指向头结点,表示队列为空  
  55.         Q.rear = Q.front;  
  56.     delete p;  
  57. }  
  58.   
  59. void DestoryQueue(LinkQueue &Q)       //销毁一个队列  
  60. {  
  61.     while (Q.front)  
  62.     {  
  63.         Q.rear = Q.front;    //从头节点开始,一个一个删除队列结点,释放空间  
  64.         delete Q.front;  
  65.         Q.front = Q.rear;  
  66.     }  
  67. }  
  68. int _tmain(int argc, _TCHAR* argv[])  
  69. {  
  70.     LinkQueue *Q;  //定义一个队列Q  
  71.     Q = new LinkQueue;    
  72.     InitQueue(*Q);  
  73.     cout << "开始往队列里输入数据,以-1作为结束符" << endl;  
  74.     cout << "请输入一个数:" << endl;  
  75.     double a, x;  
  76.     cin >> a;  
  77.     while (a != -1)  
  78.     {  
  79.         EnQueue(*Q, a);  
  80.         cout << "请输入一个数:" << endl;  
  81.         cin >> a;  
  82.     }  
  83.     //输出队列元素,队首->队尾  
  84.         QNode *p;  
  85.         p = Q->front->next;  
  86.         if (p == NULL)     //如果为空表,直接退出  
  87.         {  
  88.             cout << "队列为空!" << endl;  
  89.             return 0;  
  90.         }  
  91.         cout << "队列数据依次为:" << endl;  
  92.         while (p!=NULL)  
  93.         {  
  94.             cout << p->data << " ";  
  95.             p = p->next;  
  96.         }  
  97.         cout << endl;  
  98.     //删除队列元素  
  99.     while (!IsEmpty(*Q))  
  100.     {  
  101.         DeQueue(*Q, x);  
  102.         cout << x << " ";  
  103.     }  
  104.     //释放内存空间  
  105.     delete Q->front;  
  106.     delete Q;  
  107.     return 0;  
  108. }  

三、实验截图


五、总结

       之所以写的这么详细,我是因为深受网络之苦,在老师心中我的智商还蛮高的,但每次自己上网求助,看一些别人写博客时,特别郁闷与无力,有的基本没注释,有的有注释,但太敷衍塞责,有的思路太混乱,自己都没搞清楚,就写出来害人,看着看着就没兴趣了,完全不是给人看的,相信除了作者,没人能够看懂。所以,我本着良心,既然发了博客,就坚持写的能够让绝大部分人看懂,自己宁愿多花点 时间写注释,也不愿意网友看了我的博客而扫了兴致。通过这个算法,我对队列有了更好的认识,因为它要定义两个结构体,一般单链表就一个结构体,所以,我刚开始花了些时间才明白为什么,让后自己一个一个函数去实现功能,最后经过main测试,得到最后的想要的结果。我相信实践是最能提升编程水平的,大家自己私下一定要好好思考问题,实在不懂就可以问,查,但最后,自己一定要自己实现一遍,不然忘的会很快。。。后面还会陆续更新严蔚敏的数据结构(c语言版)的各种算法实现,我也是现学现卖,希望各位朋友可以批评指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值