//    队列的单链表实现
// 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方
// 首节点:头节点后第一个节点,存放数据 #include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elementype; // 定义数据类型
// 定义节点结构
typedef struct Node {
Elementype Element; // 数据域
struct Node * Next;
}NODE, *PNODE; // 定义队列结构体
typedef struct QNode {
PNODE Front, Rear; // 队列头,尾指针
} Queue, *PQueue; // 声明函数体
void InitQueue(PQueue); // 创建队列函数
bool IsEmptyQueue(PQueue); // 判断队列是否为空函数
void InsertQueue(PQueue, int val); // 入队函数
void DeleteQueue(PQueue,int * val); // 出队函数
void DestroyQueue(PQueue); // 摧毁队列函数
void TraverseQueue(PQueue); // 遍历队列函数
void ClearQueue(PQueue); // 清空队列函数
int LengthQueue(PQueue); // 求队列长度函数 // 主函数
int main() {
int val = ; // 定义临时变量
Queue queue; // 创建队列变量
InitQueue(&queue); // 调用初始化队列函数
IsEmptyQueue(&queue); // 调用判断队列是否为空函数
InsertQueue(&queue, ); //调用入队函数
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
IsEmptyQueue(&queue);
TraverseQueue(&queue); // 调用队列遍历函数
DeleteQueue(&queue, &val); // 调用出队函数
TraverseQueue(&queue);
ClearQueue(&queue); // 调用清空队列函数
IsEmptyQueue(&queue);
DestroyQueue(&queue); // 调用摧毁队列函数 return ;
} // 定义队列初始化函数
void InitQueue(PQueue queue) {
queue->Front = queue->Rear = (PNODE)malloc(sizeof(NODE)); // 动态创建头节点,使队头,队尾指向该节点
//头节点相当于哨兵节点的作用,不存储数据(区别于首节点)
if (queue->Front == NULL) { // 判断内存是否分配成功
printf("创建队列,无法分配所需内存...");
exit(-);
}
queue->Front->Next = NULL; // 初始队列头节点指针指向为空
printf("创建队列成功...\n");
} // 定义判断队列是否为空函数
bool IsEmptyQueue(PQueue queue) {
if (queue->Front == queue->Rear) {
printf("队列为空...\n");
return true;
}
else {
//printf("队列不为空...\n");
return false;
} }
// 定义入队函数
// 从队列尾部插入数据val
void InsertQueue(PQueue queue,int val) {
PNODE P = (PNODE)malloc(sizeof(NODE)); // 创建一个新节点用于存放插入的元素
if (P == NULL) {
printf("内存分配失败,无法插入数据%d...", val);
exit(-);
}
P->Element = val; // 把要插入的数据放到节点数据域
P->Next = NULL; // 新节点指针指向为空
queue->Rear->Next = P; // 使上一个队列尾部的节点指针指向新建的节点
queue->Rear = P; // 更新队尾指针,使其指向队列最后的节点
printf("插入数据 %d 成功...\n", val);
} // 定义出队函数
// 从队列的首节点开始出队
// 若出队成功,用val返回其值
void DeleteQueue(PQueue queue,int* val) {
if (IsEmptyQueue(queue)) {
printf("队列已经空,无法出队...\n");
exit(-);
}
PNODE P= queue->Front->Next; // 临时指针
*val = P->Element; // 保存其值
queue->Front->Next = P->Next; // 更新头节点
if (queue->Rear==P)
queue->Rear = queue->Front;
free(P); // 释放头队列
P = NULL; // 防止产生野指针
printf("出栈成功,出栈值为 %d\n", *val);
}
// 定义队列遍历函数
void TraverseQueue(PQueue queue) { if (IsEmptyQueue(queue)) {
exit(-);
}
PNODE P = queue->Front->Next; //从队列首节点开始遍历(非头节点,注意区分)
printf("遍历队列结果为:");
while (P != NULL) {
printf("%d ", P->Element);
P = P->Next;
}
printf("\n");
}
// 定义队列的摧毁函数
// 删除整个队列,包括头节点
void DestroyQueue(PQueue queue) {
//从头节点开始删除
while (queue->Front != NULL) {
queue->Rear = queue->Front->Next;
free(queue->Front);
queue->Front = queue->Rear;
}
printf("摧毁队列成功...\n");
}
// 定义清空队列函数
void ClearQueue(PQueue queue) {
PNODE P = queue->Front->Next; // 临时指针
PNODE Q = NULL; // 临时指针
queue->Rear = queue->Front; // 使队尾指针指向头节点
queue->Front->Next = NULL;
// 从首节点开始清空
while (P != NULL) {
Q = P;
P = P->Next;
free(Q);
}
printf("清空队列成功...\n"); }

运行结果

C语言描述队列的实现及操作(链表实现)的更多相关文章

  1. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  2. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  3. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  4. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  5. C语言描述栈的实现及操作(数组实现)

    一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...

  6. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  7. 【数据结构】之队列(C语言描述)

    队列(Queue)是编程中最常用的数据结构之一. 队列的特点是“先进先出”,就像食堂排队买饭一样,先来的人排在前面,后来的人排在后面:前面的人先买饭,买完饭后离开这个队列.这就是队列的原理,它可以进行 ...

  8. 数据结构(java语言描述)

    概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...

  9. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

随机推荐

  1. Google最新的图片格式WEBP全面解析

    前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值 ...

  2. PHP常见错误

    1.关于单引号和双引号的区别. $sql="insert into tableName values ('".$name."','".$email." ...

  3. linux下自动加载设备驱动程序模块

    假设你的设备驱动程序为:yourdrivername.ko  1 cp yourdrivername.ko /lib/modules/"version"/kernel/driver ...

  4. jenkins部署web项目到webogic

    注: Docker容器里安装的jenkins,Docker容易里安装的weblogic 在jenkins里面直接将打包好的 war 包通过 Publish over SSH插件 放入 weblogic ...

  5. Matlab和C语言混合编程,包含目录的设定

    如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...

  6. Radar Installation POJ - 1328

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  7. jQuery.extend 函数使用详解

    JQuery的extend扩展方法:      Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解.      一.Jquery的扩展方 ...

  8. RobotFramework下的http接口自动化Set Request Body 关键字的使用

    Set Request Body关键字用来设置http 请求时的body 信息,尤其是在post 请求时,经常需要用到这个关键字. 该关键字接收一个参数,[ body ] 示例1:登录博客园(http ...

  9. JavaScript的那些事儿

    关于JavaScript的对象数据类型: Object 定义一个对象类型: 例如:var person=new Object(): 当然在建立对象以后我们可以为他添加属性, 如: <script ...

  10. 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)

    [BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...