队列的动态链式存储实现代码分享
#include<stdlib.h>
#include<malloc.h>
#include<memory.h>
#include<assert.h>
#include"DynaLnkQueue.h"
/*------------------------------------------------------------
操作目的: 初始化队列
初始条件: 无
操作结果: 构造一个空的队列
函数参数:
LinkQueue*Q 待初始化的队列
返回值:
bool 操作是否成功
------------------------------------------------------------*/
boolInitQueue(LinkQueue*Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
returnfalse;
Q->front->next=NULL;
returntrue;
}
/*------------------------------------------------------------
操作目的: 销毁队列
初始条件: 队列Q已存在
操作结果: 销毁队列Q
函数参数:
LinkQueue*Q 待销毁的队列
返回值:
无
------------------------------------------------------------*/
voidDestroyQueue(LinkQueue*Q)
{
while(Q->front)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
}
/*------------------------------------------------------------
操作目的: 判断队列是否为空
初始条件: 队列Q已存在
操作结果: 若Q为空队列,则返回true,否则返回false
函数参数:
LinkQueueQ 待判断的队列
返回值:
bool 是否为空
------------------------------------------------------------*/
boolQueueEmpty(LinkQueueQ)
{
if(Q.front==Q.rear)
returntrue;
returnfalse;
}
/*------------------------------------------------------------
操作目的: 得到队列的长度
初始条件: 队列Q已存在
操作结果: 返回Q中数据元素的个数
函数参数:
LinkQueueQ 队列Q
返回值:
int 数据元素的个数
------------------------------------------------------------*/
intQueueLength(LinkQueueQ)
{
ElemTypecount=0;
QueuePtrp=Q.front->next;
while(p->next!=NULL)
{
++count;
p=p->next;
}
returncount;
}
/*------------------------------------------------------------
操作目的: 得到队列首元素
初始条件: 队列Q已存在
操作结果: 用e返回队列首元素
函数参数:
LinkQueueQ 队列Q
ElemType*e 队列首元素的值
返回值:
bool 操作是否成功
------------------------------------------------------------*/
boolGetHead(LinkQueueQ,ElemType*e)
{
if(QueueEmpty(Q)==false)
{
e=&Q.front->next->data;
returntrue;
}
returnfalse;
}
/*------------------------------------------------------------
操作目的: 遍历队列
初始条件: 队列Q已存在
操作结果: 依次对Q的每个元素调用函数fp
函数参数:
LinkQueueQ 队列Q
void(*fp)() 访问每个数据元素的函数指针
返回值:
无
------------------------------------------------------------*/
voidQueueTraverse(LinkQueueQ,void(*fp)(ElemType))
{
QueuePtrp=Q.front->next;
while(p->next!=NULL)
{
visit(p->data);
p=p->next;
}
}
/*------------------------------------------------------------
操作目的: 清空队列
初始条件: 队列Q已存在
操作结果: 将队列清空
函数参数:
LinkQueue*Q 队列Q
返回值:
无
------------------------------------------------------------*/
voidClearQueue(LinkQueue*Q)
{
ElemTypex=0;
while(Q->front!=Q->rear)
{
DeQueue(Q,&x);
Q->front=Q->front->next;
}
}
/*------------------------------------------------------------
操作目的: 在队列末尾插入元素e
初始条件: 队列Q已存在
操作结果: 插入元素e作为队列新的尾结点
函数参数:
LinkQueue*Q 队列Q
ElemTypee 待插入的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
boolEnQueue(LinkQueue*Q,ElemTypee)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
returnfalse;
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
returntrue;
}
/*------------------------------------------------------------
操作目的: 删除链式队列的头结点
初始条件: 队列Q已存在
操作结果: 删除链式队列的头结点
函数参数:
LinkQueue*Q 队列Q
ElemType*e 被删除的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
boolDeQueue(LinkQueue*Q,ElemType*e)
{
QueuePtrp;
if(Q->front==Q->rear)
returnfalse;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
returntrue;
}
相关文章
- 队列(链式存储结构)
- C语言xml文件存储数据文件(一)
- 磁盘存储和文件系统管理
- 文件存储就要用文件柜,对象存储发老婆吗?
- composer browse 查看包的存储库和主页
- 【数据的存储】
- MySQL存储引擎
- MySQL存储过程的参数优化(mysql存储过程参数)
- Oracle 砍掉闪存存储部门,裁员至少 300 人 !
- 高性能Redis解决大数据量存储问题(redis大数据量存储)
- Linux——让你的信息存储更安全可靠(linux 为知笔记)
- MySQL:数据存储处理技术的利器(mysql 存储)
- C语言MySQL实现存储文件的功能(c mysql存储文件)
- APM技术提供MySQL数据库持久存储(Apm存储mysql)
- 商城采用Redis存储更多优惠卷(商城优惠卷放redis)
- 数据Redis一种可存储各种数据的解决方案(redis能存储哪些)
- 系统存储过程sp_MSforeachtable和sp_MSforeachdb使用说明