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

复制代码 代码如下:

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

时间: 2024-09-20 01:14:40

队列的动态链式存储实现代码分享_C 语言的相关文章

C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言

队列类链式存储 代码: linkqueue.hpp  // 队列类 #pragma once #include "linklist.hpp" template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: int clear(); int append(T &t); int retieve(T &t); int header(T &t); int l

C语言实现的猜拳游戏代码分享_C 语言

这是一个简单的猜拳游戏(剪子包子锤),让你与电脑对决.你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负. 下面的代码会实现一个猜拳游戏,让你与电脑对决.你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负. 启动程序后,让用户出拳,截图: 用户出拳,显示对决结果:截图: 代码实现: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { char gamer; // 玩家出拳 int

C++文件读写代码分享_C 语言

编写一个程序,统计data.txt文件的行数,并将所有行前加上行号后写到data1.txt文件中. 算法提示: 行与行之间以回车符分隔,而getline()函数以回车符作为终止符.因此,可以采用getline()函数读取每一行,再用一个变量i计算行数. (1)实现源代码 #include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std

C语言进制转换代码分享_C 语言

代码很简单,功能也很简单,这里就不多废话了 #include<stdio.h> int main() { char ku[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int zh[32],i=0,w,j; long int b,y; printf("请输入一个十进制数,我能帮您把它转换成2~16任意进制数:\n"); scanf("%d",&y);

C语言完美实现动态数组代码分享_C 语言

我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量. 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. 请实现一个简单的动态数组,能够随时改变大小,不会溢出,也不会浪费内存空间. 下面的代码实现了简单的动态数组: #include <stdio.h> #include <stdlib.h> int main() { //从控制台获取初始数组大小 int N; int *a; int i; printf("Input ar

C语言统计字符个数代码分享_C 语言

C语言实现统计字符个数 #include<stdio.h> int main() { int sz[10]={0},zm[26]={0},z[26]={0},i,space=0,e=0,t=0; char c; printf("请输入一段字符,统计其中各字符的数量\n"); while((c=getchar())!='\n') { if(c<='z'&&c>='a') zm[c-'a']++; else if(c<='Z'&&

一个快速排序算法代码分享_C 语言

复制代码 代码如下: /* * quickSort.c * *  Created on: 2012-4-9 *      Author: LW */#include <stdio.h>#include <string.h> typedef struct _student{ int id; char name[30];}student,*pStudent; student students[20] ={ {13,"狐狸金"},{15,"杜十娘"

C语言实现的统计素数并求和代码分享_C 语言

题目来源于PAT平台,此题又是费了一番脑子.题目要求输出给定区间内的素数个数并对他们求和.具体思路是利用循环判断素数,将结果传递给控制变量,由控制变量再来判断是否执行自增以及求和.当然这里必须要注意1既不是素数也不是合数. 下面是代码: 复制代码 代码如下: #include <stdio.h> int main () {  int a=0,b=0;  int n=0,sum=0;  int x=0,i=0;  scanf("%d %d",&a,&b);  

怎么锁定鼠标的示例代码分享_C 语言

复制代码 代码如下: #include #include int main(int argc, char* argv[]){printf("\n别害怕15妙后你的鼠标就可以使用了^_^\n");RECT rect;rect.bottom=1;rect.right=1;ClipCursor(&rect);::Sleep(15000);ClipCursor(NULL);//释放return 0;}