数据结构实验4.1:链队列的基本操作
文章目录
- 一,问题描述
- 二,基本要求
- 三,算法分析
- 链队列的存储结构设计
- 基本操作的算法分析
- 四,示例代码
- 五,实验操作
- 六,运行效果
一,问题描述
编程实现有关链队列的下列基本操作。
(1)初始化队列:创建一个空的链队列,为后续操作做好准备,确保队列的头指针和尾指针都指向合适的初始状态(通常为空)。
(2)进队操作:将新的元素添加到链队列的尾部,更新尾指针以指向新的队尾元素,保证队列的逻辑结构正确。
(3)出队操作:从链队列的头部移除并返回一个元素,同时更新头指针,若队列为空则需要进行适当的处理(如返回错误信息)。
(4)调用进队函数建立一个队列:通过多次调用进队函数,将多个元素依次添加到队列中,构建出一个完整的链队列。
(5)输出队列中的所有元素:遍历链队列,按顺序输出队列中存储的所有元素,以便直观地查看队列的内容。
二,基本要求
(1)设计链队列的存储结构:使用结构体来定义链队列的节点,节点包含数据域和指向下一个节点的指针域。同时,定义一个结构体来表示整个链队列,包含头指针和尾指针。
(2)设计基于链队列的几种基本操作的算法:分别为初始化队列、进队、出队、建立队列和输出队列元素设计详细的算法步骤,确保操作的正确性和高效性。
(3)在参考程序中的下划线处填写适当的语句,完成参考程序:仔细分析参考程序的逻辑,根据设计的存储结构和算法,在相应位置补充缺失的代码,使程序完整且能正确运行。
(4)设计测试用例,上机调试、测试参考程序,记录测试结果,对结果进行分析:设计多种测试用例,包括空队列的操作、正常队列的进队和出队、边界情况(如队列满、队列空时的非法操作)等。上机运行程序,记录每个测试用例的输入和输出,分析程序是否按照预期工作,是否存在逻辑错误或异常情况。
(5)要求每完成一个步骤就必须及时输出队列中元素以便观察操作结果:在初始化队列、进队、出队、建立队列等操作完成后,立即调用输出队列元素的函数,显示当前队列的内容,方便直观地了解操作对队列的影响。
三,算法分析
链队列的存储结构设计
使用两个结构体来实现链队列:
- 节点结构体:
typedef struct Node {int data; // 数据域,存储节点的值struct Node *next; // 指针域,指向下一个节点
} Node;
- 链队列结构体:
typedef struct Queue {Node *front; // 头指针,指向队列的头部Node *rear; // 尾指针,指向队列的尾部
} Queue;
基本操作的算法分析
- 初始化队列:
- 时间复杂度:将头指针和尾指针都设置为
NULL
,时间复杂度为 O ( 1 ) O(1) O(1)。 - 空间复杂度:只需要存储头指针和尾指针,空间复杂度为 O ( 1 ) O(1) O(1)。
- 时间复杂度:将头指针和尾指针都设置为
void initQueue(Queue *q) {q->front = q->rear = NULL;
}
- 进队操作:
- 时间复杂度:创建一个新节点并将其添加到队列尾部,更新尾指针,时间复杂度为 O ( 1 ) O(1) O(1)。
- 空间复杂度:需要为新节点分配内存,空间复杂度为 O ( 1 ) O(1) O(1)。
void enqueue(Queue *q, int value) {Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (q->rear == NULL) {q->front = q->rear = newNode;} else {q->rear->next = newNode;q->rear = newNode;}
}
- 出队操作:
- 时间复杂度:从队列头部移除一个节点,更新头指针,若队列为空则直接返回,时间复杂度为 O ( 1 ) O(1) O(1)。
- 空间复杂度:释放被移除节点的内存,空间复杂度为 O ( 1 ) O(1) O(1)。
int dequeue(Queue *q) {if (q->front == NULL) {return -1; // 队列为空,返回错误标志}Node *temp = q->front;int value = temp->data;q->front = q->front->next;if (q->front == NULL) {q->rear = NULL;}free(temp);return value;
}
- 建立队列:
- 时间复杂度:通过多次调用进队函数来添加元素,假设添加 n n n 个元素,时间复杂度为 O ( n ) O(n) O(n)。
- 空间复杂度:需要为 n n n 个元素分配内存,空间复杂度为 O ( n ) O(n) O(n)。
void buildQueue(Queue *q, int values[], int n) {for (int i = 0; i < n; i++) {enqueue(q, values[i]);}
}
- 输出队列元素:
- 时间复杂度:遍历整个队列,时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是队列中元素的个数。
- 空间复杂度:只需要一些临时变量来遍历队列,空间复杂度为 O ( 1 ) O(1) O(1)。
void printQueue(Queue *q) {Node *temp = q->front;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");
}
四,示例代码
#define OK 1
#define ERROR 0
#include<stdio.h>
#include<malloc.h>
typedef int Status;
typedef int QElemType;typedef struct QNode { //链表结点类型QElemType data;struct QNode* next;
}QNode, * QueuePtr;typedef struct { //队列类型QueuePtr front; //队头指针QueuePtr rear; //队尾指针
}LinkQueue;Status InitQueue(LinkQueue& Q) {//构造一个带附加表头结点的空链队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;
}Status EnQueue(LinkQueue& Q, QElemType e) {//将元素e插入到带头结点的链队列Q中QueuePtr p;p = (QueuePtr)malloc(sizeof(QNode));if (!p) return ERROR;p->data = e;p->next = NULL;Q.rear->next = p; // 1. 将新节点连接到队尾节点之后Q.rear = p; // 2. 更新队尾指针指向新节点return OK;
}Status DeQueue(LinkQueue& Q, QElemType& e) {//若队列不空,则队首元素出队列,用e返回其值,返回OK,否则返回ERRORQueuePtr p;if (Q.rear == Q.front)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next; // 3. 将队头指针的下一个节点指向出队节点的下一个节点if (Q.rear == p)Q.rear = Q.front; // 4. 若出队节点是队尾节点,更新队尾指针指向头节点(此时队列为空)free(p);return OK;
}void OutputQueue(LinkQueue Q)
// 输出队列中的所有元素
{QueuePtr p;p = Q.front->next;while (p != NULL) {printf("%d ", p->data);p = p->next; // 5. 移动指针到下一个节点}printf("\n");return;
}void main()
{LinkQueue Q;InitQueue(Q);int op, x;while (1) {printf("请选择操作:1.进队 2.出队 0.退出==>");scanf("%d", &op);switch (op) {case 0: // 退出return;case 1: // 进队printf("请输入进队元素:"); // 整数scanf("%d", &x);EnQueue(Q, x); // 6. 调用进队函数printf("队内元素为:\n");OutputQueue(Q);break;case 2: // 出队if (DeQueue(Q, x)) { // 7. 若出队成功printf("出队元素为:[%d],队内元素为:\n", x);OutputQueue(Q);}elseprintf(" 队已空!\n");break;}}
}
五,实验操作
1.双击程序图标,启动程序。
2.新建项目。
3.选择”空项目“——输入项目名称——单击”确认“按钮。
4.右击”源文件“——”添加“——选择”新建项“。
5.选择”C++文件“——输入文件名——单击”添加“按钮。
6.编写代码。
7.编译代码。
8.查看编译结果。
9.单击绿色小三角,运行项目。
六,运行效果
1.实验要求的效果。
2.编写程序运行后的效果。
相关文章:
数据结构实验4.1:链队列的基本操作
文章目录 一,问题描述二,基本要求三,算法分析链队列的存储结构设计基本操作的算法分析 四,示例代码五,实验操作六,运行效果 一,问题描述 编程实现有关链队列的下列基本操作。 (1&am…...
独立部署及使用Ceph RBD块存储
Ceph RBD(RADOS Block Device) 是 Ceph 分布式存储系统中的块存储组件,类似于 AWS EBS、iSCSI 等。它独立于 OpenShift 或 IBM CP4BA,是一个分布式存储系统,提供高性能、可扩展性和容错能力,适用于数据库、…...
C++初阶-C++入门基础
目录 编辑 1.C的简介 1.1C的产生和发展 1.2C的参考文档 1.3C优势和难度 1.4C学习的建议 2.C的第一个程序 2.1打印Hello world 2.2头文件 2.3namespace命名空间 2.4::作用域限定符 2.5namespace的延伸 2.6C的输入输出 3.总结 1.C的简介 …...
部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
算法训练之位运算
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
初识Linux:常见指令与权限的理解,以及相关衍生知识
目录 前言 关于linux的简介 代码开源 网络功能强大 系统工具链完整 一、Linux下的基本指令 1.ls指令 2.pwd指令 3.cd指令 4.whoami指令 5.touch指令 6.mkdir指令 7.rm指令 8.man指令 9.cp指令 10.mv指令 11.nano指令 12.cat指令 13.tac指令 14.more指令 15.less指令 16.head指令…...
PostgreSQL-数据库的索引 pg_operator_oid_index 损坏
报错信息: 连接测试失败 Error connecting to database: Connection failed: ERROR: index "pg_operator_oid_index" contains unexpected zero page at block 3 Hint: Please REINDEX it. 这个错误表明 PostgreSQL 数据库的索引 pg_operator_oid_index …...
数字图像处理作业4
数字图像处理 作业4 Project 4:Image Restoration The scoring method for this project is as follows: 1.Implement a blurring filter using the equation(5.6-11,数字图像处理(…...
Simulink中Signal Builder在新版中找不到怎么办
在较新的MATLAB版本中,新版Simulink中的Signal Builder用Signal Editor作为替代工具。 signal builder not shown in matlab - MATLAB Answers - MATLAB Central signalBuilderToSignalEditor 1.打开上面第二个链接 2.点击拷贝 3.然后在命令行中粘贴 4.然后就会…...
STM32——RTC实时时钟
RTC简介 RTC(Real Time Clock, RTC)实时时钟,其本质是一个计数器,计数频率常为秒,专门用来记录时间。 其具有能提供时间(秒钟数),能在MCU掉电后运行,低功耗的特性 内部框图 1. RTC预分频器 2. …...
sqli-labs靶场 less4
文章目录 sqli-labs靶场less 4 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
指针数组 vs 数组指针
一、指针数组:「数组装指针」—— 每个元素都是指针 🔍 核心定义 语法:类型* 数组名[长度]; ([]优先级高于*,先形成数组,元素是指针)本质:一个 数组,数组的每个元素是 …...
GitHub优秀项目:数据湖的管理系统LakeFS
lakeFS 是一个开源工具,它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS,可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…...
数据库视图讲解(view)
一、为什么需要视图 二、视图的讲解 三、总结 一、为什么需要视图 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 比如,针对一个公司的销售人员,我们只想给他看部分数据,…...
pip install pytrec_eval失败的解决方案
1、问题描述 在使用华为云 notebook 的时候,想要: !pip install transformer结果失败,阅读报错后,疑似是 pytrec_eval 库的下载问题。 于是,单独尝试: !pip install pytrec_eval发现确实是这个库安装失…...
使用stream的Collectors.toMap()方法常见问题
文章目录 一、常见问题二、key重复问题2.1、报错示例2.2、解决方法 三、value为空问题3.1、报错示例3.2、解决方法3.1、方案一3.2、方案二 一、常见问题 stream的Collectors.toMap()方法常见问题: 1、 key不能有重复,否则会报错。java.lang.IllegalStat…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
ChatDBA:一个基于AI的智能数据库助手
今天给大家介绍一个基于 AI 大语言模型实现数据库故障诊断的智能助手:ChatDBA。 ChatDBA 是由上海爱可生信息技术股份有限公司开发,通过对话交互,提供数据库故障诊断、专业知识学习、SQL 生成和优化等功能,旨在提升 DBA 工作效率。…...
Java延迟队列
📌 1. 场景背景 最近做项目,使用到了延迟队列。场景是这样的:在在线视频学习中,学生每隔几秒上报当前学习进度,为避免频繁写数据库、提升性能,采用以下方案: 先写入 Redis,再延迟一…...
神舟平板电脑怎么样?平板电脑能当电脑用吗?
在如今的数码产品市场上,神舟平板电脑会拥有独特的优势,其中比较受到大家关注的就是神舟PCpad为例,无论是设计还是规格也会有很多的亮点,那么是不是可以直接当成电脑一起来使用呢? 这款平板电脑就会配备10.1英寸显示屏…...
Ansible的使用3
#### 一、Ansible补充模块 try () { } catch () { } finally 等同于 block () { } rescue () { } always ##### 任务块 - block任务块 - 通过block关键字,将多个任务组合到一起 - 将整个block任务组,一…...
PS教学记录
PS制作手机壁纸和电脑壁纸 1. 思绪来源 找到了一位B站UP,分享了有关于灰原哀的动态壁纸。自身( •̀ ω •́ )也是名侦探柯南的爱好者,在此基础上,萌生了制作壁纸的想法。便在B站上搜寻有关于壁纸制作的教学。找到了一位壁纸分享者的教程镜…...
分析一下HashMap内部是怎么实现的
当然可以!我们来深入分析一下 Java 中 HashMap 的内部实现机制(以 JDK 8 为主),包括数据结构、核心算法、源码设计、以及适用场景。 🧠 一、HashMap 的核心结构 HashMap 是基于哈希表实现的 Map,底层结构是…...
面向对象的要素
理解面向对象 程序的三种基本结构 (1)顺序结构 (2)选择结构 (3)循环结构 面向对象程序设计简介 面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本…...
Java基础 4.9
1.方法递归调用练习 //请使用递归的方式求出斐波那契数1, 1, 2, 3, 5, 8, 13 //给你一个整数n, 求出它的值是多少 /* 思路 n 1 1 n 2 1 n > 3 前两个数的和 递归的思路 */ public class RecursionExercise01 {public static void main(String[] args) {Mathod mathod ne…...
什么是堆?深入理解堆数据结构及其应用
粉丝提问 ⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream 发表后收到一位粉丝的私信询问: “经常听说堆、堆排序、优先队列这些概念,但一直不太明白堆到底是什么,能简单解释一下吗?它和内存分配中的堆是一回事…...
程序化广告行业(73/89):买卖双方需求痛点及应对策略深度剖析
程序化广告行业(73/89):买卖双方需求痛点及应对策略深度剖析 大家好!一直以来,我都热衷于在技术领域探索学习,也深知知识的分享能让我们共同进步。写这篇博客的目的,就是希望能和大家一起深入了…...
C++ RAII 的用途及业务代码实现案例
C RAII 的用途及业务代码实现案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization,资源获取即初始化) 是 C 的核心编程范式,其核心思想是: 资源获取与对象构造绑定资源释放与对象析构绑定利用 C 对象生命周期自动管理资源…...
神经网络入门—自定义神经网络续集
修改网络 神经网络入门—自定义网络-CSDN博客 修改数据集,yx^2 # 生成一些示例数据 x_train torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtypetorch.float32) y_train torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtypetorch.float32) 将预测代码改为&…...
【C语言】浮点数在内存的储存
前言: 在上章,了解了整数在内存中的储存,在本章节为大家继续讲解浮点数的储存,也是数据储存的最后一部分。 浮点数是计算机科学中一种重要的数据类型,用于表示实数。它能够表示非常大或非常小的数值,并且…...
安装 Calico 的两种主流方式对比
本文对比了 Calico 的两种主流安装方式: 使用 calico.yaml 的 Manifest 安装方式使用 Tigera Operator(tigera-operator.yaml custom-resources.yaml)安装方式 ✅ 1. 使用 Manifest 方式安装(直接部署 calico.yaml) …...
信用卡欺诈检测实战教程:从数据预处理到模型优化全解析
引言:为什么需要信用卡欺诈检测? 根据尼尔森报告,全球每年因信用卡欺诈造成的损失超过250亿美元,金融机构需要在0.1秒内完成交易风险评估。本文将带您从零构建基于机器学习的信用卡欺诈检测系统,完整代码可视化分析&a…...
android studio编译报错 Gradle
android studio 提示 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.0.2-bin.zip. Reason: java.net.SocketTimeoutException: Read timed out 一,手动下载 https://services.gradle.org/distributions/gradle…...
【Nodebb系列】Nodebb笔记写入方案
NodeBB写入方案 前言 最近在整理以前记录的碎片笔记,想把它们汇总到NodeBB中,方便管理和浏览。但是笔记内容有点多,并且用发帖的形式写到NodeBB中会丢失时间信息,因此整理了一套NodeBB写入方案,大致流程如下: 建立标准笔记格式导出原始笔记,并编写脚本将笔记内容转换为…...
Spring Boot 集成 POI
Spring Boot 集合 POI Apache POI 官站:https://poi.apache.org/ 基础概念 Apache POI 是一个开源项目,提供 Java API 用于操作 Microsoft Office 文件格式。Apache POI 对 Excel 文件的处理分为两个主要类库: HSSF (Horrible Spreadsheet …...
8个方向使用DeepSeek打磨完美课题申报书!
一份出色的课题申报书,往往就是项目获批的关键。撰写高质量课题申报书绝非易事,它需要您在选题切入点、研究价值论证、技术路线设计、团队优势呈现、经费规划和预期成果等多维度进行精心布局,确保论证有力、重点突出、结构清晰。 本文为您提供…...
Leetcode 34.在排序数组中查找元素的第一个和最后一个位置
题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 考察二…...
ctfshow VIP题目限免 密码逻辑脆弱
根据题目提示:公开的信息比如邮箱,可能造成信息泄露,产生严重后果 在页面上找一个邮箱号 从 QQ 上面搜索这个 QQ号,发现是一个叫大牛的人,地区是陕西西安 然后我们拼接访问 /admin 发现了一个后台登录系统的页面&…...
C++初级入门学习
数据结构初级部分的学习我们已经学完了,接下来就进入C初阶部分的学习,因为数据结构的高阶部分要用到C才能够更好的理解并书写,所以我们要先学习C,初阶部分学完就能继续学习我们对数据结构了。好了,直接进入今天的主题吧…...
2025年汽车加气站操作工证考试内容
汽车加气站操作工证是从事汽车加气站相关操作工作的人员需要考取的资格证书 考试内容 理论知识:包括加气站的工艺流程、设备原理、安全操作规程、气体性质、消防知识、环境保护等方面的知识。例如,需要了解压缩天然气或液化天然气的储存、运输和加注流…...
python爬虫:喜马拉雅案例(破解sign值)
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关ÿ…...
嵌入式AI前沿:精选工具与应用网站解析
1. Edge Impulse 网址:https://www.edgeimpulse.com/核心内容: 提供端到端的嵌入式AI开发平台,简化从数据收集到模型训练再到部署的全流程。支持多模态数据处理(音频、视觉、运动等),并优化模型以在资源受…...
【论文精读】Multi-scale Neighbourhood Feature Interaction Network
摘要(ABSTRACT) 光伏发电是工业领域的关键组成部分,其能量转换效率受光伏电池表面缺陷的显著影响。近年来,深度学习模型的广泛应用推动了缺陷检测技术的进步。然而,由于光伏电池缺陷尺寸差异较大(尤其是微…...
C++ 蓝桥云课代码练习
代码一 ,小明的背包1,代码见下 #include <iostream> #include <cstring> using namespace std;#define maxn 110 #define maxm 1001 #define inf -1int w[maxn], v[maxn]; int dp[maxn][maxm];int main() {memset(dp, inf, sizeof(dp));dp[…...
微软庆祝它成立整整50周年
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
android 启动四大组件
在 Android 开发中,启动通常是指启动一个 Activity、Service、BroadcastReceiver 或其他组件。以下是一些常见的启动方式: 1. 启动一个 Activity 要启动一个 Activity,可以使用 Intent。以下是一个示例代码: 示例:启…...
C# 串口通信
1. 导入 using System.IO.Ports;2. 初始化定义 SerialPort sp new SerialPort(); // 设置串口 sp.PortName "COM3"; // 串口 sp.BaudRate 9600; // 波特率 sp.Parity Parity.None; // 校验位 sp.DataBits 8; // 数据位 sp.StopBits StopBits.One; // 停…...
Spring事务详解
一、Spring对事务的支持 1.事务概述 什么是事务 在一个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这多条DML语句必须同时成功,或者同时失败,这样才能保证数据的安全。 多…...
单片机FreeRTOSTickless低功耗模式应用示例
Tickless低功耗模式在很多需要延长电池寿命或减少能耗的场景中非常有用,特别是在那些大部分时间处于空闲状态的系统中。 以下是一些使用Tickless模式的场景和例子: 1.传感器节点在物联网(IoT)中,许多传感器节点需要长…...
2025.4.9总结
今天周三,晚上默认不加班,每到闲暇的时候,总会瞎想。 如今想想,是要多提升提升自身的软实力了。硬实力,是你的专业技能,是你吃饭的东西,而软实力则体现在人际交往,表达能力等方面。…...