数据结构【链式队列】

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

一、引言

队列作为一种重要的数据结构,在计算机科学的众多领域有着广泛应用,如操作系统中的任务调度、网络通信中的数据缓冲等。本文通过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上。设置成…

SpringBoot中的多环境配置管理

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

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

一、工具特性概述 近期体验了一款基于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;用得比较多&#…

鼠标滚轮冒泡事件@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 能够擅长回答需要推理和连接不同信息…

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

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

使用 Ollama 在腾讯云服务器环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们如何通过纯强化学习来增强 LLM 解决复杂问题的能力&#xff0c;而无…

【现代深度学习技术】深度学习计算 | 读写文件

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

退格法记单词(类似甘特图)

退格法记单词&#xff0c;根据记忆次数或熟练程度退格&#xff0c;以示区分&#xff0c;该方法用于短时高频大量记单词&#xff1a; explosion爆炸&#xff0c;激增 mosquito蚊子granary粮仓&#xff0c;谷仓 offhand漫不经心的 transient短暂的slob懒惰而邋遢的…

深入理解 DeepSeek MOE(Mixture of Experts)

1. 什么是 MOE&#xff1f; MOE&#xff08;Mixture of Experts&#xff0c;专家混合&#xff09;是一种模型架构&#xff0c;旨在通过多个专家&#xff08;Experts&#xff09;模型的协同工作来提高计算效率和模型性能。在 MOE 结构中&#xff0c;不是所有的专家都参与计算&a…

MySQL数据库基础(创建/删除 数据库/表)

一、数据库的操作 1.1 显示当前数据库 语法&#xff1a;show databases&#xff1b; <1>show 是一个关键字&#xff0c;表示要执行的操作类型 <2>databases 是复数&#xff0c;表示显示所有数据库 上面的数据库中&#xff0c;除了java113&#xff0c;其它的数据库…

Git 常用命令汇总

# 推荐一个十分好用的git插件---->GitLens 其实很多命令操作完全界面化了&#xff0c;鼠标点点就可以实现但是命令是必要的&#xff0c;用多了你就知道了 Git 常用命令汇总 1. Git 基础操作 命令作用git init初始化本地仓库git clone <repo-url>克隆远程仓库到本地g…