数据结构【链式队列】

基于链式存储结构的队列实现与分析

一、引言

队列作为一种重要的数据结构,在计算机科学的众多领域有着广泛应用,如操作系统中的任务调度、网络通信中的数据缓冲等。本文通过C++ 代码实现了一个基于链式存储结构的队列,并对其进行详细解析。

二、代码实现

(一)结构体定义

typedef struct node{int date;struct node* next;
}lstqu;
typedef struct nodeb {lstqu* front, * rear;
}qq;
qq* Q;

这里定义了两个结构体,lstqu 用于表示队列中的节点,每个节点包含一个数据域 date 和一个指向下一个节点的指针 nextqq 结构体用于表示整个队列,包含队头指针 front 和队尾指针 rear

(二)初始化队列

qq* initqueue()
{lstqu* p;qq* Q;p = (lstqu*)malloc(sizeof(lstqu));Q = (qq*)malloc(sizeof(qq));Q->front = p;Q -> rear = p;return Q;
}

initqueue 函数中,首先为一个新的节点分配内存空间 p,然后为整个队列分配内存空间 Q。将队头和队尾指针都指向这个新创建的节点,这个节点作为队列的初始状态,此时队列中没有实际的数据元素。

(三)判断队列是否为空

int empty(qq*Q)
{if (Q->front == Q->rear) return 1;else return 0;
}

empty 函数通过判断队头指针和队尾指针是否相等来确定队列是否为空。如果相等,说明队列中没有元素,返回 1;否则返回 0

(四)入队操作

void push(qq* Q, int x){lstqu* q = (lstqu*)malloc(sizeof(lstqu));q->date = x;q->next = NULL;Q->rear->next = q;Q->rear = q;
}

push 函数实现了入队操作。首先为新元素分配内存空间 q,将数据 x 存入节点的数据域,并将节点的 next 指针设为 NULL。然后将队尾节点的 next 指针指向新节点,最后更新队尾指针 rear 指向新节点。

(五)出队操作

int pop(qq* Q, int *x){lstqu* q = (lstqu*)malloc(sizeof(lstqu));if (empty(Q)) {cout << "队列已空\n";return 0;}q = Q->front->next;*x = q->date;Q->front->next = q->next;if (q->next == NULL){Q->front = Q->rear;}free(q);return 1;
}

pop 函数用于出队操作。首先检查队列是否为空,如果为空则输出提示信息并返回 0。否则,获取队头节点的下一个节点 q,将其数据域的值赋给 *x,然后将队头指针 frontnext 指针指向下一个节点,即跳过要出队的节点。如果出队后队列变为空(即出队节点的 next 指针为 NULL),则更新队头指针 front 与队尾指针 rear 相等。最后释放出队节点的内存空间,并返回 1 表示操作成功。

(六)获取队头元素

int front(qq* Q, int* x) {lstqu* q = (lstqu*)malloc(sizeof(lstqu));if (empty(Q)) {cout << "队列已空\n";return 0;}*x = Q->front->next->date;return 1;
}

front 函数用于获取队头元素的值。同样先检查队列是否为空,若为空则输出提示并返回 0。否则,将队头节点的下一个节点的数据域值赋给 *x 并返回 1

(七)打印队列

void printq(qq* Q){lstqu* q = Q->front->next;if (q == NULL) cout << "无";else {while (q!= NULL){cout << q->date << " ";q = q->next;}cout << "打印好了" << endl;}
}

printq 函数用于打印队列中的所有元素。从队头节点的下一个节点开始,遍历整个队列,依次输出每个节点的数据域值,直到遇到 NULL 指针,表示遍历结束。

(八)主函数测试

在这里插入图片描述
结果如下:
在这里插入图片描述

三、总结

通过上述代码实现,我们成功构建了一个基于链式存储结构的队列,并通过测试函数验证了其基本操作的正确性。链式存储结构的队列在处理动态数据时具有灵活性,避免了顺序存储结构可能出现的溢出问题。然而,在实现过程中要注意内存的管理,及时释放不再使用的节点内存,以防止内存泄漏。同时,对于复杂的应用场景,还可以进一步优化和扩展队列的功能,如增加获取队列长度等操作。

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

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

相关文章

路由器如何进行数据包转发?

路由器进行数据包转发的过程是网络通信的核心之一&#xff0c;主要涉及以下几个步骤&#xff1a; 接收数据包&#xff1a;当一个数据包到达路由器的一个接口时&#xff0c;它首先被暂时存储在该接口的缓冲区中。 解析目标地址&#xff1a;路由器会检查数据包中的目标IP地址。…

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题&#xff…

Excel 融合 deepseek

效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "Bearer ", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim postD…

『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)

目录 预览效果新建一个config.js存放标题编写添加提示的方法调用添加标题方法的生命周期总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 预览效果 新建一个config.js存放标题 export const titleConfig [{ Choice: .ql-bold…

STM32的HAL库开发-通用定时器输入捕获实验

一、通用定时器输入捕获部分框图介绍 1、捕获/比较通道的输入部分(通道1) 首先设置 TIM_CCMR1的CC1S[1:0]位&#xff0c;设置成01&#xff0c;那么IC1来自于TI1&#xff0c;也就是说连接到TI1FP1上边。设置成10&#xff0c;那个IC1来自于TI2&#xff0c;连接到TI2FP1上。设置成…

python编程-内置函数 bytes() , bytearray()详解

bytes()函数用于创建一个新的不可变的字节序列对象&#xff0c;它是bytearray()的不可变版本。这个函数非常有用&#xff0c;尤其是在处理二进制数据、进行网络编程或者文件操作时。 bytes() 和 bytearray() 都用于处理二进制数据的两个内置函数。它们的主要区别在于 bytes 是不…

深度整理总结MySQL——索引正确使用姿势

索引正确使用姿势 前言MySQL索引优缺点分析✅ 索引的优势⚠️ 索引的代价 如何合理建立索引?——关键原则总结重要的优化机制索引覆盖——通俗的方式讲解索引下推索引跳跃式扫描 前言 这篇文章是补充一些基本概念和实战的一些使用建议. MySQL索引优缺点分析 ✅ 索引的优势 …

SpringBoot中的多环境配置管理

SpringBoot中的多环境配置管理 文章目录 SpringBoot中的多环境配置管理SpringBoot中的多环境配置管理 多环境配置的概述1. 为什么需要多环境配置&#xff1f;2. Spring Boot 中如何实现多环境配置&#xff1f;3. 多环境配置的应用场景4. 如何实现配置隔离&#xff1f; Spring B…

Oracle 变更redo log文件位置

更改Oracle数据库的Redo log文件位置&#xff0c;可以按照以下步骤操作。 1.查询当前Redo log文件信息 select * from v$log; select * from v$logfile;通过查询结果可知Redo log文件放在/oradata/redofile 目录下。 2.拷贝redo log文件到新的位置/Data/redolog $cd /orada…

git代理设置

在 Git 中&#xff0c;可以通过以下命令查看当前设置的代理配置&#xff1a; 查看 HTTP 代理 git config --get http.proxy查看 HTTPS 代理 git config --get https.proxy查看全局代理设置 如果你设置了全局代理&#xff0c;可以通过以下命令查看&#xff1a; git config …

全网多平台媒体内容解析工具使用指南

一、工具特性概述 近期体验了一款基于Web端的多媒体解析服务&#xff0c;该平台通过技术创新实现跨平台内容解析功能&#xff0c;主要特点如下&#xff1a; 1.1 跨平台支持 兼容主流社交媒体&#xff1a;Bilibili、YouTube、Twitter、Instagram等 支持短视频平台&#xff1a…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

网工_以太网MAC层

2025.02.05&#xff1a;网工老姜学习笔记 第12节 以太网MAC层 2.1 MAC层的硬件地址2.2 MAC地址特殊位含义2.3 终端适配器&#xff08;网卡&#xff09;具有过滤功能2.4 MAC帧的格式2.4.1 DIX Ethernet V2标准&#xff08;先私有&#xff0c;后开放&#xff0c;用得比较多&#…

一文吃透!DataStage 全面概述与核心知识要点大公开

目录 第一章 DataStage 基础知识 1.1 DataStage 定义及特点 1.2 DataStage 功能模块 1.3 DataStage 应用场景 第二章 DataStage 核心技术 2.1 数据抽取技术 2.2 数据转换技术 2.3 数据加载技术 第三章 DataStage 操作实践 3.1 环境搭建与配置 安装 DataStage 软件 配…

鼠标滚轮冒泡事件@wheel.stop

我有一个页面,是在画布上的组件,但是组件中有一个table,table中数据多了,就会出现滚动条,正常情况下,滚动条用鼠标滚轮就可以滑动,但是这个table是在画布上,滚动滚轮会让画布缩放 在table外层的div上加上 wheel.stop,就生效了 wheel.stop 用途&#xff1a;这个修饰符用于处理鼠…

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变

在人工智能快速发展的当下&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为众多应用的核心技术。检索增强生成&#xff08;RAG&#xff09;&#xff08;RAG 系统从 POC 到生产应用&#xff1a;全面解析与实践指南&#xff09;和缓存增强生成&#xff08;CAG&#x…

graphRAG的原理及代码实战(1)基本原理介绍(上)

1、基本介绍 GraphRAG通过利用大模型从原始文本数据中提取知识图谱来满足跨上下文检索的需求。该知识图将信息表示为互连实体和关系的网络&#xff0c;与简单的文本片段相比&#xff0c;提供了更丰富的数据表示。这种结构化表示使 GraphRAG 能够擅长回答需要推理和连接不同信息…

PostgreSQL中级认证价值

PostgreSQL&#xff0c;作为一款开源的关系型数据库管理系统&#xff0c;以其强大的功能、高度的可扩展性和稳定性&#xff0c;赢得了广泛的认可。对于非科班出身、IT知识储备有限的你&#xff0c;选择PostgreSQL中级认证专家的学习路径&#xff0c;不仅是一次技能的提升&#…

论文翻译学习:《DeepSeek-R1: 通过强化学习激励大型语言模型的推理能力》

摘要 我们介绍了我们的第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;没有经过监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;展示了卓越的推理能力。通过强化…

Android开发获取缓存,删除缓存

Android开发获取缓存&#xff0c;删除缓存 app设置中往往有清理缓存的功能。会显示当前缓存时多少&#xff0c;然后可以点击清理缓存 直接上代码&#xff1a; object CacheHelper {/*** 获取缓存大小* param context* return* throws Exception*/JvmStaticfun getTotalCache…