数据结构课设总结

临近学期末,我们最后一个比较重要的任务就是做数据结构课设,我对于这戏课设还是比较重视的,因为这是对本学期我所学数据结构中算法一次的应用机会。本来想着挺难的,但做了之后吗,觉得没想像的那么难。做完之后就是一堆报告还有期末考,没机会总结。今天是放假第一天,我下午一点才起来,为了弥补内心的愧疚之感,做点事情吧!就总结下数据结构课设!
我主要想总结的东西列在下面了。就照这个写吧!

  • 【1】必选建立哈夫曼树,并能实现对文本数据的压缩与解压。
    • 文件中中文频率的统计。
    • 应用编码压缩源文件。
    • 解压时读取压缩文件,并将压缩文件中的信息还原为源文件中的信息。
  • 【2】产生随机迷宫,并找到从入口到出口的最短通路。
    • 关于BFS那些事(随机迷宫的产生是套网上的算法)。
  • 【3】实现一个学校的导航系统。
    • 边集和地点的存储管理。
    • 最短路径再探索。
  • 【4】实现效果演示。

文件压缩与解压

在这一部分,我主要说一下往文本中压缩信息和解压信息的一些关键解决策略。不会再说建立哈夫曼树的算法了。

  • 中文(包括标点符号)的统计

我所用的系统是ubuntu18.10,在这个系统里面utf-8编码一个汉字是3个字节,每个字节对应一个Ascll码。因为在读取源文件时是一个字节一个字节读的所以,所以得有个判断读的字符是否是构成汉字的字符的标准,而我们知道组成汉字的Ascll码要是转换成unsigned char型就都是大于等于128的,所以我们记录字符频率时只要读到Ascll码为128及以上的字符,就设置一个长度为3的字符数组存接下来连续读三次的字符,当然要是英文字符的话还是用这个数组存。读完一个汉字或英文之后,将数组转化成一个string对象,检查这汉字是否已经统计,就只能遍历已经统计过所有的字符,不存在的话加入容器,给该字符串频率自增1;否则就给相应的字符串频率自增1。

  • 应用编码压缩源文件

编码源文件还是要一个个读取源文件的字符,创建压缩文件,以二进制写的形式每次写一个字符长度的数据。
在这里插入图片描述如上所示,因为我们的目的是要按照编码把文件中的字符装换成二进制字节位,然后将这个字节存到文件中,所以我们需要一个长度为8的字符数组arr来存储这些编码,然后将数组中的01编码转换成位中的01。我们得在需要一个字符ch,存储arr中的01转化成位中的二进制01的结果,不如读到A将编码存在第数组中,发现数组只存了5个元素,没满?则读取下一个字符“畅”,提取前三个到数组中,再将数组转换成二进制位中的01,就是以上表达式,转换后,将字符ch以二进制的形式写入到二进制文件中,再清空arr并初始化ch继续读写。(最后一个字节可能不是所有编码都是有效的,要将有效的长度记录下来,解压时才能准确解出来。同时再压缩时记录文件中的有效字节数)

  • 解压时读取压缩文件

在这里插入图片描述解压文件当然还是看你原来是怎么压得,现在就怎么解,创建文本文件,没翻译出来一个汉字或英文,就写入文件。在这里插入图片描述
以二进制形式读取压缩文件,每次一个字节长度,并与ch1中的元素做与运算,根据每次返回的0或1决定走哈夫曼树的左或者右。直到走到叶子节点,将数据写到解压文件中,要是一个字节没与运算完,就从当前的数组下标继续与,与完一个字节后,再从压缩文件中读取一个字节,从数组下标为0的地方作与运算。就此不断重复,直到将所有有效字节与完,在与最后一个字节时,根据之前记录的长度与即可!最后整个压缩文件将被解压完成啦。

随机迷宫

走迷宫就是BFS算法的典型应用,主要实现统计路径的过程,BFS算法应用队列,从起点出发,查询与其相邻的节点是否满足指定条件,满足就加入到队列中,然后弹出和访问队头元素,每次与到满足要求的节点就将该节点的上一个节点记录到该节点中。之后的工作就这样不断重复,直到判断走到终点,然后又从终点出发,不断找他的上一个节点,找到起点即可,这个过程应该用链表的头插法记录下来,则链表中最终存的就是从迷宫起点到终点的最短路径。最后设置sleep 函数和clear系统调用显示最短路径走的过程。
刚开始产生迷宫使用随机数产生的,但是当迷宫规模很大时,就不行了,大部分情况下是没有通路的,老师提示我在网上有相关算法,然后就做”搬砖“的动作套用了网上的算法,没有深入研究就直接修改了网上的代码让它按要求产生有通路的迷宫,这个算是搬砖吧!

校园导航

  • 边集和地点集的存储和管理
    地点集
    在这里插入图片描述

地点集第一列存的是各个地点的id,第二列是名称,第三列是与其相邻的地点的个数,紧接着后面的是相邻的地点的id。每次进入程序都要将这些信息存到容器中。然后提供一些服务。
边集
在这里插入图片描述
这个就是模拟临界矩阵来存储边集,分别是行列坐标,一些可有可无的权值。进入程序初始化时要将这些信息录入到容器中。

  • 最短路径再探究

迪杰斯特拉算法主要需要以下数据:
tag标记:标记该节点最短路径是否已经确定。
邻接矩阵map(可由邻接表转化):根据节点id存数据,即就是如果节点位于第n行则id就是n,id不能是0。
previous数组:记录当前的节点的上一个节点,若为id1的起点可设置precious[id1]=-1,在之后作为判断起点的条件。
dist数组:存各个节点到起点的最短距离。
算法实现步骤,要是讲的话,说的太罗嗦就毁博客了,我推荐一个视频,老师讲的很清楚,是人都能听懂的迪杰斯特拉算法,这不是做广告哈!我和这个老师不是亲戚!纯粹推技术的。

实现效果演示

文件压缩与解压:

.source后缀时源文件,.czip是压缩文件,.unczip是解压文件,文件大小可以进行对比,确实实现了压缩的效果
在这里插入图片描述
下面是分别是1.压缩文件,2.解压文件,0.源文件文件中的内容
在这里插入图片描述
迷宫

迷宫的存储首行存的是迷宫规模信息
在这里插入图片描述
走迷宫(图太丑)
在这里插入图片描述

校园导航

在这里插入图片描述
在这里插入图片描述
地点信息查询
在这里插入图片描述
最短路径查找(中间的数字是previous里面的值,不必在意)
在这里插入图片描述
本次数据结构课设完了,这是所有源代码

课程设计题目 一、必做题。 1、链表排序 任务 : (1)从文件读入30个无序整数,建立一个单链表,排序输出、再倒序输出。 (2)从文件A读入30个无序整数,建立一个递增的单链表A并输出,从文件B读入30个无序整数,建立一个递增的单链表B并输出,在A中求递增的并集。 (3)从文件读入30个学生成绩(0-100之间),建立一个双向循环链表并输出,调整链表顺序,使所有的及格成绩排在不及格成绩之前,并输出。 2、二叉树的应用 任务 :编程实现二叉树的建立,层次遍历,(递归和非递归方法)先序、中序、后序,二叉树的高度、宽度。二叉排序树的建立、插入、删除; 基本要求:从文件中读入建树信息,树的节点数目不小于20个,树的高度不小于5; 3、校园局域网布线和游历问题 任务 :用无向网表示你所在学校的主要建筑平面图,图中顶点表示主要建筑,图中的边表示建筑之间的道路,存放路径长度信息。要求能够建立校园局域网,所花的代价最小;给出任意建筑之间游历的最短路径。 基本要求: (1) 原始数据存在文件中,方便读入; (2) 建筑物点不小于20个,边不小于30个; (3) 分别用广度优先和深度优先的方法遍历图,起始点定为1号教学楼; (4) 建立校园局域网,要求所花的代价最小; (5) 查询从1号教学楼到其他各点的最短路径; (6) 查询图中任意两个建筑间的最短路径。 4、Hash表应用 任务 :计散列表实现电话号码查找系统。 基本要求: 1) 每个记录有下列数据项:电话号码、用户名、地址; 2) 从键盘或文件输入各记录,不少于30个,以电话号码为关键字建立散列表; 3) 采用链地址的方法解决冲突; 4) 查找并显示给定电话号码的记录; 5、排序算法比较 任务 :利用随机函数产生10个样本(其中之一已为正序,之一为倒序),每个样本有20000随机整数,利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序(递归和非递归),基数排序八种排序方法进行排序(结果为由小到大的顺序),并统计每一种排序所耗费的平均时间 二、选做题。 1、 运动会分数统计 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己定。(m=10 , w=8 , n=15) 功能要求: 1).可以输入各个项目的前三名或前五名的成绩; 2).能统计各学校总分(用链表); 3).可以按学校编号、学校总分、男女团体总分排序输出(快速、基数); 4).可按学校编号查询学校某个项目的情况;可按项目编号查询前三或前五名的学校。 界面要求:有合理的提示,每个功能可以立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己计,但是要求运动会的相关数据要存储在数据文件中。 测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明; 2、 迷宫求解 任务:可以读入一个任意大小的迷宫数据,分别用广度和深度搜索的方法求出一条走出迷宫的路径,并将路径输出(最佳路径); 要求:以较为直观的方式显示结果 3、 Huffman编码 任务 :对一篇英文文章,统计各字符出现的次数,实现Huffman编码; 要求:输出每个字符出现的次数和编码,其中求最小权值要求用堆实现; 4、营业窗口队列模拟 任务:实现具有n(n=3)个窗口的现实队列模拟,统计每人的等待时间。 要求: 1). 随机产生顾客的到达时间和服务时间存盘。 2). 利用存盘数据实现队列的插入和删除。 2). 当有顾客离开时,根据队列长度调整队尾。 3). 考虑顾客中途离队的情况。 4). 考虑顾客具有优先级的情况。 5、公交线路提示 任务:建立南京主要公交线路图。 要求:输入任意两站点,给出最佳的乘车线路和转车地点。 路线信息可上网查询 6、家谱管理系统 任务:实现具有下列功能的家谱管理系统 功能要求: 1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。 2). 实现数据的存盘和读盘。 3). 以图形方式显示家谱。 4). 显示第n 代所有人的信息。 5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 6). 按照出生日期查询成员名单。 7). 输入两人姓名,确定其关系。 8). 某成员添加孩子。 9). 删除某成员(若其还有后代,则一并删除)。 10).修改某成员信息。 11).按出生日期对家谱中所有人排序。 12).打开一家谱时,提示当天生日的健在成员。 要求:建立至少30个成员,以较为直观的方式显示结果,并提供文稿形式以便检查。 界面要求:有合理的提示,每个功能可以立菜单,根据提示,可以完成相关的功能。 存储结构:学生自己根据系统功能要求自己计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明; 7、算术表达式求值 任务: 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 要求: (1) 从键盘读入一个合法的算术表达式,输出正确的结果。 (2) 显示输入序列和栈的变化过程。 8、电子小字典 任务:建立一个微型电子字典,实现生词的加入,单词的查找、删除,修改等操作。 数据结构:键树 9、稀疏矩阵相乘 任务:以三元组形式存储稀疏矩阵,实现矩阵相乘 10、平衡二叉树 任务:平衡二叉树的建立、结点的插入和删除。 11、B-树 任务:3阶B-树的结点的插入和删除。 12、编写“连连看”程序。 13、……(自选合适的题目) 成绩评定细则:(优、良、中、及格、不及格五等级) 1. 正确性:程序是否可以运行,结果是否正确(20%) 2. 功能的完备性:是否实现要求的所有子功能(20%) 3. 课程设计报告中的算法说明,课程设计报告中总结(20%) 4. 独立完成情况( 40%) 加分项目: 1.工作量和选题难度 2.可读性:代码编写是否规范,是否便于阅读。如函数、变量命名,‘{ }’的缩进,关键位置适量注释等 3.功能的完善:除要求实现的功能外,完成了其它的功能,实现了功能的完善 4.健壮性:异常处理的情况 5.界面的计:可视化界面,或者交互良好的DOS界面 6. ……(自荐加分项目) 代码量要求:>=2500行。 代码总量 = 题目1 代码量 + 题目2 代码量…… 若代码总量低于2500行,则成绩按比例打折。 编程语言:C或C++语言 编程环境:Microsoft Visual C++ 6.0 检查方式:一对一上机检查 总体上检查程序的代码量,正确性,可读性,健壮性,功能的完备性,程序的结构是否合理;根据实际情况进行详细的程序代码检查。 时间安排: 1 上机时间安排 2课程设计检查时间 3 课程设计报告上交时间 课程设计报告要求: 1.课程设计报告封面:包括题名称、班级、学号、学生姓名、成绩和指导教师; 2.课程设计报告目录:每部分内容所在页码; 3.需求分析:给出每道题的需求; 4.概要计:给出每道题采用的数据结构,算法计思想,算法的时间复杂度; 5.详细计:给出每道题的源程序,并在必要的代码处给出注释; 6.功能测试:给出每道题的测试数据和结果; 7.完成情况:每道题完成部分和未完成部分,自己最满意的部分; 8.代码量:每道题代码的行数和总行数; 9.心得体会:包括课程设计中遇到的问题,如何解决,编程的体验,感想和建议; 10.课程设计报告的电子文档在检查后一周内上交班长。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值