队列的链式实现
文章目录队列的链式实现代码实现结构定义与初始化带头结点不带头结点入队尾插法带头结点不带头结点出队带头结点不带头结点查队头销毁队列的链式实现链队列是队列的链式存储结构本质上是操作受限的单链表。其解决了顺序队列循环队列“容量固定、可能溢出”的缺陷。链队列需要两个指针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/7/21 18:05:33 阅读更多 →
Triangles Lambertian反射技术原理:打造真实3D光照效果

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

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

2026/7/21 18:05:34 阅读更多 →
DryIoC依赖注入容器:.NET高性能DI实战指南

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

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

2026/7/21 18:05:36 阅读更多 →

最新新闻

支付系统架构演进:从单库单服到灰度路由与多层容灾的工程实践

支付系统架构演进:从单库单服到灰度路由与多层容灾的工程实践

支付系统架构演进:从单库单服到灰度路由与多层容灾的工程实践 一、支付系统的特殊性:不是"高可用",而是"绝对不允许错账" 支付系统与普通互联网服务的架构设计有本质差异。一个社交动态加载失败,用户刷新一下…

2026/7/22 10:39:48 阅读更多 →
推荐系统的AI升级:从协同过滤到深度学习的演进路径与工程冷启动方案

推荐系统的AI升级:从协同过滤到深度学习的演进路径与工程冷启动方案

推荐系统的AI升级:从协同过滤到深度学习的演进路径与工程冷启动方案 一、协同过滤不是"过时技术",而是"数据稀疏场景下的最优基线" 很多团队在"升级到AI"的旗号下,一上来就想着上深度学习推荐模型(…

2026/7/22 10:39:48 阅读更多 →
AI 聊天的逐字回复,到底是怎么实现的?

AI 聊天的逐字回复,到底是怎么实现的?

SSE 是什么 用过豆包、ChatGPT 这类 AI 产品的人,对逐字输出的「打字机效果」一定不陌生。不少小伙伴可能会以为这是前端做的模拟打字动画,或是通过 WebSocket 实现的实时推送。 实际上,这类流式输出的核心技术是 SSE(Server-Sent…

2026/7/22 10:39:48 阅读更多 →
C++ 构造函数细解--编译器总是确保所有成员对象在进入函数体执行前必须已经初始化完成

C++ 构造函数细解--编译器总是确保所有成员对象在进入函数体执行前必须已经初始化完成

c对象的构造过程并非发生在花括号{}内部,而是严格分为两个阶段:初始化阶段 发生在进入构造函数函数体之前 在此阶段,所有的非静态成员变量(包括基类子对象)都必须被初始化 如果程序员提供了初始化列表,则按照列表中的指…

2026/7/22 10:39:48 阅读更多 →
“捏脸“背后的工程逻辑:3D数字人全维度DIY定制系统

“捏脸“背后的工程逻辑:3D数字人全维度DIY定制系统

在游戏领域,"捏脸"早已是角色创建的标配功能——玩家通过滑块调整五官比例、身材参数,打造专属游戏角色。而在数字人行业,这一能力长期缺失。传统2D数字人基于提前录制的真人视频,形象一旦确定便彻底锁死,从…

2026/7/22 10:39:48 阅读更多 →
VirtualLab Fusion 超透镜设计与仿真教程

VirtualLab Fusion 超透镜设计与仿真教程

本文将引导您在 VirtualLab Fusion 中完成超透镜的完整设计与仿真工作流程。该工作流程包含四个主要步骤:配置超透镜创建代理模型设计与仿真导出结构1超透镜配置将超透镜组件添加到系统后,需配置其基本属性:组件后方的介质以及孔径直径&#…

2026/7/22 10:38:47 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻