版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84572484
【定义】
链式队列通常用链表实现。在队列中分别需要一个指向队头和队尾的指针表示队头和队尾,这两个指针分别称为队头指针和队尾指针,不带头结点的链式队列和带头结点的链式队列分别如图所示。
对于带头结点的链式队列,当队列为空时,队头指针front和队尾指针rear都指向头结点,如图所示。
【循环队列】
收尾相连的链式队列就构成了链式循环队列。在链式循环队列中,可以只设置队尾指针,而无须设置队头指针,一个只设置队尾指针的链式循环队列如图所示。
当队列为空时,队列LQ为空的判断条件为LQ.rear->next=LQ.rear,如图所示。
【存储结构】
typedef struct QNode
{
DataType data;
struct QNode* next;
}LQNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
【基本运算】
(1)初始化链式队列
void InitQueue(LinkQueue *LQ)
{
LQ->front = LQ->rear = (LQNode*)malloc(sizeof(LQNode));
if (LQ->front==NULL)
{
exit(-1);
}
LQ->front->next = NULL;
}
(2)判断链式队列是否为空
int QueueEmpty(LinkQueue LQ)
{
if (LQ.rear->next==NULL)
{
return 1;
}
else
{
return 0;
}
}
(3)将元素e入队,在链式队列中插入元素时,只需要移动队尾指针;删除元素时,只需要移动队头指针。例如,在链式队列中插入a、b、c的指针变化如图。
插入元素a
插入元素b,c
在链式队列中插入元素e,先让队列中的最后一个结点的指针域指向待插入的结点,然后队尾指针指向该结点,如图所示。
//将元素e入队
int EnQueue(LinkQueue *LQ, DataType e)
{
LQNode *s;
s = (LQNode*)malloc(sizeof(LQNode));
if (!s)
{
exit(-1);
}
s->data = e;
s->next = NULL;
LQ->rear->next = s;
LQ->rear = s;
return 1;
}
(4)将队头元素出队,即删除链式队列中的队头元素。删除队头元素结点的指针变化情况如图。
int DeQueue(LinkQueue *LQ, DataType *e)
{
LQNode *s;
if (LQ->front==LQ->rear)
{
return 0;
}
else
{
s = LQ->front->next;
*e = s->data;
LQ->front->next = s->next;
if (LQ->rear==s)
{
LQ->rear = LQ->front;
}
free(s);
return 1;
}
}
(5)取队头元素。
int GetHead(LinkQueue LQ, DataType *e)
{
LQNode *s;
if (LQ.front==LQ.rear)
{
return 0;
}
else
{
s = LQ.front->next;
*e = s->data;
return 1;
}
}
(6)清空链式队列
void ClearQueue(LinkQueue *LQ)
{
while (LQ->front!=NULL)
{
LQ->rear = LQ->front->next;
free(LQ->front);
LQ->front = LQ->rear;
}
}