C/C++数据结构课程设计[长春理工大学计算机科学技术学院2022秋季学期]
长春理工大学计算机科学技术学院
2022 秋季学期数据结构课程设计
一、目的:
巩固数据结构与算法课内知识,锻炼团队协作能力,提高对数据结构整体的理解和综合
运用能力。
二、要求:
(1)完成题目方式
题目任选,组队或独立完成,队内分工明确。其中,选择加“#”号题目的小组,组内
成员不超过 2 人;选择加“”号题目的小组,组内成员不超过 4 人;选择未添加标记题目
的小组,组内成员不超过 3 人,每组上交一个程序代码压缩包,以班号+学号命名;每人独
立撰写一份设计报告,详细叙述自己负责的部分工作(利用了什么数据结构知识,报告中不
要出现长篇代码),流程图等图表需规范;程序设计语言任意。
(2)考核方式
成绩由报告+程序构成。在最后一次课上主动答辩的组,将给与加分考虑;完成加的题
目,将给与加分考虑。
三、时间:
18 周
四、地点:
实训大楼实验室
五、指导教师:赵家石、张婧、陈克寒、李锦青
六、题目
源码
https://pan.baidu.com/s/1pq1Nwwo0hlc_J84F93HM4A?pwd=1111
1、建通讯录
设计内容:
设计散列表实现通讯录查找系统,使得平均查找长度不超过 2,完成相应的建表和查表
程序。
设计要求:
(1) 设每个记录有下列数据项:用户名、电话号码、地址;
(2) 从键盘输入各记录,分别以姓名为关键字建立散列表;
(3) 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有 30 个,取平均
查找长度的上限为 2;
(4) 构造哈希函数,可采用除留余数法,采用二次探测再散列法解决冲突;
(5) 查找并显示给定电话号码的记录;
(6) 通讯录信息保存。
2、哈夫曼编码与译码
设计内容:
(1) 输入一个文本,统计各字符出现的频度,输出结果;
(2) 使用字符出现的频度构造哈夫曼树;
(3 ) 确定和输出各字符的哈夫曼码;
(4) 输入一个由 0 和 1 组成的代码序列,翻译并输出与之对应的文体,若最后的代码子
序列不能译为文本,则输出相关信息。
3、乡卫生所选址
设计内容:
某乡有 A,B,C,D,E 5 个村庄,如下图所示,图中边上的权值表示两村之间的距离。
现要在 5 个村庄中选某个村庄建立卫生所。其选址应使得距离卫生所最远的村庄到卫生所
最近。
3
8 10
6 6 4
设计要求:
(1) 给出各村庄之间最短距离的矩阵 A;
(2) 卫生所应设在哪个村庄?输出各村庄到卫生所的路径和路径长度。
4、 文章编辑
设计内容:
输入一页文字,程序可以统计出文字、数字、空格的个数;
(1)静态存储一页文章,每行最多不超过 80 个字符,共 N 行;
(2)分别统计出其中英文字母数和空格数及整篇文章总字数;
(3)统计某一字符串在文章中出现的次数,并输出该次数;
(4)删除某一子串,并将后面的字符前移。
设计要求:
存储结构使用顺序表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可
以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分 4 行输出“全部字母数”、“数字个数”、“空格个数”、“文章总字数”;
(3)输出删除某一字符串后的文章。
5、文本的查找与替换
设计内容:
(1) 在文件中读入一段英文文章;
(2) 输入要查找的单词或字母,输入替换的单词或字母,把文章中的内容按输入替
换;
(3) 统计替换单词或字母的个数。
6、算术表达式求值
设计内容:
(1) 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形
式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结
束;
(2) 算法输出:表达式运算结果。
7、二叉树用二叉链表表示
A
E C
D
B
设计内容:
(1) 实现二叉树的建立、前序、中序(非递归)和层次遍历;
(2) 求二叉树高度、结点数、度为 1 的结点数和叶子结点数;
(3) 插入结点到指定位置、删除指定结点;
(4) 将二叉树所有结点的左右子树交换。
8、词频统计
设计内容:
要求是从文件中导入一篇英文文章,文中各个单词以一个空格区分,文章中单词个数不
定,可能会很大,能统计出某个单词出现多少次,同时能统计出文章中每个字母出现次数及
相邻两个字母出现的频率。比如:“this is a dog and that is a pig” 中“is”出现了 2 次,“and”
出现了 1 次,t-h 出现两次,i-s 出现三次。
9*、救护车调度模拟系统
设计内容:
设计实现一个用事件驱动的“救护车调度”离散模型,模拟 120 急救中心响应每个病
人的呼救信号统一调度救护车运行的情况。
(1) 我们对问题作适当简化,假设:某城市共有 m 个可能的呼救点(居民小区、工厂、
学校、公司、机关、单位等),分布着 n 所医院(包含在 m 个点中),有 k 辆救护车
分派在各医院待命,出现呼救病人时,由急救中心统一指派救护车接送至最近的医
院救治。救护车完成一次接送任务后即消毒,并回原处继续待命。假定呼救者与急
救中心、急救中心与救护车之间的通讯畅通无阻,也不考虑道路交通堵塞的影响。
可以用m个顶点的无向网来表示 该城市的各地点和道路。时间可以分钟为单位,
路段长可表示为救护车行驶花费的分钟数。(1)模拟每一起病人呼救—派车往救—
接人回院的过程:显示每辆救护车的状态(待命、往救、送院{可能还有返点})和每个
病人的状态(待派车、待接、送院途中),显示各医院的待命救护车队列,实时显示
当前的病人平均接送时间和平均派车延迟时间以及已送达病人数。救护车应按最快
的路线接送病人。
(2) 呼救事件发生的间隔时间和地点都是随机的(其发生频度先给一个省缺值,可实时
调整)。点数 m、点名、路段数 e 和每段长度以及医院点的名称格式为:
ABCDEFGH… … (m 个点名称,大小写代表不同点)
AEGHK… … (n 个医院名称)
AB11,AC15,EG9, … … FK24, (e 条路段及长度)
(3) 救护车总数及分派方案在运行前从键盘输入。
设计要求:
(1 ) 基本要求是救护车只接本医院的病人,病人求救时该院无车就只能等待;
(2) 进一步要求是:最近的医院无车时,派最近的待命救护车。最好还能权衡一下:
是否等待该院的车回来更快?
(3) 还可改进:除了可派正在待命的车外,还可派遣送达外院病人后正在返点的车,
有时它比待命地点离病人更近。难度更高,实际要求这种情况下救护车逐路段地
返回,每到一个点都生成一个事件,较麻烦;
(4)显示界面还可改为更直观漂亮的图形模式,设计更好的显示方案。
10*、校园导游咨询
设计内容:
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
设计要求:
(1) 设计学校的校园平面图,所含景点不少于 10 个,以图中顶点表示校内各景点,
存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条
最短路径及长度。
选作内容:
(1) 求校园图的关键点;
(2) 提供图中任意景点问路查询,即求任意两个景点之间的所有路径;
(3) 提供校园图中多个景点的最佳路线查询,即求途经这多个景点的最佳(短)路径;
(4) 校园导游图的景点和道路的修改扩充功能;
(5) 扩充道路信息,如道路类别(车道、人行道等),沿途景色等级,以至可按客人所
需分别查询人行路径或车街上路径或观景路径等;
(6) 扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
11、散列表的设计与实现
设计内容:设计散列表实现电话号码查找系统。
设计要求:
(1) 设每个记录有下列数据项:用户名、电话号码、地址;
(2) 从键盘输入各记录,以用户名(汉语拼音形式)为关键字建立散列表;
(3) 采用一定的方法解决冲突;
(4) 查找并显示给定电话号码的记录。
12#、排序综合
设计内容:
利用随机函数产生 N 个随机整数(20000 以上),对这些数进行多种方法进行排序。
设计要求:
(1) 至少采用三种方法(希尔排序、快速排序、堆排序)实现上述问题求解;
(2) 统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),
找出其中两种较快的方法;
(3) 统计每种算法所用的比较次数和交换次数,最后列表显示;
(4) 如果采用 4 种或 4 种以上的方法者,可适当加分。
13#、一元稀疏多项式的计算
设计内容:
能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,
并将结果输出;
设计要求:
以链式存储结构实现多项式。
14*、运动会分数统计
设计内容:
参加运动会有 n 个学校,学校编号为 1……n。比赛分成 m 个男子项目,和 w 个女
子项目。项目编号为男子 1……m,女子 m+1……m+w。不同的项目取前五名或前三名积
分;取前五名的积分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取
前五名或前三名由学生自己设定。(m<=20,n<=20)
设计要求:
(1) 输入各个项目的前三名或前五名的成绩,能统计各学校总分;
(2) 按学校编号或名称、学校总分、男女团体总分排序输出;
(3) 按学校编号查询学校某个项目的情况,按项目编号查询取得前三或前五名的学
校;
(4) 数据存入文件并能随时查询 ;
(5) 规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称;
(6) 输出形式:有合理的提示,各学校分数为整形;
(7) 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,完成相关的功
能;
15*、新产品研制工序序列
设计内容:
一个农业生产工具制造厂,完成一件农用新产品研制工程的各个工序以及相互之间的关
系如图所示。只有各子工序顺利完成,完整的新产品才能研制完成。由于资源等条件的限制,
需要一项一项地安排实施各个工序,请给出使新产品顺利完成的各个工序安排的可行方案。
设计要求:
(1) 选用一种存储结构,实现网络图的存储。
(2) 定义另一种存储结构,不在通过用户输入,而是直接将(1)中的存储结构中的数
据导过来,编写算法实现此功能。
(3) 求出并输出保证工程顺利完成的各个工序按时间先后排列的一个线性序列。
工序表
工序代号 工序名称 紧前工序
A 产品设计 --
B 工艺设计 --
C 主件制造 A B
D 下料,锻件加工 A
E 外购配套件 A
F 模具制造 C
G 组装 D E F
H 调试试用 G
16#、插入/交换排序算法效率的比较
设计内容:
随机产生若干组数据元素序列,分别使用不同的插入/交换排序算法排序,统计它们各
自基本操作的次数,以此作为标准,评价交换排序算法的效率。
其中:基本操作包括记录的移动和关键字的比较。
设计要求:
待排序数据元素序列的长度分别取不同的值,每个规模的数据元素序列取值组数由用户
确定。
选做内容:
(1)系统功能的完善;
(2)设计不同的散列函数,比较冲突率;
(3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度
的变化。
17*、以队列实现的仿真技术预测理发馆的经营状况
设计内容:
理发馆一天的工作过程如下:
(1) 理发馆有 N 把理发椅,可同时为 N 位顾客进行理发。
(2) 理发师分三个等级(一级、二级、三级),对应不同的服务收费。
(3) 当顾客进门时,需选择某级别理发师,只要该级别的理发师有空椅,则可立即
坐下理发,否则需排队等候。
(4) 一旦该级别的理发师有顾客理发完离去,排在队头的顾客便可开始理发。
(5) 若理发馆每天连续营业 T 分钟,求
a) 一天内顾客在理发馆内的平均逗留时间;
b) 顾客排队等候理发的队列长度平均值;
c) 营业时间到点后仍需完成服务的收尾工作时间;
d) 统计每天的营业额;
e) 统计每天不同级别理发师的创收。
设计要求:
(1) 模拟理发馆一天的工作过程:必须采用事件驱动的离散模型(参考教科书 3.5
节离散事件模拟 p65);
(2) 每个顾客到达和下一顾客到达时间的间隔应是随机的;
(3) 理发师编号、理发师级别和每天的营业时间由用户输入;
(4) 某顾客挑选某一个级别的理发师而不得时,选第一个队列排队等待 ;
(5) 每个顾客进门时将生成三个随机数:
a) durtime:进门顾客理发所需服务时间(简称:理发时间);
b) intertime:下一顾客将到达的时间间隔(简称:间隔时间);
c) select:服务选项 ;
(6) 服务收费:应包含服务时间和理发师级别两个因素。
(7) 除了输出统计的数据外,还需要显示理发馆的状态,可以采用文本方式(横向
显示每张椅编号、理发师级别。纵向表示等待该理发师理发的排队长度)。
问题讨论:
(1) 顾客排队前,可以在等待该级别各个理发师的各个队列中,选择最短队列;
(2) 更进一步,顾客可以选择最快队列(设计选最快的策略);
(3) 可以发挥创造性,采用更直观漂亮的图形方式显示理发馆的状态。