当前位置: 首页 > news >正文

链式队列(完整可运行代码)

/*
* ==============================================================
* File name:        link_queue.c
* Author:           3360652783@qq.com
* Date created:     2026-07-27
* Description:      Queue implementation based on singly linked list (with head node).
* Copyright notice: All right Reserved.
* ==============================================================
*/#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>/*
@brief:式队列内结点结构体
*/
typedef struct Node{int data;                                            //结点中存储的数据struct Node *next;                                   //指向下一个结点的指针
}Node;/*
*@brief:链式队列头结点结构体(存储链式队列各参数)
*/
typedef struct LinlQueue{Node *Front;                                         //指向首结点的指针Node *Rear;                                          //指向尾结点的指针
}LinQueue_t;/*
@brief:创建一个链式队列并对它进行初始化
@return:成功返回队列指针,失败退出程序
@note:初始化时会创建一个头结点(哨兵),front 和 rear 都指向它
*/
LinQueue_t *LinkQueue_creat(){LinQueue_t *head = (LinQueue_t *)calloc(1,sizeof(LinQueue_t));Node *q = (Node *)calloc(1,sizeof(Node));           //创建哨兵结点if( head == NULL || q == NULL ){printf("内存空间申请失败");exit(-1);}head->Front = q;                                    //头结点的Front指针、Rear指针都指向哨兵head->Rear = q;return head;
}/*
@brief:入队
@return:成功返回true,失败返回false
@param:@head:链式队列头结点@data:需要入队的数据
@note:链式队列入队不需要判断队列是否已满
*/
bool enQueue(LinQueue_t *head,int data){Node *New = (Node *)calloc(1,sizeof(Node));if( New == NULL ){printf("新结点内存空间申请失败");return false;}New->data = data;                                   //将需要插入的值赋给新结点的dataNew->next = NULL;                                   //新结点要插入链表尾部,所以其next指针指向NULLhead->Rear->next = New;                             //尾结点的next指针指向新结点head->Rear = New;                                   //头结点的Rear指针指向新结点return true;
}/*
@brief:判断链式队列是否为空
@return:队列为空返回true,否则返回false
@param:@
@note:链式队列入队不需要判断队列是否已满
*/
bool LinKQueue_IsEmpty(LinQueue_t *head){if( head->Rear != head->Front ){                    //队列为空,头结点前后指针都指向哨兵return false;}return true;
}/*
@brief:出队
@return:成功返回出队数据,失败返回false
@param:@head:链式队列头结点
@note:链式队列出队需要判断队列是否为空
*/
int DeQueue(LinQueue_t *head){Node *temp = NULL;int data;if( head->Rear == head->Front ){                     //队列为空,出队失败printf("队列为空,出队失败");exit(-1);}if( head->Front->next == head->Rear ){               //链式队列中仅有一个结点temp = head->Rear;head->Rear = head->Front;data = temp->data;free(temp);return data;}temp = head->Front->next;head->Front->next = temp->next;temp->next = NULL;data = temp->data;free(temp);return data;
}int main() {printf("========== 链式队列功能测试 ==========\n\n");// 1. 创建队列LinQueue_t *q = LinkQueue_creat();printf("1. 队列创建成功\n");printf("   队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 2. 入队测试printf("2. 入队测试:\n");int test_data[] = {10, 20, 30, 40, 50};for (int i = 0; i < 5; i++) {if (enQueue(q, test_data[i])) {printf("   入队 %d 成功\n", test_data[i]);} else {printf("   入队 %d 失败\n", test_data[i]);}}printf("   队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 3. 出队测试printf("3. 出队测试:\n");for (int i = 0; i < 3; i++) {int val = DeQueue(q);printf("   出队:%d\n", val);}printf("\n");// 4. 再次入队printf("4. 再次入队 60, 70:\n");enQueue(q, 60);enQueue(q, 70);printf("   入队完成\n\n");// 5. 全部出队printf("5. 全部出队:");while (!LinKQueue_IsEmpty(q)) {printf(" %d", DeQueue(q));}printf("\n");printf("   队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 6. 单结点场景测试(最容易出 bug 的场景)printf("6. 单结点场景测试:\n");enQueue(q, 100);printf("   入队 100 完成\n");printf("   队列是否为空?%s\n", LinKQueue_IsEmpty(q) ? "是" : "否");int val = DeQueue(q);printf("   出队:%d\n", val);printf("   出队后队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 7. 单结点出队后再次入队(验证 Rear 是否正确重置)printf("7. 单结点出队后再次入队测试:\n");enQueue(q, 200);enQueue(q, 300);printf("   入队 200, 300 完成\n");printf("   出队序列:");while (!LinKQueue_IsEmpty(q)) {printf(" %d", DeQueue(q));}printf("\n");printf("   队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 8. 批量入队出队printf("8. 批量入队出队测试:\n");for (int i = 1; i <= 5; i++) {enQueue(q, i * 10);}printf("   入队 10, 20, 30, 40, 50 完成\n");printf("   全部出队:");while (!LinKQueue_IsEmpty(q)) {printf(" %d", DeQueue(q));}printf("\n");printf("   队列是否为空?%s\n\n", LinKQueue_IsEmpty(q) ? "是" : "否");// 9. 空队列出队测试(会触发 exit(-1),取消注释以测试)// printf("9. 空队列出队测试(程序将退出):\n");// DeQueue(q);printf("========== 所有测试通过 ==========\n");return 0;
}
http://www.jsqmd.com/news/1276845/

相关文章:

  • 5步搭建你的专属三国杀:开源网页版沉浸式体验指南
  • 基层反诈评选高效落地,天天评选投票极简批量免费投票搭建指南 - 投票制作平台
  • 3分钟搞定专业歌词下载:网易云QQ音乐无损歌词获取全攻略
  • AI如何提升本科生论文写作效率与质量
  • 生成式模型底层原理通关笔记
  • 深耕乌城十数载 通达管道疏通凭一级资质成乌鲁木齐戈壁管网养护 - 园子一号
  • linuxptp时间同步
  • 三维地形构建技术与程序化生成实践
  • ESP-IDF终极指南:从零开始掌握ESP32物联网开发框架
  • 深度解析Alfred工作流集合:构建高效Mac自动化生态
  • Unity视锥体剔除:原理、优化策略与性能提升实践
  • 2026 年洮南正规的速冻冷库厂商有哪些,那些年以为只能存海鲜蔬菜的它,原来还藏着这么多让人没想到的妙用。 - 企业推荐管【认证】
  • USB AI Agent:离线AI解决方案与本地部署实践指南
  • 全南黄金变现避坑指南:2026年实测三家本土老字号,公开计价全流程,全县范围随叫随到 - 华金汇黄金回收
  • 2026年GEO服务市场盘点:5家主流服务商实力对比与选型参考 - 品牌前沿专家
  • 免费获取国家中小学智慧教育平台电子课本:tchMaterial-parser终极下载指南
  • 终极Windows苹果驱动解决方案:专业级USB网络共享与设备识别
  • GEO优化公司怎么选?2026年五家实力服务商技术、效果与交付能力深度分析 - 纬度视角家
  • Kali 2024.2 本地靶场搭建:DVWA 环境配置与漏洞测试指南
  • SecHex-Spoofy 1.5.8:新手也能上手的硬件伪装工具完全指南
  • Unity 2D游戏开发实战:从事件驱动架构到完整游戏逻辑实现
  • Prompt设计实战:提升AI交互效果的4种核心方法
  • 终极ESP8266红外遥控库:打造专业级智能家居控制方案
  • AI智能体架构核心组件与实战解析
  • AI在电商内容生成与评价分析中的实践应用
  • 2026高温工业吸尘器品牌推荐榜:谁才是第一? - 工业清洁测评社
  • 飞书AI多维表格权限失控危机预警:1个误操作导致数据泄露的4步溯源法
  • 基于PCA的人脸识别系统开发与实践
  • Audio Slicer智能音频分割工具:基于静音检测的自动化音频处理解决方案
  • 2026 年新发布:回民诚信的静电地板哪家好定制厂家哪个好,机房选地面别瞎踩坑,这玩意儿竟能帮你省半年运维费?-亚豪防静电地板 - 企业官方推荐【认证】