《数据结构》实验报告-实验一 线性结构及其应用

news2024/11/17 1:27:10

《数据结构》实验报告-实验一 线性结构及其应用

一、问题分析

题目要求收集两个班的学生成绩信息并按降序排列,其中每个学生的数据包括班级,学号和成绩信息,需要用一个结构体作为整体存储。并且数据是可以不断添加进来的,可以用两个线性表分别来存储两个班级的学生信息。但是如果用数组等顺序存储的方式来存储数据,每次存储一位学生的信息都要进行大量移动操作,并且学生数量未知,用顺序存储可能造成资源的浪费。这时利用链表的插入和删除操作时间复杂度仅为O(1)的良好特性,并且可以根据实际情况动态扩展内存,可以选择线性链表为存储结构。合并两个班级的学生信息,可以用链表的归并算法,因为两个链表都是有序的,归并的时间复杂度为O(n)。

二、详细设计

2.1 设计思想

1、选择线性链表做为存储结构。
每一个节点包含学生的三个信息信息和一个指向下一个节点的指针,节点与节点之间通过降序连接起来。每次要插入一个元素,先动态申请内存,遍历链表找到第一个不比它成绩值大的元素,在它前面插入该元素(要考虑插入位置为链表头和尾的特殊情况)。这样就可以按降序建立一个班级的链表,不用每次增加元素都要进行排序,十分方便。两个班级的链表分别用两个头指针管理,可以构造一个指针数组来存储这两个头指针,这样在不只是2个班级的情况下只需增加数组的大小即可。

2、链表的遍历

遍历时先判断是否为空表,如果不为空则用一个新指针指向第一个节点,通过节点与节点之间的联系便可以遍历链表。遍历链表时可以进行匹配学号操作,实现按照学号查询成绩和删除学生信息。也可以打印全部学生信息。

3、链表的合并和反转

运用归并算法进行两个有序链表的合并。分别用两个指针指向两个链表的头结点,大的就添加为一个新链表的节点,循环比较。这样就可以得到一个合并了两个班级信息的新链表。反转则利用两个指针,第一个指向合并后的新链表节点,第二个指向一个逆序建立链表的反转节点,先复制原合并链表指针指向节点的数据,让他指向反转指针指向的节点,再让反转指针指向这个新节点。循环后便可以O(n)的时间复杂度构建一个反转链表。
2.2 存储结构及操作
(1) 存储结构(一般为自定义的数据类型,比如单链表,栈等。)
链表节点结构体StudentLinkedListNode
内容包括ClassID(班级),StuID(学号),Grade(成绩,以上均为int类型),指向结构体StudentLinkedListNode的指针next。
(2) 涉及的操作(一般为自定义函数,可不写过程,但要注明该函数的含义。)
在这里插入图片描述

2.3 程序整体流程
整体流程:
在这里插入图片描述

核心算法流程:
(1)插入节点studentLinkedListAdd:
在这里插入图片描述

(2)遍历链表(查找,删除,查找)
searchByID
deleteByID
outputStudentLinkedList:

在这里插入图片描述

(3)合并链表
mergeLinkedList
在这里插入图片描述

(4)翻转链表
reverseLinkedList
在这里插入图片描述

三、用户手册

如:(1)输入数据的方式;(2)实现各种功能的操作方式等。
进入程序,首先会出现一个选择操作菜单。
1.insert 2.search by StuID 3.delete by StuID 4.merge 5.reverse 6.output 7.exit
输入上述之一的数字后回车即可进入相应的操作功能,退出程序请按7。
输入1将插入数据,程序会提示
How many rows of data do you need to input?
输入你本次要插入的学生信息总行数,如果输入行数小于1,将会提示输入的行数不能小于1,要求重新输入直到输入的行数大于0,会显示
input the %d row data format as:class_id,student_id,grade
请按顺序输入学生班级,学号和成绩,到遇到输入班级不是0或1、学号小于0和成绩小于0的异常输入,将会提示您重新输入,直到正确输入完要求输入的行数的数据后再次显示选择菜单。
特色:输入已存在于链表的学号(同一班级)时,会提示
学号为XXX的学生信息已存在,请重新输入:
验证数据:
输入
1,190110424,99
1,190110424,98
输出
学号为190110424的学生信息已存在,请重新输入:

输入2,进入按学号查找学生信息的功能,程序会提示
input the data format as: ClassID, StuID
按照指示依次输入班级和学号,如果输入的班级不是1或2,或者输入学号小于0,将直接输出未找到,否则,将进入所在班级表中进行查找,找到则输出该学生的信息,否则输出未找到。

输入3,进入按学号删除学生信息的功能,程序会提示
input the data format as: ClassID, StuID
按照指示依次输入班级和学号,如果输入的班级不是0或1,或者输入学号小于0,将直接输出未找到,否则,将进入所在班级表中进行查找,找到则删除该学生的信息,否则输出未找到。

输入4,将进入合并两个班级成绩的功能,无需输入,程序会按降序输出两个班级合并后学生成绩情况 ,其中既包含0班同学也包含1班同学,同时降序性不变。

输入5,将进入翻转合并两个班级的链表的功能,无需输入,如果之前未执行操作4的合并操作,程序将提示为空表,否则程序会按升序输出两个班级合并后学生成绩情况 ,即翻转了降序排列的合并链表。
输入6,将进入输出全部学生成绩的功能,程序将分别输出两个班各自的学习成绩情况,无需输入。

输入7,退出程序。
输入其他数字,都会提示
指令只能为1-7之间的某个整数值

整体特色:
在所有可以输入指令的地方输入非法字符,将提示:
输入的信息中含非法字符,请检查输入格式再请重新输入:
循环直到输入数据符合要求才会继续运行程序。
输入
,,。。
输出
输入的信息中含非法字符,请检查输入格式再请重新输入:

四、结果

程序正确运行的结果截图。
输入1,执行插入数据功能
在这里插入图片描述

输入2,按班级和学号查找学生信息
在这里插入图片描述

输入3,按照班级和学号删除学生信息功能
在这里插入图片描述

输入4,合并两个班级链表功能
在这里插入图片描述

输入5,翻转合并后链表的功能
在这里插入图片描述

输入6,按班级输出所有学生成绩
在这里插入图片描述

输入7退出程序

非法输入
在这里插入图片描述

五、总结

该实验涉及到的数据结构和算法,以及遇到的问题和收获。
这次实验是基于可以动态扩展的线性链表完成的。在按降序插入学生的成绩时,线性链表的延展性强,灵活性高的特点得以充分体现。如若采用静态存储的方式,将提高程序的时间复杂度,且资源的利用率比较低。利用线性链表,可以根据实际情况随时插入数据,并不干扰其他数据的位置。在建立了链表的基础上,删除,查找和输出操作都变得十分简单。同时利用归并算法,巧妙的合并了两个有序的链表,时间和空间的效率都很高。最后采用原地翻转的方式将链表翻转成新的链表,从降序变成升序,管理学生的成绩就变得很方便了。
但是,程序还是存在许多可以改进的地方。比如许多操作需要建立在其他操作已经完成的基础上才能输出,比如如果没有执行合并链表操作就不能执行翻转链表的操作。甚至没有执行过一次插入操作也不能进行查找和删除。虽然并不会导致程序崩溃(直接输出为空表或者没找到),但是会让用户体验变差。可以让用户在执行一个空操作时(链表为空),先转到让链表不为空的操作,先输入数据再执行其他操作,这样提示就可以让用户更加便捷的完成业务。
在设计程序的过程中,收获颇丰。首先是对异常输入的拦截,对于不是整型的非法输入,都进行了有效拦截,防止导致程序崩溃。同时在开发中也学会了如何在一个大框架内填充逻辑,运用所学的知识,将数据结构化成真正实用的工具,极大方便了针对任务的开发任务。在写完程序后,大部分时间都用在了实验报告的完善上,学会了怎样总结实验,利用流程图清楚表达实验过程,填写用户手册,真正完成了一个小项目。这让我对未来的学习充满了希望。

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

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

相关文章

c语言实现b树

概述:B 树(B-tree)是一种自平衡的搜索树数据结构,广泛应用于数据库和文件系统等领域。它的设计旨在提供一种高效的插入、删除和查找操作,同时保持树的平衡,确保各个节点的深度相差不大。 B 树的特点包括&a…

Vue keep-alive的使用和原理解析

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

基于ssm的中文学习系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本中文学习系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

Linux工具-搭建文件服务器

当我们使用linux系统作为开发环境时,经常需要在Linux系统之间、Linux和Windows之间传输文件。 对少量文件进行传输时,可以使用scp工具在两台主机之间实现文件传输: rootubuntu:~$ ssh --help unknown option -- - usage: ssh [-46AaCfGgKkMN…

C语言辨析——这个字符串长度是多少?

1. 问题 请问字符串"\tac\b\b\x41\nc\104\""的长度是多少? 2. 解答 该字符串的长度为10。这10个字符分别是水平制表符\t,a,c,两个退格符\b,\x41对应的字符’A,换行符\n,c&…

R语言【paleobioDB】——pbdb_subtaxa():统计指定类群下的子类群数量

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_subtaxa (data, do.plot, col) Arguments…

NLP论文阅读记录 - 2021 | WOS 基于动态记忆网络的抽取式摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Extractive Summarization Based on Dynamic Memory Network&#xf…

【学习iOS高质量开发】——熟悉Objective-C

文章目录 一、Objective-C的起源1.OC和其它面向对象语言2.OC和C语言3.要点 二、在类的头文件中尽量少引用其他头文件1.OC的文件2.向前声明的好处3.如何正确引入头文件4.要点 三、多用字面量语法,少用与之等价的方法1.何为字面量语法2.字面数值3.字面量数组4.字面量字…

chrome浏览器开启硬件加速无法打开提示“此设置有你的管理员管理“

chrome浏览器开启硬件加速无法打开提示"此设置有你的管理员管理" winR 输入regedit 打开注册表注册表搜索 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome删除 HardwareAccelerationModeEnabled重启Chrome浏览器。打开Chrome浏览器,查看设置…

【Java数据结构 -- 实现双链表的接口方法】

双链表 1.双链表2.双链表的创建3.双链表的头插节点4.双链表尾插5.双链表根据索引找节点6.双链表根据索引插入节点7.双链表删除值为key的节点8.删除所有值为key的节点9.双链表是否包含值为key节点10.双链表大小11.清空双链表12.打印双链表 1.双链表 双链表是一种数据结构&#…

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码,请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析(Singular Spectrum Analysis)是一种处理非线性时间序列数据的方法,可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…

部署YUM仓库及NFS共享存储

引言: 学习YUM 软件仓库,可以完成安装、卸载、自动升级 rpm 软件包等任务,能够自动 查找并解决 rpm 包之间的依赖关系,而无须管理员逐个、手工地去安装每个 rpm 包,使管理员在维护大量 Linux 服务器时更加轻松自如。特…

20240116-【UNITY 学习】增加滑动功能

替换脚本PlayerMovement_02.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerMovement_03 : MonoBehaviour {private float moveSpeed; // 玩家移动速度public float walkSpeed 7; // 行走速度public float sprintSpee…

竞赛保研 基于深度学习的水果识别 设计 开题 技术

1 前言 Hi,大家好,这里是丹成学长,今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/pos…

图像处理:孤立点的检测

图像处理-孤立点的检测 孤立点的检测在图像处理中通常涉及到检测图像中的突变或者边缘,而使用二阶导数是一种常见的方法。一阶导数可以帮助找到图像中的边缘,而二阶导数则有助于检测边缘上的峰值,这些峰值可能对应于孤立点或者特殊的图像结构…

2024美赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

帆软笔记-决策表报对象使用(两表格联动)

效果描述如下: 数据库中有个聚合商表,和一个储能表,储能属于聚合商,桩表中有个字段是所属聚合商。 要求帆软有2个表格,点击某个聚合商,展示指定的储能数据。 操作: 帆软选中表格单元&#xf…

Windows Server 2019配置DNS服务器

正文共:1234 字 31 图,预估阅读时间:1 分钟 我们在给Windows Server添加角色和功能时,会发现有一项“远程桌面服务安装”,它的介绍为“为虚拟桌面基础结构(Virtual Desktop Infrastructure,VDI&…

PyTorch Tutorial 2.0

这里是对于PyTorch Tutorial-CSDN博客的补充,但是与其相关的NLP内容无关,只是一些基础的PyTorch用法的记录,主要目的是能够自己生成一些模拟的数据集。先介绍随机数的目的是因为based on随机数方法。 当然在看随机数的方法的时候&#xff0c…

Python 最新版本 3.12.1 环境配置(windows)

文章目录 python 3.12.1环境安装3.12.1 网盘下载3.12.1 官网下载 python 安装完成测试第一个 python 程序Hello Python python 3.12.1环境安装 3.12.1 网盘下载 python 3.12.1 百度网盘地址:https://pan.baidu.com/s/1SAcH_uH0T3DiERn6AZeQlg?pwd4242 提取码&a…