一篇读懂队列(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/9/29 1:27:16 阅读更多 →
超全 CentOS7 实操教程:man 帮助手册、Vim 全套快捷键、IO 管道重定向详解

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

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

2026/9/25 19:17:40 阅读更多 →
Linux 内核 LSM 安全模块在嵌入式中的应用:SELinux 最小权限策略的裁剪与定制方法

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

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

2026/9/26 1:17:22 阅读更多 →

最新新闻

傅里叶变换实战指南:从频谱分析到Python信号与图像处理

傅里叶变换实战指南:从频谱分析到Python信号与图像处理

先别急着翻书,我给你讲个更直白的场景:你在录音棚里录了一段吉他,结果混进了空调的低频轰鸣和隔壁房间的狗叫。时域里这段波形乱成一团,你想把狗叫抠掉,鼠标拖半天也选不准位置。但如果你把这段声音扔进傅里叶变换里&a…

2026/9/29 1:27:46 阅读更多 →
ESP32边缘AI硬件落地的8大工程陷阱与实战解法

ESP32边缘AI硬件落地的8大工程陷阱与实战解法

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

2026/9/29 1:27:46 阅读更多 →
论文AI率超标别踩坑!2026年毕业生必看3大误区+高效去AI痕迹操作

论文AI率超标别踩坑!2026年毕业生必看3大误区+高效去AI痕迹操作

一到毕业季,论文简直成了大半学生的“年度渡劫项目”!最近后台私信快爆了:“小编救急!我论文全是自己敲的,怎么AIGC检测率还超标?”“用AI搭了点框架,直接被导师打回来重改……” 别慌别慌&…

2026/9/29 1:27:46 阅读更多 →
CCS2欧标充电座深度解析:交直流一体的可靠性设计

CCS2欧标充电座深度解析:交直流一体的可靠性设计

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

2026/9/29 1:27:46 阅读更多 →
论文AI率超标怎么办?2026年6款实测主流免费工具:降AI率、降AIGC率,助精准通过AI检测

论文AI率超标怎么办?2026年6款实测主流免费工具:降AI率、降AIGC率,助精准通过AI检测

用AI辅助写论文确实能省不少功夫,但2026年以来学校和期刊的AI检测标准真的拉满了!要是AI率超标,论文直接打回,之前熬的夜全白费!人工逐句改不仅慢还容易把逻辑改乱,不如试试专业的降AI工具。我前后亲测了9款…

2026/9/29 1:27:46 阅读更多 →
零序电流保护课程设计全解析:从短路计算到整定校验

零序电流保护课程设计全解析:从短路计算到整定校验

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

2026/9/29 1:26:46 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/28 3:51:11 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →