十、数据结构——链式队列
数据结构中的链式队列
目录
一、链式队列的定义
二、链式队列的实现
三、链式队列的基本操作
- ①初始化
②判空
③入队
④出队
⑤获取长度
⑥打印
四、循环队列的应用
五、总结
六、全部代码
七、结果
在数据结构中,队列(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;
}
七、结果

相关文章:
十、数据结构——链式队列
数据结构中的链式队列 目录 一、链式队列的定义 二、链式队列的实现 三、链式队列的基本操作 ①初始化 ②判空 ③入队 ④出队 ⑤获取长度 ⑥打印 四、循环队列的应用 五、总结 六、全部代码 七、结果 在数据结构中,队列(Queue)是一种常见…...
Improving Cross-Modal Retrieval with Set of Diverse Embeddings
框架图: Using Triplet Loss: Smooth-Chamfer similarity Using Log-Sum-Exp,...
物联网阀控水表计量准确度如何?
物联网阀控水表是一种新型的智能水表,它采用了先进的物联网技术,可以通过远程控制和监测水表的运行情况,实现更加精准的水量计量和费用结算。那么,物联网阀控水表的计量准确度如何呢?下面我们将从以下几个方面进行详细…...
【C语言数据结构】模拟·顺序表·总项目实现
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅰ]
分类目录:《自然语言处理从入门到应用》总目录 本文将介绍如何在LangChain中使用Embedding类。Embedding类是一种与嵌入交互的类。有很多嵌入提供商,如:OpenAI、Cohere、Hugging Face等,这个类旨在为所有这些提供一个标准接口。 …...
使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0
🦉 AI新闻 🚀 Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要:Stability AI宣布推出Stable Diffusion XL 1.0,该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成ÿ…...
Java 递归计算斐波那契数列指定位置上的数字
Java 递归计算斐波那契数列指定位置上的数字 一、原理二、代码实现三、运行结果 一、原理 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多斐波那契(Leonardo Fibonacci)以兔子繁殖为…...
ai数字人透明屏的应用场景有哪些?
AI数字人透明屏的应用场景: 银行、保险、售楼处等接待场景:AI数字人透明屏可以作为接待员,提供详细的信息和导航,提高客户体验和服务效率。 商业街、购物中心等场所:AI数字人透明屏可以作为导购员,提供商品…...
一、1、Hadoop的安装与环境配置
安装JDK: 首先检查Java是否已经安装: java -version 如果没有安装,点击链接https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 并选择相应系统以及位数下载(本文选择jdk-8u381-linux-x64…...
剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失
💡本篇内容:剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv7原…...
前端JavaScript面试100问(上)
1、解释一下什么是闭包 ? 闭包:就是能够读取外层函数内部变量的函数。闭包需要满足三个条件: 访问所在作用域;函数嵌套;在所在作用域外被调用 。 优点: 可以重复使用变量,并且不会造成变量污染 。缺点&am…...
C语言第九课------------------数组----------------C中之将
作者前言 作者介绍: 作者id:老秦包你会, 简单介绍: 喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱…...
MySQL的安装
掌握在Windows系统中安装MySQL数据库 MySQL的介绍 MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Sun公司又被Oracle公司收购,因此MySQL目前属于 Oracle 旗下产品。MySQL 软件采用了双授权政策,分…...
在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错
文章目录 一、Vue.js devtools开发者工具安装1.打开谷歌浏览器——点击扩展程序——选择管理扩展程序2.先下载添加一个谷歌助手到扩展程序中(根据提示进行永久激活)3.点击谷歌浏览器的应用商店4.输入Vue.js devtools——搜索——选择下载 二、解决Vue.js…...
用Python实现概率矩阵分解(PMF)算法在MovieLens ml-100k数据集上构建精确的推荐系统:深入理解GroupLens数据的操作
第一部分:推荐系统的重要性以及概率矩阵分解的介绍 在如今的数字化时代,推荐系统在我们的日常生活中起着重要的作用。无论我们在哪个电商网站上购物,哪个音乐平台听歌,或者在哪个电影网站看电影,都会看到推荐系统的身影。它们根据我们的喜好和行为,向我们推荐可能喜欢的…...
WPF icon的设置
想给控件设置个圆形图片,代码如下: <Setter Property"Icon"><Setter.Value><Image Source"/WpfApp1;component/Resource/1.ico" Width"16" Height"16"/></Setter.Value></Setter&…...
使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p
使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 效果 通过frp实现内网client访问另外一个内网服务器 管理员 1)…...
2023-07-28 LeetCode每日一题(并行课程 III)
2023-07-28每日一题 一、题目编号 2050. 并行课程 III二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 relations[j] [prevCoursej, next…...
8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态
需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…...
后端性能测试的类型
目录 性能测试的类型 负载测试(load testing) 压力测试(Stress Testing) 可扩展性测试( 尖峰测试(Spike Testing) 耐久性测试(Endurance Testing) 并发测试(Concurrency Testing) 容量测试(Capacity Testing) 资料获取方法 性能测试的类型 性能测试:确定软…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
