C语言描述队列的实现及操作(链表实现)
// 队列的单链表实现
// 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方
// 首节点:头节点后第一个节点,存放数据 #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语言描述队列的实现及操作(链表实现)的更多相关文章
- C语言描述队列的实现及操作(数组实现)
一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- C语言描述二叉树的实现及操作(链表实现)
概述 二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...
- C语言描述栈的实现及操作(数组实现)
一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...
- C语言描述栈的实现及操作(链表实现)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...
- 【数据结构】之队列(C语言描述)
队列(Queue)是编程中最常用的数据结构之一. 队列的特点是“先进先出”,就像食堂排队买饭一样,先来的人排在前面,后来的人排在后面:前面的人先买饭,买完饭后离开这个队列.这就是队列的原理,它可以进行 ...
- 数据结构(java语言描述)
概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
随机推荐
- cookie、session和java过滤器
基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一 ...
- Java中的List转换成JSON报错(四)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/colle ...
- FFMPEG:H264解码-SDL显示(RGB32、RGB24、YUV420P、YUV422)
FFMpeg对视频文件进行解码的大致流程 1. 注册所有容器格式: av_register_all()2. 打开文件: av_open_input_file()3. 从文件中提取流信息: av_fin ...
- 小白学爬虫-在无GUI的CentOS上使用Selenium+Chrome
爬虫代理IP由芝麻HTTP服务供应商提供各位小伙伴儿的采集日常是不是被JavaScript的各种点击事件折腾的欲仙欲死啊?好不容易找到个Selenium+Chrome可以解决问题! 但是另一个▄█▀█ ...
- 【转】Swagger2 添加HTTP head参数
大家使用swagger往往会和JWT一起使用,而一般使用jwt会将token放在head里,这样我们在使用swagger测试的时候并不方便,因为跨域问题它默认不能自定义head参数.然后自己去网上找, ...
- 简单使用Mysql-Cluster-7.5搭建数据库集群
阅读目录 前言 mysql cluster中的几个概念解释 架构图及说明 下载mysql cluster 安装mysql cluster之前 安装配置管理节点 安装配置数据和mysql节点 测试 启动 ...
- Python Cookbook(第3版)中文版:15.16 不确定编码格式的C字符串
15.16 不确定编码格式的C字符串¶ 问题¶ 你要在C和Python直接来回转换字符串,但是C中的编码格式并不确定. 例如,可能C中的数据期望是UTF-8,但是并没有强制它必须是. 你想编写代码来以 ...
- yyb要填的各种总结的坑
已经写好啦的 莫比乌斯反演 杜教筛 动态点分治 斜率优化 Splay 莫队 凸包 旋转卡壳 Manacher算法 Trie树 AC自动机 高斯消元 KMP算法 SA后缀数组 SAM后缀自动机 回文树 ...
- Poj3321 Apple tree
翻译: 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根的编号永远是1.每个节点上最多结一个苹果.卡卡想要了解某一个子树上一共结了多少苹果. ...
- CodeIgniter怎么引入公共的头部或者尾部文件(实现随意引入或分区域创建header.html,bodyer.html,footer.html)
除非你天赋异禀,凡事基本对任何人来说都是开头难的,且开头的事情如果没有做好 往往会打掉一个人对于某件事的希望及其激情,所以咱们先从容易的事情开始慢慢建立自己 信心.后面的事情咱们再慢慢推进. 如果你是 ...