十、数据结构——链式队列

数据结构中的链式队列

目录

一、链式队列的定义
二、链式队列的实现
三、链式队列的基本操作

  • ①初始化
    ②判空
    ③入队
    ④出队
    ⑤获取长度
    ⑥打印

四、循环队列的应用
五、总结
六、全部代码
七、结果

在数据结构中,队列(Queue)是一种常见的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。链式队列是队列的一种实现方式,它使用链表来存储队列中的元素。本篇博客将详细介绍链式队列的定义、实现和基本操作,并附带有带有注释的示例代码。

一、链式队列的定义

链式队列是通过链表实现的一种队列,它将队列的元素通过指针连接起来。链式队列不需要预先分配固定大小的存储空间,因此可以动态增长,更加灵活。

二、链式队列的实现

// 定义节点结构
typedef struct Node {int data;struct Node* next;
} Node;// 定义链式队列
typedef struct {Node* front;Node* rear;
} LinkedQueue;

三、链式队列的基本操作

①初始化链式队列

// 初始化链式队列
void initLinkedQueue(LinkedQueue* queue) {queue->front = NULL;queue->rear = NULL;
}

②判断队列是否为空

// 判断队列是否为空
int isEmpty(LinkedQueue* queue) {return queue->front == NULL;
}

③入队操作

// 入队操作
void enqueue(LinkedQueue* queue, TypeData value) {// 创建新节点Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(queue)) {// 队列为空,新节点成为队头queue->front = newNode;queue->rear = newNode;} else {// 将新节点插入到队尾queue->rear->next = newNode;queue->rear = newNode;}
}

④ 出队操作

// 出队操作
int dequeue(LinkedQueue* queue) {int value = -1;if (!isEmpty(queue)) {// 保存队头节点的值value = queue->front->data;// 删除队头节点Node* temp = queue->front;queue->front = queue->front->next;free(temp);// 队列为空时,更新rear指针if (queue->front == NULL) {queue->rear = NULL;}}return value;
}

⑤获取队列中元素的个数

// 获取队列的长度
int getQueueLength(LinkedQueue* queue) {Node* current = queue->front;int length = 0;while (current != NULL) {length++;current = current->next;}return length;
}

⑥打印队列内元素

// 打印队列内的元素
void printQueue(LinkedQueue* queue) {Node* current = queue->front;printf("Queue: ");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}

四、链式队列的应用

链式队列适用于在不确定队列大小的情况下,动态地存储数据。它可以用于解决生产者-消费者问题,以及在需要异步处理数据的情况下。

五、总结

①入队操作:

  • 当队列为空时,新节点既是队头也是队尾。
  • 当队列不为空时,将新节点插入到队尾,并更新rear指针为新节点。
  • 入队操作涉及动态内存分配,要注意释放节点内存以避免内存泄漏。

②出队操作:

  • 在出队操作之前,要先检查队列是否为空,避免出现空队列的错误。
  • 出队操作要删除队头节点,并更新front指针为下一个节点。
  • 如果队列为空,同时要更新rear指针为空。

③判断队列是否为空:

  • 需要根据front指针是否为空来判断队列是否为空。

④获取队列长度:

  • 需要遍历队列中的节点,并计算节点个数来获取队列长度。

⑤动态内存管理:

  • 在链式队列中,需要使用malloc函数为节点分配内存空间。
  • 在节点不再需要时,要使用free函数释放节点的内存空间,以避免内存泄漏。

⑥打印队列元素:

  • 可以通过遍历队列的节点,并输出节点的数据来打印队列中的元素。

⑦队列的初始化:

  • 在使用链式队列之前,要先对其进行初始化,将front和rear指针都设置为空。

⑧注意空队列和满队列:

  • 链式队列一般不会出现满队列的情况,但要注意空队列的处理,以避免出现空指针引用错误。

⑨链表的插入和删除:

  • 在链式队列中,入队操作涉及链表的插入,而出队操作涉及链表的删除。要确保插入和删除的指针操作正确,避免出现内存泄漏或者空指针错误。

⑩异常处理:

  • 在队列操作时,要考虑异常情况,如空队列出队、空指针操作等,要对这些情况进行适当的处理,避免程序崩溃或出现不可预料的错误。

六、全部代码

①listqueue.h

#ifndef _LISTQUEUE_H_
#define _LISTQUEUE_H_
#include <stdio.h>
#include <stdlib.h>
typedef int TypeData;
typedef struct Node {TypeData data;struct Node* next;
} Node;typedef struct {Node* front;Node* rear;
} LinkedQueue;// 初始化链式队列
void initLinkedQueue(LinkedQueue* queue);// 判断队列是否为空
int isEmpty(LinkedQueue* queue);// 入队操作
void enqueue(LinkedQueue* queue, TypeData value) ;// 出队操作
int dequeue(LinkedQueue* queue);// 获取队列的长度
int getQueueLength(LinkedQueue* queue)// 打印队列内的元素
void printQueue(LinkedQueue* queue);#endif

②listqueue.c

#include "listqueue.h"
// 初始化链式队列
void initLinkedQueue(LinkedQueue* queue) {queue->front = NULL;queue->rear = NULL;
}// 判断队列是否为空
int isEmpty(LinkedQueue* queue) {return queue->front == NULL;
}// 入队操作
void enqueue(LinkedQueue* queue, TypeData value) {// 创建新节点Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(queue)) {// 队列为空,新节点成为队头queue->front = newNode;queue->rear = newNode;} else {// 将新节点插入到队尾queue->rear->next = newNode;queue->rear = newNode;}
}// 出队操作
int dequeue(LinkedQueue* queue) {int value = -1;if (!isEmpty(queue)) {// 保存队头节点的值value = queue->front->data;// 删除队头节点Node* temp = queue->front;queue->front = queue->front->next;free(temp);// 队列为空时,更新rear指针if (queue->front == NULL) {queue->rear = NULL;}}return value;
}// 获取队列的长度
int getQueueLength(LinkedQueue* queue) {Node* current = queue->front;int length = 0;while (current != NULL) {length++;current = current->next;}return length;
}// 打印队列内的元素
void printQueue(LinkedQueue* queue) {Node* current = queue->front;printf("Queue: ");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}

③listqueue_main.c

#include "listqueue.h"
#include "listqueue.c"
int main() {LinkedQueue queue;initLinkedQueue(&queue);// 入队操作enqueue(&queue, 10);enqueue(&queue, 20);enqueue(&queue, 30);// 打印队列内的元素printQueue(&queue);// 获取队列长度int length = getQueueLength(&queue);printf("Queue length: %d\n", length);// 出队操作int value = dequeue(&queue);printf("Dequeued value: %d\n", value);// 打印出队后的队列printQueue(&queue);// 获取出队后的队列长度length = getQueueLength(&queue);printf("Queue length: %d\n", length);return 0;
}

七、结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-router-dom和react-router的区别

react-router-dom和react-router的区别 前言 在使用react-router-dom的时候&#xff0c;经常会和react-router搞混了&#xff0c;搞不清楚它们哪个跟哪&#xff0c;到底有什么关系&#xff0c;今天来总结一下。 结论 react-router-dom是在react-router的基础上开发的&#…

变现:利用 chatgpt + midjourney 制作微信表情包

1、利用gpt生成提示词&#xff0c;当然也可以直接翻译 生成基础提示词&#xff0c; 比如&#xff1a; an anime image with a white kawaii character in it, in the style of light green and brown, minimalist detail, animated gifs, cranberrycore, 1860–1969, babyco…

C#实现数字验证码

开发环境&#xff1a;VS2019&#xff0c;.NET Core 3.1&#xff0c;ASP.NET Core API 1、建立一个验证码控制器 新建两个方法Create和Check&#xff0c;Create用于创建验证码&#xff0c;Check用于验证它是否有效。 声明一个静态类变量存放列表&#xff0c;列表中存放包含令…

python selenium爬虫自动登录实例

拷贝地址&#xff1a;python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库&#xff0c;使用pip install selenium 命令安装&#xff0c;selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

Android ANR触发机制之Service ANR

一、前言 在Service组件StartService()方式启动流程分析文章中&#xff0c;针对Context#startService()启动Service流程分析了源码&#xff0c;其实关于Service启动还有一个比较重要的点是Service启动的ANR&#xff0c;因为因为线上出现了上百例的"executing service &quo…

R-并行计算

本文介绍在计算机多核上通过parallel包进行并行计算。 并行计算运算步骤&#xff1a; 加载并行计算包&#xff0c;如library(parallel)。创建几个“workers”,通常一个workers一个核&#xff08;core&#xff09;&#xff1b;这些workers什么都不知道&#xff0c;它们的全局环…

c++学习(位图)[22]

位图 位图&#xff08;Bitmap&#xff09;是一种数据结构&#xff0c;用于表示一个固定范围的布尔值&#xff08;通常是0或1&#xff09;。它使用一个二进制位来表示一个布尔值&#xff0c;其中每个位的值表示对应位置的元素是否存在或满足某种条件。 位图可以用于解决一些特…

利用MATLAB制作DEM山体阴影

在地理绘图中&#xff0c;我们使用的DEM数据添加山体阴影使得绘制的图件显得更加的美观。 GIS中使用ArcGIS软件就可以达到这一目的&#xff0c;或者使用GMT&#xff0c;同样可以得到山体阴影的效果。 本文提供了一个MATLAB的函数&#xff0c;可以得到山体阴影。 clear all;c…

《面试1v1》如何能从Kafka得到准确的信息

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

安防视频管理平台GB设备接入EasyCVR, 如何获取RTMP与RTSP视频流

安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比…

基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.1 目标函数 2.2 约束条件 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 分布式电源接入配电网&#xff0c;实现就地消纳&#xff0c;可以提高新能源的利用率、提高电能质量和降低系统网损…

出海周报|Temu在美状告shein、ChatGPT安卓版上线、小红书回应闪退

工程机械产业“出海”成绩喜人&#xff0c;山东相关企业全国最多Temu在美状告shein&#xff0c;跨境电商战事升级TikTok将在美国推出电子商务计划&#xff0c;售卖中国商品高德即将上线国际图服务&#xff0c;初期即可覆盖全球超200个国家和地区ChatGPT安卓版正式上线&#xff…

echarts遇到的问题

文章目录 折线图-区域面积图 areaStyley轴只有整数y轴不从0开始y轴数值不确定&#xff0c;有大有小&#xff0c;需要动态处理折线-显示label标线legend的格式化和默认选中状态x轴的lable超长处理x轴的相关设置 echarts各个场景遇到的问题 折线图-区域面积图 areaStyle areaStyl…

node.js的优点

提示&#xff1a;node.js的优点 文章目录 一、什么是node.js二、node.js的特性 一、什么是node.js 提示&#xff1a;什么是node.js? Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱…

【c语言进阶】字符函数和字符串函数知识总结

字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…

粘包处理的方式

为什么出现粘包&#xff1a; 发送端在发送的时候由于 Nagel 算法的存在会将字节数较小的数据整合到一起发送&#xff0c;导致粘包&#xff1b;接收端不知道发送端数据的长度&#xff0c;导致接收时无法区分数据&#xff1b; 粘包处理的方式&#xff1a; 通过在数据前面加上报…

最新版本docker 设置国内镜像源 加速办法

解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…

windows11打不开任务管理器,

目录 第一章、win11系统任务管理器打不开&#xff1f;第二章、解决方式修改注册表 友情提醒&#xff1a; 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、win11系统任务管理器打不开&#xff1f; Win11任务管理…

FPGA+EMMC 8通道存储小板

FPGA 采用XILINX公司A7100作为主芯片 AD采用AD7606及一款陀螺仪传感器&#xff0c;可以实时存储到EMMC&#xff0c;系统分为采集模式及回放模式 通过232接口对工作模式进行配置&#xff0c;采样率可以动态配置 回放采用W5100S通过TCP协议进行回放数据

【C语言进阶篇】回调函数都学了吧!那么用冒泡排序实现qsort函数你会嘛?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; qsort 和 冒泡排序的区别&#x1f4d1; qsort 的特点&#x1f4d1; 冒泡排序 …