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

实现链式存储结构的队列

一、何为链式存储结构的队列

即使用单链表来实现队列,可以通过带头结点的单链表实现队列,也可以通过不带头结点的单链表实现队列。

二、实现链式存储结构的队列(带头结点的版本)

Queue.h

#pragmaonce#include<stdio.h>#include<stdlib.h>#include<stdbool.h>// 实现链式存储结构的队列(带头结点的版本)// 定义结点的结构,结点用于存储队列中的元素typedefintElemType;typedefstructLinkNode{ElemType data;structLinkNode*next;}LinkNode;// 定义队列的结构typedefstructLinkQueue{LinkNode*front;// 指向头结点的指针,千万注意,不是指向队头元素的指针LinkNode*rear;// 指向队尾元素的指针}LinkQueue;// 队列的初始化voidInitQueue(LinkQueue&Q);// 队列是否为空。若为空返回true,否则返回falseboolIsEmpty(LinkQueue Q);// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueue&Q,ElemType x);// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueue&Q,ElemType&x);

Queue.cpp

#define_CRT_SECURE_NO_WARNINGS1#include"Queue.h"// 队列的初始化voidInitQueue(LinkQueue&Q){// 先申请一个头结点的空间// 初始化时,指向头结点的指针与指向队尾元素的指针均指向头结点Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));Q.front->next=NULL;// 头结点中的next指针置为NULL}// 队列是否为空。若为空返回true,否则返回falseboolIsEmpty(LinkQueue Q){if(Q.front==Q.rear)// 队列为空的条件既可以是Q.front == Q.rear,也可以是Q.front->next == NULLreturntrue;elsereturnfalse;}// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueue&Q,ElemType x){// 新元素x入队前,先申请一个结点的空间,用于存储新元素LinkNode*s=(LinkNode*)malloc(sizeof(LinkNode));// s指向新结点s->data=x;s->next=NULL;Q.rear->next=s;Q.rear=s;// 不要忘了让rear指针指向新的队尾元素}// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueue&Q,ElemType&x){if(Q.front==Q.rear)// 若队列为空,则无法执行出队操作returnfalse;LinkNode*p=Q.front->next;// p指向待出队的元素Q.front->next=p->next;if(p==Q.rear)// 注意,如果待出队的元素是队尾的元素,则需要修改队尾指针的值Q.rear=Q.front;free(p);// 回收待出队元素的空间p=NULL;returntrue;}

Test.cpp

#define_CRT_SECURE_NO_WARNINGS1#include"Queue.h"voidtest(){// 创建一个队列LinkQueue q;// 测试队列的初始化InitQueue(q);}intmain(){test();return0;}

三、实现链式存储结构的队列(不带头结点的版本)

Queue.h

#pragmaonce#include<stdio.h>#include<stdlib.h>#include<stdbool.h>// 实现链式存储结构的队列(不带头结点的版本)// 定义结点的结构,结点用于存储队列中的元素typedefintElemType;typedefstructLinkNode{ElemType data;structLinkNode*next;}LinkNode;// 定义队列的结构typedefstructLinkQueue{LinkNode*front;// 指向队头元素的指针LinkNode*rear;// 指向队尾元素的指针}LinkQueue;// 队列的初始化voidInitQueue(LinkQueue&Q);// 队列是否为空。若为空返回true,否则返回falseboolIsEmpty(LinkQueue Q);// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueue&Q,ElemType x);// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueue&Q,ElemType&x);

Queue.cpp

#define_CRT_SECURE_NO_WARNINGS1#include"Queue.h"// 队列的初始化voidInitQueue(LinkQueue&Q){Q.front=Q.rear=NULL;}// 队列是否为空。若为空返回true,否则返回falseboolIsEmpty(LinkQueue Q){if(Q.front==NULL)// 队列为空的条件是Q.front == NULLreturntrue;elsereturnfalse;}// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueue&Q,ElemType x){// 新元素x入队前,先申请一个结点的空间,用于存储新元素LinkNode*s=(LinkNode*)malloc(sizeof(LinkNode));// s指向新结点s->data=x;s->next=NULL;if(Q.front==NULL)// 若队列为空,则指向队头元素的指针和指向队尾元素的指针均指向新元素{Q.front=Q.rear=s;}else// 队列不为空{Q.rear->next=s;Q.rear=s;// 不要忘了让rear指针指向新的队尾元素}}// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueue&Q,ElemType&x){if(Q.front==NULL)// 若队列为空,则无法执行出队操作returnfalse;x=Q.front->data;// 将待出队的元素的值赋给变量xif(Q.front->next==NULL)// 若队列中只有一个有效数据。则出队时需要修改队头元素的指针和指向队尾元素的指针的值{free(Q.front);Q.front=Q.rear=NULL;}else// 队列中有效数据的个数大于1{LinkNode*p=Q.front->next;// p指向第二个存储有效数据的结点free(Q.front);Q.front=p;// 不要忘记让指向队头元素的指针指向新的队头元素}returntrue;}

Test.cpp

#define_CRT_SECURE_NO_WARNINGS1#include"Queue.h"voidtest(){// 创建一个队列LinkQueue q;// 测试队列的初始化InitQueue(q);}intmain(){test();return0;}
http://www.jsqmd.com/news/500731/

相关文章:

  • JVM配置参数小记
  • 计算机毕业设计springboot社团活动管理系统 基于SpringBoot的高校社团数字化运营平台 SpringBoot框架下的学生社团协同管理系统
  • 电力电子新手必看:电压型与电流型逆变电路的区别与选型指南
  • 从管道工到网络专家:用生活案例讲透烽火ANM2000的SVLAN/CVLAN配置
  • Ostrakon-VL-8B效果展示:低照度夜市摊位图像中招牌文字92%还原准确率
  • QGIS搭配QuickOSM:免费获取全球矢量地理数据的实战指南(道路、水域、行政边界)
  • HDR图像处理中的‘遮蔽与燃烧‘技术:从150年摄影史到现代算法实现
  • 2026年期货量化软件代码可读性排名_维护成本对比
  • 给机器人看《资本论》:它组织首次罢工
  • AD9253高速ADC实战指南:SPI寄存器配置与数字采集系统搭建
  • 安装AndroidStuido
  • 2026年网易企业邮箱联系电话及最新报价一键获取 - 品牌2025
  • STM32F407+OV7670图像采集实战:从硬件连接到DCMI配置全流程解析
  • 深入解析VS中C#语言版本与.NET Core版本的查看与配置技巧
  • 霜儿-汉服-造相Z-Turbo多模态扩展初探:结合语音描述生成汉服形象
  • 《OpenClaw架构与源码解读》· 第 14 章 安全模型:把 AI 放在家里但不「放飞」它
  • 2026年陕西防静电地板选型指南:机房建设、净化车间、全钢/陶瓷/PVC地板,众鑫设备一站式服务解析 - 海棠依旧大
  • wvp-GB28181-pro多端口模式实战:如何用30000-30500端口实现高并发级联?
  • 陪跑300多家客户总结出的餐饮小红书账号起号逻辑 - Redbook_CD
  • 2026年好用的农产品礼盒包装推荐厂商,费用大概多少钱 - myqiye
  • PP-DocLayoutV3法律文书智能解析实战
  • 支付宝立减金线上回收秘诀:安全、便捷又高价! - 团团收购物卡回收
  • 新手友好:通过快马生成的交互示例快速理解openclaw项目重启流程
  • RetinaFace应用解析:如何快速检测人脸并绘制关键点
  • 2026年硅胶镀膜厂家推荐,惠州韧达纳米在长三角等地表现亮眼 - 工业品网
  • Linux 命令:ln — 文件链接命令
  • 2026气动卡套接头产业白皮书:国产替代深水区,谁在定义连接标准 - 呼呼拉呼
  • FireRedASR-AED-L结合Transformer优化语音识别错误检测效果
  • 热议好用的雨水收集系统公司,虹吸排水、蓄水模块、雨水过滤哪个品牌比较靠谱? - 深度智识库
  • shacct.dll文件丢失找不到 免费下载修复方法分享