队列的链式实现
文章目录队列的链式实现代码实现结构定义与初始化带头结点不带头结点入队尾插法带头结点不带头结点出队带头结点不带头结点查队头销毁队列的链式实现链队列是队列的链式存储结构本质上是操作受限的单链表。其解决了顺序队列循环队列“容量固定、可能溢出”的缺陷。链队列需要两个指针front队头指针指向头结点注意不是第一个数据结点。头结点的data闲置next指向真正的首元结点。rear队尾指针指向最后一个数据结点尾结点。带头结点后空队时front rear均指向头结点所有操作逻辑完全统一。图示空队 front(rear) - [头结点 | nextNULL] 入队10 front - [头结点 | next] - [10 | NULL] rear-^ 入队20 front - [头结点 | next] - [10 | next] - [20 | NULL] rear -^代码实现结构定义与初始化与顺序队列不同链队列通常将front和rear封装在一个结构体中便于函数传参。带头结点#includestdio.h#includestdlib.h#includestdbool.h// ① 结点定义与单链表完全一样typedefstructLNode{intdata;structLNode*next;}LNode;// ② 链队列定义封装了队头和队尾指针typedefstruct{LNode*front;// 队头指针指向头结点LNode*rear;// 队尾指针指向最后一个结点}LinkQueue;// 带头结点// 初始化 创建空队列创建头结点boolInitQueue(LinkQueueQ){// 1. 申请头结点空间 队尾指针也指向头结点表示空队Q.frontQ.rear(LNode*)malloc(sizeof(LNode));if(Q.frontNULL)returnfalse;// 内存分配失败// 2. 头结点的 next 置空Q.front-nextNULL;returntrue;}// 判空boolQueueEmpty(LinkQueue Q){returnQ.frontQ.rear;// 或者 Q.front-next NULL 若 front rear 则为空}// 判满 链队列不存在 “满 ”的概念// 唯一的限制是堆内存耗尽。通常不写判满函数而是在入队时检测 malloc 返回值。boolQueueFull(LinkQueue Q){returnfalse;// 理论永远不满只要内存够}不带头结点#includestdio.h#includestdlib.h#includestdbool.htypedefstructLNode{intdata;structLNode*next;}LNode;typedefstruct{LNode*front;// 队头指针指向第一个数据结点不是头结点LNode*rear;// 队尾指针指向最后一个数据结点}LinkQueue;// 不带头结点// 初始化 创建空队列不分配头结点voidInitQueue(LinkQueueQ){Q.frontNULL;// 直接置空Q.rearNULL;// 直接置空}// 判空boolQueueEmpty(LinkQueue Q){returnQ.frontNULL;// 只要队头为空队列就为空// 也可以这样判断Q.rear NULL;}入队尾插法带头结点步骤新建结点 → 接到rear后面 → 更新rear为新结点// 带头结点// 入队 在队尾rear 后面插入元素 eboolEnQueue(LinkQueueQ,inte){// 1. 申请新结点空间LNode*s(LNode*)malloc(sizeof(LNode));if(sNULL)returnfalse;// 内存耗尽相当于 “队满 ”// 2. 初始化新结点s-datae;s-nextNULL;// 3. 将新结点挂到当前尾结点后面Q.rear-nexts;// 4. 尾指针后移指向新的尾结点Q.rears;returntrue;}不带头结点// 不带头结点// 入队 在队尾插入元素 eboolEnQueue(LinkQueueQ,inte){LNode*s(LNode*)malloc(sizeof(LNode));if(sNULL)returnfalse;s-datae;s-nextNULL;// 必须特别判断是不是第一个结点// 不带头结点的队列第一个元素入队时需要特别处理if(Q.frontNULL){// 情况1空队front 和 rear 都指向新结点Q.fronts;// 修改队头队尾指针Q.rears;}else{// 情况2非空队挂在尾结点后面Q.rear-nexts;// 新结点插入到 rear 结点之后Q.rears;// 修改 rear 指针}returntrue;}出队删除队头第一个有效结点特殊边界如果删除后队列为空需要将rear重置回头结点防止rear悬空。带头结点删除头结点的后继。// 带头结点// 出队 删除队头元素并通过 e 带回其值boolDeQueue(LinkQueueQ,inte){// 1. 判空if(Q.frontQ.rear)returnfalse;// 2. p 指向首元结点第一个数据结点LNode*pQ.front-next;ep-data;// 保存数据// 3. 头结点跨过 p指向 p 的下一个结点Q.front-nextp-next;// 注意如果 p 恰好是最后一个结点即出队后队列变空// 必须把 rear 重新指向头结点否则 rear 将指向已释放的内存if(pQ.rear){Q.rearQ.front;}// 4. 释放 p 结点内存free(p);returntrue;}不带头结点// 不带头结点// 出队 删除队头元素并通过 e 带回其值boolDeQueue(LinkQueueQ,inte){// 1. 判空if(Q.frontNULL)returnfalse;// 2. p 指向队头结点直接就是 frontLNode*pQ.front;ep-data;// 3. 队头指针后移指向下一个数据结点Q.frontp-next;// 如果删除的是唯一结点出队后队列变空if(Q.frontNULL){// 必须把 rear 也置为 NULL否则 rear 指向已释放的内存Q.rearNULL;}// 或这样写// if(Q.rear p ){// Q.rear NULL;// Q.front NULL;// }free(p);returntrue;}查队头// 带头结点// 查队头 只读操作不删除元素boolGetHead(LinkQueue Q,inte){if(Q.frontQ.rear)// 空队returnfalse;eQ.front-next-data;// 头结点的后继才是第一个数据returntrue;}// 不带头结点// 查队头 只读操作boolGetHead(LinkQueue Q,inte){if(Q.frontNULL)returnfalse;eQ.front-data;// front 直接指向数据结点无需绕 -nextreturntrue;}销毁// 带头结点// 销毁 释放所有结点包括头结点voidDestroyQueue(LinkQueueQ){LNode*pQ.front;// p 从头结点开始while(p!NULL){LNode*qp;pp-next;free(q);}// 防止野指针虽然 Q 是引用但置空是好习惯Q.frontNULL;Q.rearNULL;}// 不带头结点// 销毁 释放所有数据结点voidDestroyQueue(LinkQueueQ){LNode*pQ.front;while(p!NULL){LNode*qp;pp-next;free(q);}Q.frontNULL;Q.rearNULL;}链队列是采用链式存储结构的队列通常使用带头结点的单链表实现并附设front和rear两个指针分别指向头结点和尾结点。入队操作对应单链表的尾插法rear-next s; rear s;出队操作对应删除头结点的后继结点。在出队时若被删结点是尾结点必须将rear重置为front。链队列克服了顺序队列容量固定的缺陷入队、出队、判空操作的时间复杂度均为O(1)。

相关新闻

提升Calibre图书管理效率:NLCISBNPlugin与其他元数据插件对比分析

提升Calibre图书管理效率:NLCISBNPlugin与其他元数据插件对比分析

提升Calibre图书管理效率:NLCISBNPlugin与其他元数据插件对比分析 【免费下载链接】NLCISBNPlugin 基于中国国家图书馆ISBN检索的calibre的source/metadata插件。https://doiiars.com/article/NLCISBNPlugin 项目地址: https://gitcode.com/gh_mirrors/nl/NLCISBN…

2026/11/5 20:05:51 阅读更多 →
Triangles Lambertian反射技术原理:打造真实3D光照效果

Triangles Lambertian反射技术原理:打造真实3D光照效果

Triangles Lambertian反射技术原理:打造真实3D光照效果 【免费下载链接】triangles Delaunay triangulation Lambertian reflectance 项目地址: https://gitcode.com/gh_mirrors/tr/triangles 想要为你的网页或应用添加令人惊艳的3D视觉效果吗?T…

2026/10/28 19:22:05 阅读更多 →
DryIoC依赖注入容器:.NET高性能DI实战指南

DryIoC依赖注入容器:.NET高性能DI实战指南

1. DryIoC 容器入门指南DryIoC 是 .NET 生态中一个轻量级但功能强大的依赖注入容器,它以高性能和易用性著称。作为一个从业多年的 .NET 开发者,我在多个企业级项目中深度使用过 DryIoC,今天就来分享这个强大工具的实战经验。与常见的 Unity、…

2026/11/6 1:18:14 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/6 9:29:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/6 22:01:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/6 22:01:11 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/6 8:08:42 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/6 22:01:09 阅读更多 →

日新闻

周新闻

月新闻