• LinkQueue.h
  • DataType.h
  • DataType.cpp
  • LinkQueue.cpp
  • 测试结果

LinkQueue.h

#pragma once#include "DataType.h"//链式队列的结构定义typedef struct _Node
{DataType data;     //数据元素struct _Node* next; //链式队列中结点元素的指针
}Node,* NodePtr;typedef struct _Queue
{NodePtr front;     //队列头指针NodePtr rear;        //队列尾指针
}Queue;//链式队列的基本操作void InitQueue(Queue* Q);     //初始化
void DestroyQueue(Queue* Q);    //销毁
bool QueueEmpty(Queue Q);       //判空
int QueueLength(Queue Q);       //获得队列长度
bool GetHead(Queue Q, DataType* val); //获得队列头部元素
bool GetTail(Queue Q, DataType* val); //获得队列尾部元素
void QueueTraverse(Queue Q, void(*fp)(DataType)); //遍历队列
bool InsertQueue(Queue* Q, DataType e);  //入队列
bool OutQueue(Queue* Q, DataType *e);  //出队列

DataType.h

#pragma once
//DataType 的定义
typedef int DataType;
int compare(DataType x, DataType y);
void visit(DataType e);

DataType.cpp

#include "DataType.h"
#include <stdio.h>//DataType 的实现int compare(DataType x, DataType y)
{return (x - y);
}
void visit(DataType e)
{printf("%d\t", e);
}

LinkQueue.cpp

#include "LinkQueue.h"
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
/* ------------------------------------------------------------
操作目的:    初始化队列
初始条件:    无
操作结果:    构造一个空队列
函数参数:
Queue* Q    待初始化的队列
返回值:
void  无返回值
------------------------------------------------------------*/void InitQueue(Queue* Q)      //初始化
{Q->front = (NodePtr)malloc(sizeof(Node));if (!Q->front){printf("%d->%serror\n", __LINE__, __FILE__);exit(-1);}Q->rear = Q->front;Q->front->next = NULL;
}/* ------------------------------------------------------------
操作目的:    销毁队列
初始条件:    队列Q已存在
操作结果:    销毁队列Q
函数参数:
Queue* Q   待销毁的队列
返回值:
void  无返回值
------------------------------------------------------------*/
void DestroyQueue(Queue* Q) //销毁
{while (Q->front->next){Q->rear = Q->front->next;Q->front->next = Q->rear->next;free(Q->rear);}free(Q->front);Q->front = Q->rear = NULL;
}/* ------------------------------------------------------------
操作目的:    判断队列是否为空
初始条件:    队列Q存在,若队列为空返回true   否则返回 false
操作结果:
函数参数:
Queue* Q    待判断的队列
返回值:
bool        是否为空
------------------------------------------------------------*/
bool QueueEmpty(Queue Q)        //判空
{return Q.front == Q.rear ? true : false;
}/* ------------------------------------------------------------
操作目的:    得到队列的长度
初始条件:    队列Q已经存在
操作结果:    返回队列中元素的个数
函数参数:
Queue* Q    待求长度的队列
返回值:
void  无返回值
------------------------------------------------------------*/
int QueueLength(Queue Q)        //获得队列长度
{NodePtr tmp = Q.front->next;int Length = 0;while (tmp){Length++;tmp = tmp->next;}return Length;
}/* ------------------------------------------------------------
操作目的:    得到队列首元素
初始条件:    队列Q已存在
操作结果:    用e返回队列首元素
函数参数:Queue* Q    队列DataType* val 队列首元素的值
返回值:
void  无返回值
------------------------------------------------------------*/
bool GetHead(Queue Q, DataType* val) //获得队列头部元素
{if (Q.front == Q.rear)return false;*val = Q.front->next->data;return true;
}/* ------------------------------------------------------------
操作目的:    获得队列头部元素
初始条件:    队列存在且不为空
操作结果:    获得队列Q的头部元素
函数参数:
Queue* Q    待操作的队列
返回值:
bool   操作是否成功
------------------------------------------------------------*/
bool GetTail(Queue Q, DataType* val) //获得队列尾部元素
{if (Q.front == Q.rear)return false;*val = Q.rear->data;return true;
}/* ------------------------------------------------------------
操作目的:    遍历队列元素
初始条件:    队列存在且不为空
操作结果:    遍历队列Q的所有元素
函数参数:
Queue* Q    待遍历的队列
void(*fp)(DataType) 打印队列元素
返回值:
void  无返回值
------------------------------------------------------------*/
void QueueTraverse(Queue Q, void(*fp)(DataType)) //遍历队列
{while (Q.front != Q.rear){Q.front = Q.front->next;(*fp)(Q.front->data);}printf("\n");
}/* ------------------------------------------------------------
操作目的:    在队列尾部插入元素e
初始条件:    队列Q已存在
操作结果:    插入元素e作为队列新的尾结点
函数参数:
Queue* Q    待初始化的队列
DataType e  待插入的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool InsertQueue(Queue* Q, DataType e)  //入队列
{NodePtr tmp = (NodePtr)malloc(sizeof(Node));if (!tmp)return false;tmp->data = e;tmp->next = NULL;Q->rear->next = tmp;Q->rear = tmp;return true;
}/* ------------------------------------------------------------
操作目的:    删除队列的首元素结点
初始条件:    队列Q存在
操作结果:    删除Q队列的首元素结点
函数参数:
Queue* Q    待删除的队列
DataType* e 删除的队列元素
返回值:
bool   操作是否成功
------------------------------------------------------------*/
bool OutQueue(Queue* Q, DataType* e)  //出队列
{if (Q->front == Q->rear)return false;NodePtr tmp = Q->front->next;*e = tmp->data;Q->front->next = tmp->next;if (tmp == Q->rear)Q->rear = Q->front;free(tmp);return true;
}

测试结果

队列的链式存储和实现(C语言)【队列】(8)相关推荐

  1. 队列的链式存储结构及其实现_了解队列数据结构及其实现

    队列的链式存储结构及其实现 A queue is a collection of items whereby its operations work in a FIFO - First In Firs ...

  2. 队列的链式存储结构及实现

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和re ...

  3. 队列的链式存储实现(简单的入队和出队操作)

    /************************************************************************ * * 文件名:2.2.5.cpp * * 文件描述 ...

  4. 队列的链式存储结构(链队)

    链队 1.队列的链式存储结构 typedef struct QNode{ //结点结构QElemType data; //结点数据域struct QNode *next; //结点指针域 }QNode ...

  5. 队列,链队列,链式存储的队列

    采用链式存储的队列称为链队列(linked queue),队列是运算受限的线性表,即队列的插入和删除位置分别位于表的两端.故需要两个指针来指向这2个特殊位置,即对首指针和队尾指针. 本例采用的是带头结 ...

  6. Python数据结构与算法基础|第三期:代码实现——顺序存储队列与链式存储队列

    由于队列的动态由队头指针与队尾指针共同反映,所以我们在实现先入后出的同时还要实现队头元素与队尾元素的访问.对于普通的队列,我们使用列表实现其顺序存储,使用其它方法实现其链式存储. 顺序存储 由于我们使 ...

  7. Python数据结构与算法基础|第五期:代码实现——循环队列的链式存储结构

    在上一次,我们通过取余等数学方法实现了顺序存储的循环队列.由于我们使用的是Python内置的列表类型作为底层,实际上我们的存储空间并不是首尾相连的.下面,我们使用链式存储结构来实现一个真正首尾相连的循 ...

  8. 数据结构 3-2-1 队列的链式存储实现

    一.概念 队列也是一种受限的线性表,只允许一端插入另一段输出,就像其名字一样,队列具有先入先出的特点,这是由于其受限的特点所决定的.用链式结构实现队列,称为链队列,实际上是一个带有队头指针和队尾指针的 ...

  9. 线性表(链式存储结构)C语言

    文章目录 一.线性表的链式存储结构 二.代码 1.头文件与宏定义: 2.对链表的定义及主要使用函数: 3.测试函数(主函数): 三.运行结果 一.线性表的链式存储结构 线性表的链式存储结构的特点是用一 ...

  10. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

最新文章

  1. python nginx日志分析_Nginx日志分析及脚本编写
  2. SAP RETAIL初阶之商品主数据WM视图
  3. 如何用程序删除win 7下SYSTEM权限的目录
  4. Spring Aware接口
  5. [Snoi2017]炸弹
  6. L1-008 求整数段和(解题报告 C语言实现)(11行代码AC~!)
  7. JEEWX推出插件开发机制,现招募兴趣爱好者
  8. Android安全开发之ZIP文件目录遍历
  9. 用python导出pptx中每一页的标题
  10. centos5安装PHP5时遇到问题
  11. MVC学习笔记八:WebGrid控件的高级使用
  12. b站视频解析php,b站视频解析【调解流程】
  13. 乐于分享是一种境界的突破
  14. python django企业固定资产管理系统pycharm项目源码lw
  15. Test meeting 11.23
  16. AI自动修复图片网站
  17. 深度学习中的BN_CBN_CmBN
  18. 王晋康 - 替天行道 ▪ 王晋康科幻小说精选集2(2014年3月27日)
  19. 使用Minitab热图可视化的五种热门方法
  20. 【沃顿商学院学习笔记】领导力——Leadership:01目标驱动领导力 Purpose-Driven Leadership

热门文章

  1. 面向对象程序设计(Java)
  2. CTF C#逆向Reverse
  3. 当“天天酷跑”遇上“Python程序员” 另类演绎团战新玩法(学到了学到了~)
  4. 如何搭建MGRE——实验
  5. 【网络安全】记一次接口加密测试
  6. 如何使用lazyCSRF在Burp Suite上生成强大的CSRF PoC
  7. 【网络安全】SQL注入bypass最新版安全狗
  8. C语言读入文件全部内容的方法
  9. 7.Windows线程切换_时钟中断切换
  10. 【PHP】关于IPv4、IPv6 的操作函数