单链表实现【队列】
目录
队列的概念及其结构
队列的实现
数组队列
链式队列
队列的常见接口的实现
主函数Test.c
头文件&函数声明Queue.h
头文件
函数声明
函数实现Queue.c
初始化QueueInit
创建节点Createnode
空间释放QueueDestroy
入队列QueuePush
出队列QueuePop
队头元素QueueFront
队尾元素QueueBack
判断队列是否为空QueueEmpty
队列元素个数QueueSize
链式队列总代码
队列的概念及其结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有 先进先出 /后进后出 FIFO(First In First Out)
入队列:进行插入操作的一端称为 队尾。
出队列:进行删除操作的一端称为 队头。

队列的实现
队列的实现也有两种方式。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低
数组队列

虽然数组也可以实现【队列】,但是挪动数据的效率真的很低!!
链式队列
无论是【栈】还是【队列】双向链表都是通吃的。但是我们为了节省资源就是要用【单链表】去实现队列。我们用【单链表】去实现【队列】需要注意:
- 入队列 == 尾插
- 出队列 == 头删
- 需要ptail指针维护队列最后一个元素
- 需要phead指针维护队列最后一个元素
- 二级指针&一级指针
- 带不带哨兵位的头节点都可(哨兵位的头节点最后要释放空间)

应用场景:办理业务排队打号机。因为【队列】是绝对公平的。

队列的常见接口的实现
- 入队列和出队列的顺序都只有一种!!
- 传二级指针/传一级指针的情况
- 怎么去计算队列元素个数❓
- 怎么用其他方式替代传二级指针❓空间换时间的方式
- 链表都需要考虑❓链表没有元素❓链表只有一个元素//两种情况即对应指针的判断情况
- 二级指针 == 头节点 == 返回值 == 结构体包含两个一级指针
主函数Test.c
#include"Queue.h"
int main()
{Queue pq;QueueInit(&pq);QueuePush(&pq, 1);QueuePush(&pq, 2);QueuePush(&pq, 3);QueuePush(&pq, 4);QueuePush(&pq, 77);QueuePush(&pq, 7);while (!QueueEmpty(&pq)){printf("队头元素:%d\n", QueueFront(&pq));//printf("队尾元素:%d\n", QueueBack(&pq));QueuePop(&pq);}QueueDestroy(&pq);return 0;
}
头文件&函数声明Queue.h
头文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
函数声明
- 创建节点
typedef int QDataType;
//创建队列节点
typedef struct QueueNode
{QDataType val;struct QueueNode* next;//易错❌QNode*next
}QNode;
- 创建维护队列的指针
//两个指针维护链表队列
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;
- 初始化
void QueueInit(Queue* pq);
- 销毁释放空间
void QueueDestroy(Queue* pq);
- 入队列
void QueuePush(Queue* pq, QDataType x);
- 出队列
void QueuePop(Queue* pq);
- 队头元素
QDataType QueueFront(Queue* pq);
- 队尾元素
QDataType QueueBack(Queue* pq);
- 判断队列是否为空
bool QueueEmpty(Queue* pq);
- 队列元素个数
int QueueSzie(Queue* pq);
函数实现Queue.c
初始化QueueInit
#include"Queue.h"
//不需要头节点,初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
创建节点Createnode
Queue* Createnode(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("fail malloc");return;}newnode->val = x;newnode->next = NULL;return newnode;
}
空间释放QueueDestroy
//空间释放
void QueueDestroy(Queue* pq)
{assert(pq);while (pq->phead){Queue* cur = pq->phead;pq->phead = pq->phead->next;free(cur);cur = NULL;}pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
入队列QueuePush
//Push元素
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//创建节点Queue* newnode = Createnode(pq,x);if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
出队列QueuePop
- 删到空的情况(phead/ptail野指针的情况)
- 删到只剩一个节点的情况(ptail野指针的情况)
//Pop元素
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size > 0);//为NULL的判断Queue* cur = pq->phead;pq->phead = pq->phead->next;free(cur);cur = NULL;//为一个节点的判断if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}
队头元素QueueFront
//队头元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->size > 0);return pq->phead->val;
}
队尾元素QueueBack
//队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->size > 0);return pq->ptail->val;
}
判断队列是否为空QueueEmpty
//判断是否为NULL
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
队列元素个数QueueSize
//队员元素个数
int QueueSzie(Queue* pq)
{assert(pq);return pq->size;
}
链式队列总代码
//Test.c
#include"Queue.h"
int main()
{Queue pq;QueueInit(&pq);QueuePush(&pq, 1);QueuePush(&pq, 2);QueuePush(&pq, 3);QueuePush(&pq, 4);QueuePush(&pq, 77);QueuePush(&pq, 7);while (!QueueEmpty(&pq)){printf("队头元素:%d\n", QueueFront(&pq));//printf("队尾元素:%d\n", QueueBack(&pq));QueuePop(&pq);}QueueDestroy(&pq);return 0;
}
//Queue.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int QDataType;
//创建队列节点
typedef struct QueueNode
{QDataType val;struct QueueNode* next;//易错❌QNode*next
}QNode;
//两个指针维护链表队列
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;
//接口的实现
void QueueInit(Queue* pq);//初始化
void QueueDestroy(Queue* pq);//空间释放
void QueuePush(Queue* pq, QDataType x);//放元素到队列尾
void QueuePop(Queue* pq);//出元素到队头
QDataType QueueFront(Queue* pq);//队列头的元素
QDataType QueueBack(Queue* pq);//队列尾的元素
bool QueueEmpty(Queue* pq);//判断队列是否是否为NULL
int QueueSzie(Queue* pq);//队列里面的元素个数
//Queue.c
#include"Queue.h"
//不需要头节点,初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}Queue* Createnode(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("fail malloc");return;}newnode->val = x;newnode->next = NULL;return newnode;
}
//Push元素
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//创建节点Queue* newnode = Createnode(pq,x);if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//Pop元素
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size > 0);//为NULL的判断Queue* cur = pq->phead;pq->phead = pq->phead->next;free(cur);cur = NULL;//为一个节点的判断if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}//队头元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->size > 0);return pq->phead->val;
}//队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->size > 0);return pq->ptail->val;
}//判断是否为NULL
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}//队员元素个数
int QueueSzie(Queue* pq)
{assert(pq);return pq->size;
}//空间释放
void QueueDestroy(Queue* pq)
{assert(pq);while (pq->phead){Queue* cur = pq->phead;pq->phead = pq->phead->next;free(cur);cur = NULL;}pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!下篇博文会分享一些【栈和队列的OJ题目】&【循环队列】各位小伙伴乖乖敲代码哦。
代码---------→【唐棣棣 (TSQXG) - Gitee.com】
联系---------→【邮箱:2784139418@qq.com】
相关文章:
单链表实现【队列】
目录 队列的概念及其结构 队列的实现 数组队列 链式队列 队列的常见接口的实现 主函数Test.c 头文件&函数声明Queue.h 头文件 函数声明 函数实现Queue.c 初始化QueueInit 创建节点Createnode 空间释放QueueDestroy 入队列QueuePush 出队列QueuePop 队头元…...
随机微分方程的MATLAB数值求解
dt0.01; tout200; %总时间为2 xzeros(1,tout); x(1)0.5; %初始位置 mu0.2; sigma1; Wtsqrt(dt)*randn(1,tout); %产生随机序列Wt for t1:tout-1x(t1)x(t)mu*x(t)*dtsigma*x(t)*Wt(t); end t11:10:tout; %对原时间序列进行抽样 xtzeros(1,length(t1)); i1; for tt1xt(i)0.5*exp(…...
ChatGPT 也并非万能,品牌如何搭上 AIGC「快班车」
内容即产品的时代,所见即所得,所得甚至超越所见。 无论是在公域的电商平台、社交媒体,还是品牌私域的官网、社群、小程序,品牌如果想与用户发生连接,内容永远是最前置的第一要素。 01 当内容被消费过,就…...
【JavaSE】不允许你不会使用String类
🎥 个人主页:深鱼~🔥收录专栏:JavaSE🌄欢迎 👍点赞✍评论⭐收藏 目录 前言: 一、常用方法 1.1 字符串构造 1.2 String对象的比较 (1)比较是否引用同一个对象 注意…...
身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包
项目需求,用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器,调用了DonseeDeviceLib.har这个读卡库。 需要注意的是,鸿蒙系统的app扩展名为.hap,本项目编译输出的应用为:entry-default…...
并发与并行
并发和并行是操作系统中的两个重要概念,它们在定义和处理任务的方式上有一些区别。 并发(concurrency)是指在一段时间内,有多个程序都处于启动运行到运行完毕之间,但任一时刻点上只有一个程序在处理机上运行。它是一种…...
搭个网页应用,让ChatGPT帮我写SQL
大家好,我是凌览。 开门见山,我搭了一个网页应用名字叫sql-translate。访问链接挂在我的个人博客(https://linglan01.cn/about)导航栏,也可以访问https://www.linglan01.cn/c/sql-translate/直达sql-translate。 它的主要功能有:…...
实时云渲染 助力破解智慧园区痛点困局
智慧园区是运用先进的信息技术,如物联网(IoT)、大数据、云计算、人工智能、三维可视化等,对园区内的各类设施、资源以及管理进行智能化和数字化升级。其目标是通过科技手段提升园区的运营效率、资源利用率,提供更便捷、…...
计算机组成原理2
1.浮点数 2.IEEE 754 3.存储器的性能指标 4.存储器的层次化结构 主存类似手机运行内存8g ,辅存类似手机内存128g.... 辅存必须先通过主存才能被cpu接收,就例如微信打开那个月亮小人界面两三秒就是主存在读取辅存的程序然后被cpu接收运行。 5.主存储…...
Py之PyMuPDF:PyMuPDF的简介、安装、使用方法之详细攻略
Py之PyMuPDF:PyMuPDF的简介、安装、使用方法之详细攻略 目录 PyMuPDF的简介 PyMuPDF的安装 PyMuPDF的使用方法 1、基础用法 PyMuPDF的简介 PyMuPDF是一个高性能的Python库,用于PDF(和其他)文档的数据提取,分析,转换和操作。 …...
2023亚太杯数学建模A题B题C题思路模型代码论文指导
2023亚太地区数学建模A题思路:开赛后第一时间更新,获取见文末 名片 2023亚太地区数学建模B题思路:开赛后第一时间更新,获取见文末 名片 2023亚太地区数学建模C题思路:开赛后第一时间更新,获取见文末 名片…...
【C/PTA】函数专项练习(四)
本文结合PTA专项练习带领读者掌握函数,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 目录 6-1 计算A[n]1/(1 A[n-1])6-2 递归实现顺序输出整数6-3 自然数的位数(递归版)6-4 分治法求解金块问题6-5 汉诺塔6-6 重复显示字符(递归版)…...
广西柳州机械异形零部件三维扫描3D抄数全尺寸测绘建模-CASAIM中科广电
一、背景介绍 复杂机械异形零部件具有不规则的形状和复杂的结构,给生产制造带来了很大的检测难度。为了确保零部件的制造质量和精度,需要对零部件进行全面的尺寸检测和分析。 CASAIM三维扫描仪在机械异形零部件全尺寸检测应用可以实现对机械异形零部件…...
(四)C语言之符号常量概述
(四)C语言之符号常量概述 一、符号常量概述 一、符号常量概述 在程序中使用像300,20等这样的等类似的“幻数”不是一个好的习惯,它们无法向阅读该程序的人提供更多有用的信息,从而使得修改程序变得困难。处理这种幻数的一种方法是…...
springboot -sse -flux 服务器推送消息
先说BUG处理,遇到提示异步问题 Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported&…...
js进阶笔记之原型,原型链
目录 1、原型对象 constructor 属性 对象原型 2、原型链 3、instanceof 4、原型继承 1、原型对象 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 面向对象是把事务分解成为…...
【DevOps】Git 图文详解(四):Git 使用入门
本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…...
Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )
Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)jax重新获取数据刷新页面功能,因为ajax属于耗时操作,想在获取数据且加载页面时显示加载遮罩层,结果发现了ajax的好多坑。…...
读书笔记——《黑猩猩的政治》
前言 弗朗斯德瓦尔(Frans de Waal)的代表作《黑猩猩政治》成书于1982年,是它的首部书籍作品,也是美国国会新任议员的被推荐读物。之前看的他另一部作品的《万智有灵》是2016年的作品,时间跨度居然这么大。《万智有灵》介绍了许多…...
此处不允许使用特性namespace
1.DOCTYPE 后面改成 mapper 2.PUBLIC一行中的Config改为Mapper 3.将下一行config变为小写的mapper <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.or…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
