#include <iostream>
#include <string>
using namespace std;
typedef int EType; // 自定义链表的数据元素为整数。
//定义队列顺序存储结构
struct QueueNode
{
EType data; //当前节点数据
QueueNode *next; //下一节点地址
};
typedef int HeadEType; // 自定义链表的数据元素为整数。
//定义队列顺序存储结构
struct HeadNode
{
HeadEType Hdata; //当前节点数据
QueueNode* front; //第一个节点地址
QueueNode* real; //最后一个节点地址
};
typedef HeadNode* ChainQueue;
//构造空队列算法
void CreatQueue(ChainQueue& Q) {
Q = new HeadNode;//新建一个表头结构
Q->front = NULL;
Q->real = NULL;
}
//判断队列是否为空
bool IsEmpty(ChainQueue& Q) {
if (!(Q->front)) return true;
return false;
}
//返回队头元素的值
bool GetFront(ChainQueue& Q, EType& result) {
//将font后面一个位置的队列元素的值取出
if (IsEmpty(Q)) return false;
QueueNode* p = Q->front;
result = p->data;
return true;
}
//进队运算
//将一个新的的元素x存储到当前real所指空间的下一个位置
bool EnQueue(ChainQueue& Q, EType& x) {
QueueNode* q = new QueueNode;//新建一个队列节点
q->data = x;//存入x
q->next = NULL;//下一个节点为空
QueueNode* p;//新建一个队列节点
if (IsEmpty(Q))//如果队列为空,那么第一个节点就是q
Q->front = q;
else
{
p = Q->real;//p指向最后一个队列元素
p->next = q;//在最后一个队列元素后面加强q
}
Q->real = q;//新的队尾元素为q
return true;
}
//进队运算
//将front所指空间的元素取出,首先要判断队列是否为空
bool OutQueue(ChainQueue& Q, EType& result) {
if (IsEmpty(Q)) return false;
QueueNode* p=Q->front;//新建一个队列节点
result = p->data;//取出元素
Q->front = p->next;//将队首指向下一个元素
if (!Q->front)//取出元素后,变成空表
Q->real = NULL;
delete p;
return true;
}
深入理解数据结构——队列链式存储
最新推荐文章于 2022-05-16 17:22:44 发布