目录
1.队列的链式存储结构
#include <iostream>
using namespace std;
#define QElemType int
#define Status int
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
2.链队的初始化
Status InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//生产新结点作为头结点,队头和队尾指针指向此结点
if (!Q.front)
exit(_OVERFLOW);
Q.front->next = NULL;//头结点的指针域置空
return 1;
}
3.链队的入队
Status EnQueue(LinkQueue& Q, QElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//为入队元素分配节点空间,用指针p指向
if (!p)
exit(_OVERFLOW);
p->data = e; //将新结点数据域置为e
p->next = NULL; //将新结点插入到队尾
Q.rear->next = p;
Q.rear = p; //修改队尾指针
return 1;
}
4.出队
Status DeQueue(LinkQueue& Q, QElemType& e)
{
QueuePtr p;
if (Q.front == Q.rear)
return 0;
p = Q.front->next; //p指向队头元素
e = p->data; //e保存队头元素的值
Q.front->next = p->next; //修改头结点的指针域
if (Q.rear == p) //最后一个元素被删,队尾指针指向头结点
Q.rear = Q.front;
free(p); //释放原队头元素的空间
return 1;
}
5.取队头元素
Status GetHead(LinkQueue Q, QElemType& e)
{
QueuePtr p;
if (Q.front == Q.rear)
return 0;
p = Q.front->next; //返回队头元素,队头指针不变
e = p->data;
return 1;
}
6.销毁队列与清空队列
Status DestroyQueue(LinkQueue& Q)
{
while (Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return 1;
}
Status ClearQueue(LinkQueue& Q)
{
QueuePtr p, q;
Q.rear = Q.front;
p = Q.front->next;
Q.front->next = NULL;
while (p)
{
q = p;
p = p->next;
free(q);
}
return 1;
}
7.队列的判空
Status QueueEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return 1;
else
return 0;
}
8.求队列长度
int QueueLength(LinkQueue Q)
{
int i = 0;
QueuePtr p;
p = Q.front;
while (Q.rear != p)
{
i++;
p = p->next;
}
return i;
}
9.遍历队列
void visit(QElemType a)
{
cout << a << " ";
}
Status QueueTraverse(LinkQueue& Q, void (*visit)(QElemType))
{
QueuePtr p;
p = Q.front->next;
while (p)
{
visit(p->data);
p = p->next;
}
cout << endl;
return 1;
}