链队列定义:
1. 使用两个指针分别记录队头和队尾的当前位置
2. 设立一个头结点,并令头指针指向头结点,头结点的指针域指向队头元素所在的结点
3. 判空条件:头指针和尾指针均指向头结点
代码实现:
1.初始化链式队列:初始化头指针和尾指针指向头结点,令头结点的指针域为空
Status InitQueue(LinkQueue &q)
{
q.front = q.rear = (QueuePtr)malloc(sizeof(QNode));//初始化队头和队尾的指针指向头结点
if (!q.front)
exit(OVERFLOW);
q.front->next = NULL;//头结点的指针域为NULL
return OK;
}
2.向队尾添加元素: 创建一个新结点,数据域为所插元素,指针域为空,将队尾结点的指针指向新结点,(如果新结点为头结点,那么也相当于将头结点的指针域指向新结点),最后将指向队尾的指针指向新结点。
Status EnQueue(LinkQueue &q, ElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//创建新结点
if (!p)
exit(OVERFLOW);
p->data = e;//新结点数据为w
p->next = NULL;//下一个结点初始化为NULL
q.rear->next = p; //将队尾结点的指针指向新结点,如果新结点为第一个结点则q->rear->next相当于q->front->next,为头结点指针域赋值
q.rear = p;//将指向队尾的指针指向新结点
return OK;
}
3.队头元素出队:如果头尾指针指向相同,队列为空队。否则,取出头结点指针域所指队头结点的元素。头结点指针指向队头结点的指针域,生成新的队头结点。如果队中只有一个元素,元素出队后队尾指针指向头结点。
Status DeQueue(LinkQueue &q, ElemType &e)
{
if (q.rear == q.front)
return ERROR;
QueuePtr p = q.front->next;
if (q.front->next == q.rear)//如果队中只有一个元素,元素出队后队尾指针指向头结点
q.rear = q.front;
e = p->data;
q.front->next = p->next;
return OK;
}
4.清空,销毁队列
Status DestroyQueue(LinkQueue &q)
{
while (q.front)//头指针不空
{
q.rear = q.front->next;//尾指针指向头指针的指针域
free(q.front);//释放头指针空间
q.front = q.rear;//头指针指向尾指针
}
return OK;
}
void Clear(LinkQueue &q)
{
DestroyQueue(q);
InitQueue(q);
}
5.判断队列是否为空:头尾指针是否相同
Status QueueEmpty(LinkQueue q)
{
return q.front == q.rear;
}
6.队列元素个数统计:从队头结点开始计算,一直到队尾结点
int QueueLength(LinkQueue q)
{
int count = 0;
for (QueuePtr p = q.front; p != q.rear; p = p->next)
count++;
return count;
}
7.取出队头元素:若队列不空,则返回头结点所指队头结点的数据域
Status GetTop(LinkQueue q, ElemType &e)
{
if (q.front == q.rear)
return ERROR;
e = q.front->next->data;
return OK;
}
8.遍历队列元素:从队头元素开始,到队尾结束
Status QueueTraverse(LinkQueue q)
{
if (q.front == q.rear)
return ERROR;
QueuePtr p = q.front->next;
for (; p != q.rear; p = p->next)
cout << p->data<<" ";
cout << p->data ;
return OK;
}
main.cpp:
#include"LinkQueue.h"
ElemType e;
int main()
{
LinkQueue q;
if (InitQueue(q))
cout << "链队列初始化完成" << endl;
if (QueueEmpty(q))
cout << "队列为空" << endl;
else
cout << "队列中元素共"<<QueueLength(q) <<"个"<< endl;
for (int i = 0; i < 5; i++)
{
cin >> e;
EnQueue(q, e);
}
if (QueueEmpty(q))
cout << "队列为空" << endl;
else
cout << "队列中元素共" << QueueLength(q) << "个" << endl;
QueueTraverse(q);
cout << endl;
DeQueue(q, e);
cout << "取出队头元素" << e << endl;
GetTop(q, e);
cout << "队列的队头元素为" << e << endl;
Clear(q);
if (QueueEmpty(q))
cout << "队列为空" << endl;
else
cout << "队列中元素共" << QueueLength(q) << "个" << endl;
if (DestroyQueue(q))
cout << "队列已被销毁" << endl;
system("pause");
return 0;
}
控制台输出结果: