链式队列的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