队列
队列的链式存储结构其实就是简单的链表,只是添加了队头和队尾指针。限制了添加和删除只能从队尾和队头操作。
代码实现
#include <iostream>
using namespace std;
// 结点
typedef struct QNode
{
int data;
struct QNode *next;
}QNode, *QueuePtr;
// 链表结构
typedef struct
{
QueuePtr front, rear; // 队头,队尾指针
}LinkQueue;
// 创建队列
void CreateQueue(LinkQueue *Q, int n)
{
QueuePtr q = new QNode(); // 创建头结点
Q->front = Q->rear = q; // 并令队头队尾指针指向头结点
QueuePtr p;
for (int i = 0; i < n; i++)
{
p = new QNode();
p->data = i;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
// EnQueue(&p, i);
}
}
// 队尾添加元素
void EnQueue(LinkQueue *Q, int data)
{
QueuePtr s = new QNode();
s->data = data;
s->next = NULL;
Q->rear->next = s; //将新节点入队
Q->rear = s; //队尾指向新结点
}
// 队头删除元素
void DeQueue(LinkQueue *Q, int *data)
{
QueuePtr p;
if (Q->front == Q->rear)
{
cout << "Queue is empty" << endl;
}
p = Q->front->next; // 获取删除节点
Q->front->next = p->next; // 连接新队列
*data = p->data;
if (Q->rear == p) // 如果队头是队尾,则将rear指向头结点
{
Q->rear = Q->front;
}
delete(p);
}
void PrintQueue(LinkQueue *Q)
{
QueuePtr p;
p = Q->front->next;
if (!p) cout << "Queue is empty" << endl;
while (p)
{
cout << p->data<<endl;
p = p->next;
}
}