一篇读懂队列(Queue)————手撕队列,图文并茂+代码逐行精讲
前言队列Queue是我们日常生活中再熟悉不过的概念——排队买奶茶、银行叫号、打印机任务调度背后都是队列的思想。在计算机世界队列更是操作系统进程调度、消息队列、BFS 算法的基石。本文会从零开始手写一个完整的链式队列C语言实现并逐段拆解代码的设计思路让你不仅会用更懂为什么这么写。如果你正在学数据结构或者准备面试这篇文章值得你花 15 分钟认真读完。一、什么是队列——先进先出FIFO1.1概念队列只允许在一端进行数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出的规则。我们不难发现队列的逻辑结构是线性的但是物理结构不一定是线性的。入队列进行插入操作的一端称为队尾。出队列进行删除操作的一端称为队头1.2为什么用链表实现队列队列有两种常见实现方式实现方式入队出队数组顺序队列O(1)O(n)(需移动元素链表链式队列O(1)O(1)如果用数组的话出队时头元素删除后后面的元素要整体前移效率低下。而链表只需改变指针时间复杂度O1所以实际工程中链式队列更常用。二、队列的接口设计(Queue.h中进行声明)在执行操作之前我们依然是需要先创建三个文件分别是Queue.h、Queue.c、test.c。三、结构体定义1.每个节点是独立的堆内存通过 next 指针串联起来不需要连续空间支持动态扩容2.用 typedef 重命名数据类型后续想存char、结构体都能一键修改复用性强为什么需要单独定义一个Queue结构体因为队列需要同时维护头和尾两个指针把它们封装在一起函数传参更清晰也更方便管理。如果只用一个头指针每次入队都要遍历到尾时间复杂度编程O(n)失去了链表的优势。四、代码逐段精讲Queue.c中实现4.1初始化——QueueInit1.assert(pq) 防御式编程防止外面传NULL空指针进来导致后续 pq-phead 非法访问崩溃2.把头尾指针都置为 NULL 代表当前队列为空没有任何节点3.初始化只操作指针不创建节点节点只有在入队时才动态开辟4.2判空——QueueEmpty1.空队列的标志就是 phead NULL 直接返回表达式结果即可代码最简洁2.返回值用 bool 类型语义清晰后续出队、取数据的断言都可以直接复用这个函数4.3入队——队尾插入QueuePush1.先创建节点再接入 malloc 开辟内存后必须检查是否失败内存不足时 malloc 会返回NULL不判断会造成野指针崩溃。2.新节点 next 必须手动置空 malloc 出来的内存是随机垃圾值不置空的话后续遍历会越界。3.为什么要分空队列和非空队列1空队列时头尾指针都指向NULL新节点是第一个节点必须同时给 phead 和 ptail 赋值2非空队列时只需要操作尾指针头指针保持不动4. 两步操作不能反必须先把新节点接在原尾节点后面再移动尾指针否则原尾节点地址会丢失链表就断了。4.4出队——队头删除QueuePop1. assert(!QueueEmpty(pq)) 空队列不能出队属于非法操作直接断言拦截2. 为什么要单独处理「只剩一个节点」的情况当队列只有一个节点时 phead 和 ptail 指向同一个节点。如果只释放 phead 、只移动 phead ptail 就会变成悬空指针野指针指向已经被释放的内存后续入队会崩溃。所以这种情况必须同时把两个指针都置空。3. 多个节点的场景先保存下一个节点地址再释放头节点最后头指针后移。顺序不能乱否则free后头节点没了就找不到下一个节点了。4.5取队头数据——QueueFront1. 只读操作不修改队列结构直接返回头节点的 data 即可2. 必须断言非空空队列没有数据访问 phead-data 属于空指针解引用直接崩溃4.6取队尾数据——QueueBack1. 只读操作不修改队列结构直接返回尾节点的 data 即可2. 必须断言非空空队列没有数据访问 ptail-data 属于空指针解引用直接崩溃4.7取队列有效元素个数——QueueSize1. 同样用临时指针遍历计数不改动原队列2. 时间复杂度O(N)需要遍历整条链表3. 拓展优化如果想O(1)获取长度可以在 Queue 结构体里加一个 size 成员入队1、出队-1用一点点空间换时间。如下图这样修改即可4.8打印队列——QueuePrint1. 先判空空队列直接提示并返回避免无效遍历2. 绝对不能直接移动 phead 遍历如果让 phead 自己往后走遍历完头指针就丢了整个队列都找不到了。所以用临时指针 pcur 拷贝头节点地址只动临时变量原队列结构丝毫不改。3. 终止条件 pcur NULL 代表已经遍历完最后一个节点4.9销毁队列——QueueDestory1. 为什么要先保存 next 再free节点被free之后它的内存就被回收了再去访问 pcur-next 是非法的。所以必须在释放当前节点前先把下一个节点的地址存下来。2. 遍历释放完所有节点后一定要把头尾指针置空避免变成野指针并把size归零3. 销毁只释放链表节点队列结构体本身是外面定义的不需要我们free五、可执行代码验证test.c中实现六、总结1. 链式队列核心是单链表 头尾双指针保证入队、出队都是O(1)时间复杂度2. 所有只读操作打印、计数都要用临时指针遍历绝对不能改动原头尾指针3. 边界场景一定要单独处理空队列入队、只剩一个节点出队是最容易出野指针的地方4. 动态开辟的节点一定要记得销毁防止内存泄漏

相关新闻

Linux命令攻略

Linux命令攻略

Linux命令攻略![图片](https://i-blog.csdnimg.cn/img_convert/00db6ec727ceec6e0536c1337aba5f29.jpeg

2026/10/20 3:03:40 阅读更多 →
超全 CentOS7 实操教程:man 帮助手册、Vim 全套快捷键、IO 管道重定向详解

超全 CentOS7 实操教程:man 帮助手册、Vim 全套快捷键、IO 管道重定向详解

Linux运维必备:帮助手册、Vim编辑器、IO重定向完整实操教程 前言 在日常服务器运维工作中,我们经常需要查阅命令文档、修改配置文件、处理命令输出日志。本文完整拆解三大高频核心技能:man帮助手册全套用法、Vim编辑器全量操作、标准输入输出…

2026/10/18 6:37:26 阅读更多 →
Linux 内核 LSM 安全模块在嵌入式中的应用:SELinux 最小权限策略的裁剪与定制方法

Linux 内核 LSM 安全模块在嵌入式中的应用:SELinux 最小权限策略的裁剪与定制方法

Linux 内核 LSM 安全模块在嵌入式中的应用:SELinux 最小权限策略的裁剪与定制方法 一、嵌入式 Linux 系统的权限管理困境:root 即上帝的时代必须终结 长期以来,嵌入式 Linux 设备普遍以 root 权限运行所有进程,原因是"嵌入式…

2026/10/20 11:49:47 阅读更多 →

最新新闻

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

最近几个创作群里讨论最多的,绕不开Vidu Q4 Preview。做AI视频的同仁应该都有感觉,这个赛道现在卷到什么程度:几乎每隔几天就有新版本、新模型冒出来,但大多是“看起来厉害、一上手就露馅”。Vidu Q4 Preview这次放出的内容&#…

2026/10/21 0:33:56 阅读更多 →
AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

芯片世界里,有一句话最近被工程师们重复得越来越多:AI赢了棋局,却讲不出思路。就在上个月,我拿着一个AI辅助完成的block级floorplan给物理设计团队,线长比上一版少了12%,拥塞图也干净得不像话。结果等IR压降…

2026/10/21 0:33:56 阅读更多 →
计算智能体入门:从状态机到Q-learning的决策实现

计算智能体入门:从状态机到Q-learning的决策实现

1. 从零理解计算智能体的核心骨架计算智能体这个概念,听起来像是学术论文里的术语,但把它拆开来看,其实就是一个能感知环境、做出决策、执行动作的软件实体。你可以把它想象成一个在迷宫里找路的小机器人,它能看到周围哪里有墙、哪…

2026/10/21 0:33:55 阅读更多 →
MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

从Transformer诞生起,前馈网络(FFN)就是"又笨重又绕不开"的角色:它占了模型近三分之二的参数量,但每个token都得老老实实把所有参数过一遍。你扩大模型容量,推理成本就跟着线性往上涨&#xff0c…

2026/10/21 0:33:55 阅读更多 →
开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

最近开源圈又热闹起来了,一个主打科研场景的30B级别开源模型,直接放话要跟两家头部闭源大模型掰手腕。我当时第一反应是“又来一个刷榜的”,但仔细看完技术报告和社区实测数据之后,觉得这波还真不是营销话术,确实有货。…

2026/10/21 0:33:55 阅读更多 →
LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

做LLM训练绕不开强化学习这块,标题里这五个字看着简单,真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时,也把PPO、DPO、GRPO这些名词搞得晕头转向,后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把…

2026/10/21 0:32:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →