队列的动态链式存储实现代码分享

时间:2021-05-19

复制代码 代码如下:
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaLnkQueue.h"

/*------------------------------------------------------------
操作目的:初始化队列
初始条件:无
操作结果:构造一个空的队列
函数参数:
LinkQueue *Q待初始化的队列
返回值:
bool操作是否成功
------------------------------------------------------------*/
bool InitQueue(LinkQueue *Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
return false;
Q->front->next = NULL;
return true;
}

/*------------------------------------------------------------
操作目的:销毁队列
初始条件:队列Q已存在
操作结果:销毁队列Q
函数参数:
LinkQueue *Q待销毁的队列
返回值:

------------------------------------------------------------*/
void DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}


bool QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
return true;
return false;
}


int QueueLength(LinkQueue Q)
{
ElemType count=0;
QueuePtr p = Q.front->next;
while(p->next != NULL)
{
++count;
p = p->next;
}
return count;
}

/*------------------------------------------------------------
操作目的:得到队列首元素
初始条件:队列Q已存在
操作结果:用e返回队列首元素
函数参数:
LinkQueue Q队列Q
ElemType *e队列首元素的值
返回值:
bool操作是否成功
------------------------------------------------------------*/
bool GetHead(LinkQueue Q, ElemType *e)
{
if(QueueEmpty(Q) == false)
{
e = &Q.front->next->data;
return true;
}
return false;
}

/*------------------------------------------------------------
操作目的:遍历队列
初始条件:队列Q已存在
操作结果:依次对Q的每个元素调用函数fp
函数参数:
LinkQueue Q队列Q
void (*fp)()访问每个数据元素的函数指针
返回值:

------------------------------------------------------------*/
void QueueTraverse(LinkQueue Q, void (*fp)(ElemType))
{
QueuePtr p = Q.front->next;
while(p->next != NULL)
{
visit(p->data);
p = p->next;
}
}

/*------------------------------------------------------------
操作目的:清空队列
初始条件:队列Q已存在
操作结果:将队列清空
函数参数:
LinkQueue *Q队列Q
返回值:

------------------------------------------------------------*/
void ClearQueue(LinkQueue *Q)
{
ElemType x=0;
while(Q->front != Q->rear)
{
DeQueue(Q,&x);
Q->front = Q->front->next;
}
}

/*------------------------------------------------------------
操作目的:在队列末尾插入元素e
初始条件:队列Q已存在
操作结果:插入元素e作为队列新的尾结点
函数参数:
LinkQueue *Q队列Q
ElemType e待插入的数据元素
返回值:
bool操作是否成功
------------------------------------------------------------*/
bool EnQueue(LinkQueue *Q, ElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return true;
}

/*------------------------------------------------------------
操作目的:删除链式队列的头结点
初始条件:队列Q已存在
操作结果:删除链式队列的头结点
函数参数:
LinkQueue *Q队列Q
ElemType *e被删除的数据元素
返回值:
bool操作是否成功
------------------------------------------------------------*/
bool DeQueue(LinkQueue *Q, ElemType *e)
{
QueuePtr p;
if(Q->front == Q->rear)
return false;
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
return true;
}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章