数据结构课程设计题.docx
《数据结构课程设计题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计题.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构课程设计题
“数据结构”课程设计题目
1、城市链表
[问题描述]
将若干城市的信息,存入一个带头结点的单链表。
结点中的城市信息包括:
城市名,城市的位置坐标。
要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
[基本要求]
(1)给定一个城市名,返回其位置坐标;
(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
2、约瑟夫生死者游戏
[问题描述]
约瑟夫(Joeph)问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
[基本要求]
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
[测试数据]
m的初值为20;密码:
3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。
[实现提示]
程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。
设n≤30。
[选作内容]
向上述程序中添加在顺序结构上实现的部分。
3、括号匹配的检验
[问题描述]
假设表达式中允许有两种括号:
圆括号和方括号,其嵌套的顺序随意,即(()[])或[([][])]等为正确格式,[(])或(((]均为不正确的格式。
检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。
例如:
考虑下列的括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号的出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的第7个括号“)”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,……,依次类推。
可见这个处理过程正好和栈的特点相吻合。
[基本要求]
读入圆括号和方括号的任意序列,输出“匹配”或“此串括号匹配不合法”。
[测试数据]
输入([]()),结果“匹配”
输入[()],结果“此串括号匹配不合法”
[实现提示]
设置一个栈,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入栈中;若是右括号,并且与当前栈顶的左括号相匹配,则将当前栈顶的左括号退出,继续读下一个括号,如果读入的右括号与当前栈顶的左括号不匹配,则属于不合法的情况。
在初始和结束时,栈应该是空的。
[选作内容]
考虑增加大括号的情况。
4、停车场管理
[问题描述]
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
[测试数据]
设n=2,输入数据为:
(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表实现。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:
汽车的牌照号码和进入停车场的时刻。
[选作内容]
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
(4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。
5、简单行编辑程序。
[问题描述]
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。
一种解决方法是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按照这种方法实现一个简单的行编辑程序。
设文件每行不超过320个字符,很少超过80字符。
[基本要求]
实现以下4条基本编辑命令:
(1)行插入。
格式:
i<行号><回车><文本><回车>
将<文本>插入活区中第<行号>行之后
(2)行删除。
格式:
d<行号1>[□<行号2>]<回车>
删除活区中第<行号1>行(到第<行号2>行)。
两种格式的例子是:
“d10↙”和“d10□14↙”(3)活区切换。
格式:
n<回车>
将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。
格式:
p<回车>
逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后各页(如果存在)。
印出的每一行要前置以行号和一个空格符,行号固定占4位,增量为1。
各条命令中的行号均须在活区中各行行号范围之内,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如首行、尾行。
[实现提示]
(1)设活区的大小用行数activemaxlen(可设为100)来描述。
考虑到文本文件行长通常为正态分布,且峰值在60到70之间,用320×activemaxlen大小的字符数组实现存储将造成大量浪费。
可以以标准行块为单位为各行分配存储,每个标准行块含81个字符。
这些行块可以组成一个数组,也可以利用动态链表连接起来。
一行文字可能占多个行块。
行尾可用一个特殊的ASCII字符(如(012)8)标识。
此外,还应记住活区起始行号。
行插入将引起随后各行行号的顺序下推。
(2)初始化过程包括:
请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。
然后尽可能多地从输入文件中读入各行,但不超过activemaxlen-x。
x的值可以自定,例如20。
(3)在执行行插入命令的过程中,每接收到一行时到要检查活区大小是否已达activemaxlen。
如果是,则为了在插入这一行之后仍保持活区大小不超过activemaxlen,应将插入点之前的活区部分中第一行输出到输出文件中;若插入点为第一行之前,则只得将新插入的这一行输出。
(4)若输入文件尚未读完,活区切换命令可将原活区中最后几行留在活区顶部,以保持阅读连续性;否则,它意味着结束编辑或开始编辑另一个文件。
(5)可令前三条命令执行后自动调用活区显示。
[选作内容]
(1)对于命令格式非法等一切错误作严格检查和适当处理。
(2)加入更复杂的编辑操作,如对某行进行串替换;在活区内进行模式匹配等,格式可以为S<行号>@<串1>@<串2><回车>和m<串><回车>。
6、校园导游程序
[问题描述]
用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
[基本要求]
(1)查询各景点的相关信息;
(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
(4)增加、删除、更新有关景点和道路的信息。
[选作内容]
(1)求多个景点的最佳(最短)游览路径。
(2)区分机动车道和人行道。
(3)实现导游图的仿真界面。
7、员工管理系统
[问题描述]
每个员工的信息包括:
编号、姓名、性别、出生年月、学历、职务、电话、住址等。
系统能够完成员工信息的查询、更新、插入、删除、排序等功能。
[基本要求]
(1)排序:
按不同关键字,对所有员工的信息进行排序。
(2)查询:
按特定条件查找员工。
(3)更新:
按编号对某个员工的某项信息进行修改。
(4)插入:
加入新员工的信息。
(5)删除:
按编号删除已离职的员工的信息。
[选作内容]
实现图形用户界面。
8、算术表达式求值
[问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。
假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:
#(7+15)*(23-28/4)#。
引入表达式起始、结束符是为了方便。
编程利用“算符优先法”求算术表达式的值。
[基本要求]
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
[选作内容]
扩充运算符集合。
引入变量操作数。
操作数类型扩充到实数。
9、二叉树及应用
(1)二叉树的建立与遍历
[问题描述]
建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。
[测试数据]
ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为先序:
ABCDEGF
中序:
CBEGDFA
后序:
CGBFDBA
[选作内容]
采用非递归算法实现二叉树遍历。
(2)打印二叉树结构
[问题描述]
按凹入表形式横向打印二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。
例如:
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如空二叉树。
[实现提示]
(1)利用RDL遍历方法;
(2)利用结点的深度控制横向位置。
*2、打印树结构
[问题描述]
按凹入表形式打印树形结构。
例如:
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如空树。
[实现提示]
(1)利用树的先根遍历方法;
(2)利用结点的深度控制横向位置。
10、哈夫曼编码-译码
[问题描述]
打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼编/译码系统。
[基本要求]
一个完整的系统应具有以下功能:
(1)I:
初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:
编码(Encoding)。
利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:
译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:
印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码写入文件CodePrint中。
(5)T:
印哈夫曼树(TreePrinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
[测试数据]
新建一个.txt文件,用来存放待处理的数据,这些数据为ASCII码值的集合,而且每种字符的数量并不能相同。
本实验拟设其中的数据为abbcccdddd.
[实现提示]
(1)文件CodeFile的基类型可以设为子界型bit=0..1。
(2)用户界面可以设计为“菜单”方式:
显示上述功能符号,再加上“Q”,表示运行Quit。
请用户键入一个先把功能符,些功能执行完毕后再经菜单,直至某次用户先把了“E”为止。
(3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。
每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。
11、二叉排序树
[问题描述]
从键盘读入一组数据,建立二叉排序树并对其进行查找、遍历、格式化打印等有关操作。
[基本要求]
建立二叉排序树并对其进行查找,包括成功和不成功两种情况,并给出查找长度。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
[选作内容]
实现二叉排序树的插入、删除操作。
12、家族关系查询系统
[问题描述]
建立家族关系数据库,实现对家庭成员的相关查询。
[基本要求]
(1)建立家族关系并能存储到文件中。
(2)实现家族成员的添加。
(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。
[实现提示]
本课程设计使用的数据结构有树状结构和队列。
树状结构采用三叉链表表示,队列采用链式队列实现。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
13、图遍历的演示
[问题描述]
很多涉及图上操作的算法都是以图的遍历操作为基础的。
试写一个程序,演示无向图的遍历操作。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如单个结点。
[实现提示]
设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。
通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。
注意,生成树的边是有向边,端点顺序不能颠倒。
[选作内容]
*
(1)借助于栈类型(自己定义和实现)将深度优先遍历用非递归算法实现。
(2)以邻接多重表为存储结构建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。
(3)实现有向图的遍历操作。
(4)图的最小生树
13、校园导航
[问题描述]
当我们参观黄淮学院校园时,就会遇到这样一个问题:
从当前所处的位置出发去校园另外一个位置,要走什么样的路线?
是选择距离最近还是最省时?
本课程设计实例在给校园各主要建筑的名称信息及有路线连通的建筑之间的距离(或行进时间)的基础上,利用校园导航系统计算出给定的起点到终点之间的距离最近(或行进时间最短)的行进路线。
[基本要求]
(1)从地图文件中读取校园主要建筑信息及建筑间的距离(或行进时间)信息。
(2)计算出给定的起点到终点之间距离最近(或行进时间最短)和行进路线。
(3)输出该路线(包含路过哪些建筑)及其总距离(或总行进时间)。
(4)若输入错误,则给出提示信息。
[实现提示]
本课程设计使用的数据结构是有向网络,采用邻接矩阵作为有向网络的存储结构。
[测试数据]
由学生依据所选校园景点地图自己确定。
14、地铁站建设问题
[问题描述]
某城市要在其各个辖区之间修建地铁来加快经济发展,但由于建设地铁的费用昂贵,因此需要合理安排地铁的建设路线,使乘客可以沿地铁到达各个辖区,并使总的建设费用最小。
[基本要求]
(1)从包含各辖区的地图文件中读入辖区名称和各辖区间的直接距离。
(2)根据读入的各辖区的距离信息,计算出应该建设哪些辖区间的地铁路线。
(3)输出应该建设的地铁路线及所需要建设的总里程信息。
[实现提示]
本课程设计使用的数据结构是无向网络,采用邻接矩阵或作为无向网络的存储结构。
[测试数据]
可以选择一个自己熟悉的城市,了解该城市的各个辖区名称,根据自己所选的数据进行测试。
15、哈希表设计
[问题描述]
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。
[基本要求]
假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
[测试数据]
取读者周围较熟悉的30个人名。
[选作内容]
(1)从教科书上介绍的集中哈希函数构造方法中选出适用者并设计几个不同的哈希函数,比较他们的地址冲突率(可以用更大的名字集合作实验)。
(2)研究这30个人名的特点,努力找一个哈希函数,使得对于不同的拼音名一定不发生地址冲突。
(3)在哈希函数确定的前提下尝试各种不同处理冲突的方法,考察平均查找长度的变化和造好的哈希表中关键字的聚集性。
16、内部排序算法比较
[问题描述]
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
[基本要求]
(1)对以下10种常用的内部排序算法进行比较:
直接插入排序;折半折入排序;二路插入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序;基数排序。
(2)待排序表的表长不少于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。
[测试数据]
由随机产生器决定。
[实现提示]
主要工作是设法在程序中适当的地方插入计数操作。
程序还可以包括计算几组数据得出结果波动大小的解释。
注意分块调试的方法。
[选作内容]
对不同的输入表长做试验,观察检查两个指标相关于表长的变化关系。
还可以对稳定性做验证。
17、统计成绩
[问题描述]
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
[基本要求]
(1)按总数高低次序,打印出名次表,分数相同的为同一名次;
(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
[选作内容]
对各科成绩设置不同的权值。