30-链式队列的基本操作
Posted songly_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了30-链式队列的基本操作相关的知识,希望对你有一定的参考价值。
1. 链式队列
链式队列的本质其实是一个存储队列元素的单链表,只不过在这个单链表中又维护了两个分别指向队头和队尾的节点指针,实现了队列的功能。
2. 链式队列的存储结构
既然链式队列本质是单链表,那么可以根据单链表和队列的特性来定义链式队列的存储结构,比如链表的节点有一个数据域用于存储数据,还有一样指针指向下一个节点,而队列中有一个队首和一个队尾,链式队列的存储结构如下:
//队列节点
typedef struct qnode
ElemType data; //数据域
struct qnode *next; //指针域
QNode;
//链式队列
typedef struct
QNode *front; //队首指针
QNode *rear; //队尾指针
LiQueue;
链式队列的四要素:
1. 队空条件就是队首和队尾的指向都为NULL,此时队列中没有节点
2. 队满条件不考虑,因为对链式队列来说不存在队满的情况
3.入队操作:将包含e的节点插入到单链表表尾
4. 出队操作:删除单链表中首个数据节点
3. 链式队列的基本操作
1.初始化队列InitQueue(q)
创建一个空队列,即只创建一个链队头节点,其front和rear指针初始化为NULL
void InitQueue(LiQueue *&q)
q=(LiQueue *)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
2.销毁队列DestroyQueue(q)
释放队列占用的存储空间,包括链队头节点和所有数据节点的存储空间,p记录要删除的节点,r记录下一个节点,当删除p节点后,p移动到r的位置,r移动到下一个节点。
void DestroyQueue(LiQueue *&q)
QNode *p=q->front,*r;
if (p!=NULL)
r=p->next;
while (r!=NULL)
free(p);
p=r;
r=p->next;
free(p);
free(q);
3.判断队列是否为空QueueEmpty(q)
若链队节点的rear域值为NULL,表示队列为空,返回true;否则返回false
bool QueueEmpty(LiQueue *q)
return(q->rear==NULL);
4.入队enQueue(q,e)
1 . 在入队新节点时,先判断队列是否为空
2 . 如果为空,则将链式队列的front和rear都指向新的节点
3 . 如果不为空,让尾节点c的next指向新节点,并让队列的rear指向新节点
void enQueue(LiQueue *&q,ElemType e)
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if (q->rear==NULL)
q->front=q->rear=p;
else
q->rear->next=p;
q->rear=p;
5.出队deQueue(q,e)
1 . 在进行出队操作时,先判断队列是否为空
2 . 如果不为空,则判断队列中是否只有一个节点
3 . 如果队列中只有一个节点,那么将队列的front和rear置为NULL,此时队列为空
4 . 队列中有多个节点,那么将队列的front指向下一个节点。
bool deQueue(LiQueue *&q,ElemType &e)
QNode *t;
if (q->rear==NULL)
return false;
t=q->front;
if (q->front==q->rear)
q->front=q->rear=NULL;
else
q->front=q->front->next;
e=t->data;
free(t);
return true;
以上是关于30-链式队列的基本操作的主要内容,如果未能解决你的问题,请参考以下文章