链队列它有两个指针操作,一个是队首指针,一个是队尾指针,节点删除移动队首指针,节点插入移动队尾指针,同时队列具有先进先出的特点。可用于模拟银行叫号系统
代码:
#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)
{
QNode *p;
double e;
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;
}
}
//输出队列元素
void Display(LinkQueue &Q)
{
QNode *p;
p = Q.front->next;
if (p == NULL)
{
cout << "队列为空!" << endl;
}
cout << "队列数据:" << endl;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
int main()
{
LinkQueue *Q;
Q = new LinkQueue;
InitQueue(*Q);
cout << "开始往链队列里输入数据,-1为结束符" << endl;
cout << "请输入数据:" << endl;
double a, x;
cin >> a;
while (a != -1)
{
EnQueue(*Q, a);
cin >> a;
}
//输出队列元素
Display(*Q);
while (!IsEmpty(*Q))
{
DeQueue(*Q);
}
//释放空间
delete Q->front;
delete Q;
return 0;
}