队列的动态链式存储实现代码分享
队列的动态链式存储实现代码分享
发布时间:2016-12-28 来源:查字典编辑
摘要:复制代码代码如下:#include#include#include#include#include"DynaLnkQueue.h"/*---...

复制代码 代码如下:

#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;

}

}

/*------------------------------------------------------------

操作目的:判断队列是否为空

初始条件:队列Q已存在

操作结果:若Q为空队列,则返回true,否则返回false

函数参数:

LinkQueue Q待判断的队列

返回值:

bool是否为空

------------------------------------------------------------*/

bool QueueEmpty(LinkQueue Q)

{

if(Q.front == Q.rear)

return true;

return false;

}

/*------------------------------------------------------------

操作目的:得到队列的长度

初始条件:队列Q已存在

操作结果:返回Q中数据元素的个数

函数参数:

LinkQueue Q队列Q

返回值:

int数据元素的个数

------------------------------------------------------------*/

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;

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类