zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

存储队列队列代码 实现 分享 动态 链式
2023-06-13 09:15:18 时间

复制代码代码如下:


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