数据结构课程设计教学大纲.docx
《数据结构课程设计教学大纲.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计教学大纲.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构课程设计教学大纲
《数据结构课程设计》教学大纲
DataStructureCourseDesign
一、课程的性质、教学目的和要求
《数据结构》是计算机软件的一门基础课程,计算机科学各领域及有关的应用软件都要用到各种类型的数据结构。
学好数据结构对掌握实际编程能力是很有帮助的。
为了学好《数据结构》,必须编写一些在特定数据结构上的算法,通过上机调试,才能更好地掌握各种数据结构及其特点,同时提高解决计算机应用实际问题的能力。
二、设计要点
1.设计和调试过程要规范化。
1需求分析
将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,(有些题目已经指定了数据存储的,按照指定的设计),设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。
给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。
对有些题目提出算法改进方案,比较不同算法的优缺点。
如果程序不能正常运行,写出实现此算法中遇到的问题,和改进方法。
②源程序(可以是一组源程序,即详细设计部分)
源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
程序能够运行,要有基本的容错功能。
尽量避免出现操作错误时出现死循环。
2.课程设计实习报告的书写格式
1设计题目(任选其一)
②运行环境(软、硬件环境)
③算法设计的思想
④算法的流程图
⑤算法设计分析
⑥源代码
⑦运行结果分析
⑧收获及体会
3.实施方式
可设2-3人一题,安排在《数据结构》课程开课学期布置题目,然后在期末前两周完成。
三.设计要求
学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。
课程设计按照教学要求需要1周时间完成,1周中每天至少要上6-8小时的机来调试C语言设计的程序,总共至少要上机调试程序30小时。
为保证质量,需要每个学生将每天的上机调试程序的时间记录下来,作为评判成绩的标准之一。
四.设计题目
1、校园导游程序
[问题描述]
用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
[基本要求]
(1)查询各景点的相关信息;
(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
(4)增加、删除、更新有关景点和道路的信息。
[选作内容]
(1)求多个景点的最佳(最短)游览路径。
(2)区分机动车道和人行道。
(3)实现导游图的仿真界面。
2、算术表达式求值
[问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。
假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:
#(7+15)*(23-28/4)#。
引入表达式起始、结束符是为了方便。
编程利用“算符优先法”求算术表达式的值。
[基本要求]
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
[选作内容]
扩充运算符集合。
引入变量操作数。
操作数类型扩充到实数。
3、文学研究助手
[问题描述]
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
[基本要求]
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
[测试数据]
以你的源程序模拟英文小说,程序语言保留字集作为待统计的词汇集。
[实现提示]
设小说中的词汇一律不跨行。
这样,每读入一行,就统计每个词在这行中的出现次数。
出现位置所在行的行号可以用链表存储。
若某行中出现了不止一次,不必存多个相同的行号。
如果读者希望达到选作部分
(1)和
(2)所提出的要求,则首先应把KMP算法改写成如下的等价形式,再将它推广到多个模式的情形。
[选作内容]
(1)模式匹配要基于KMP算法。
(2)整个统计过程中只对小说文字扫描一遍以提高效率。
(3)假设小说中的每个单词或者从行首开始,或者前置以一个空格符。
利用单词匹配特点另写一个高效的统计程序,与KMP算法统计程序进行效率比较。
(4)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:
定义操作getachar)
4.迷宫求解
[问题描述]
可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
[基本要求]
含有两个以上的迷宫图,由用户选择哪一张迷宫图;
实现深度优先、广度优先两种回溯法。
在上交资料中请写明:
存储结构、基本算法(可以使用程序流程图)、源程序、算法的时间复杂度、另外可以提出算法的改进方法;
[实现提示]
可以用一个二维数组存储迷宫图,值为1或者0分别表示通路和不通;
搜索路径可以参考树的深度优先和广度优先算法。
5.括号匹配的检验
[问题描述]
假设表达式中允许有两种括号:
圆括号和方括号,其嵌套的顺序随意,即CC或[([][])]等为正确格式,[(])或(((]均为不正确的格式。
检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。
例如:
考虑下列的括号序列:
[ ( [ ] [ ] ) ]
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个括号的期待匹配就成了最急迫的任务了,……,依次类推。
可见这个处理过程正好和栈的特点相吻合。
[基本要求]
设置一个栈,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入栈中,若是右括号,则或者是和当前栈顶的括号相匹配,或者是不合法的情况,输出“此串括号匹配不合法”。
在初始和结束时,栈应该是空的。
[测试数据]
输入#([]())#,结果“匹配”
输入#[()]#,结果“此串括号匹配不合法”
#为起始和结束标志。
6.停车场管理
[问题描述]
设停车场内只有一个可停放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)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。
7.简单行编辑程序
[问题描述]
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。
一种解决方法是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按照这种方法实现一个简单的行编辑程序。
设文件每行不超过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<串><回车>。
8.图遍历的演示
[问题描述]
很多涉及图上操作的算法都是以图的遍历操作为基础的。
试写一个程序,演示无向图的遍历操作。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
[测试数据]
由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如单个结点。
[实现提示]
设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。
通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。
注意,生成树的边是有向边,端点顺序不能颠倒。
[选作内容]
(1)借助于栈类型(自己定义和实现)将深度优先遍历用非递归算法实现。
(2)以邻接多重表为存储结构建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树
(3)实现有向图的遍历操作。
9、赫夫曼树的建立
*问题描述:
建立建立最优二叉树函数
*要求:
可以建立函数输入二叉树,并输出其赫夫曼树
在上交资料中请写明:
存储结构、基本算法(可以使用程序流程图)、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
10、图的建立及输出
*问题描述:
建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
11、各种排序
*问题描述:
对30000个随机整数,利用插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。
*输入的数据形式为任何一个正整数,大小不限。
*输出的形式:
数字大小逐个递增的数列?
12、图的遍历
*问题描述:
对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用队列的五种基本运算(置空队列、进队、出队、取队头元素、 判队空)实现图的广度优先搜索周游。
13、线性表的操作
*问题描述:
利作链表的插入运算建立线性链表,然后利用链表的查找、删除、计数、输出等运算反复实现链表的这些操作(插入、删除、查找、计数、输出单独写成函数的形式),并能在屏幕上输出操作前后的结果。
14、编制一个求解迷宫通路的图形界面演示程序。
*问题描述:
1)输入一个任意大小的迷宫,任设起点、终点、障碍,用栈求出一条走出迷宫的路径,并显示在屏幕上。
2)根据用户界面提示,用键盘输入。
Home键设置迷宫起点,End键设终点,上下左右箭头键移动,Enter键添加墙,Del键删除墙,完成后按F9键演示,Esc键退出。
3)橙色的实心小圆圈表示起点,绿色实心圆圈表示终点,空心圆圈表示足迹,红色方块表示墙。
4)本程序只求出一条成功的通路,但若对求解函数MazePath稍加更改即可求得全部路径。
此外,因受图形界面限制,不能保存或载入测试文件(此功能可在Maze_text中实现)。
5)当未输入起点时,消息显示“Error:
YoumustsetStartplace.”;未输入终点时,显示“Error:
YoumustsetEndplace.”找到路径时,屏幕显示足迹,并在消息框出现Pathfound,否则消去足迹,显示Pathnotfound.
15.一元稀疏多项式计算器
*问题描述:
一元多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第I项的系数和指数,序列指指数降序排列;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b。
*实现提示:
用带头结点的单链表存储多项式,多项式的项数存在头结点。
16.算术表达式求值演示
*问题描述:
表达式求值是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
*基本要求:
以字符序列的形式从终端上输入语法正确的、不含变量的整数表达式。
利用教材中给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教材例3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
*实现提示:
(1)设置运算栈和运算数栈辅助分析算符优先关系。
(2)在输入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算。
(3)在识别出运算数的同时,要将其字符序列形式转换成整数形式。
*选作内容:
(1)扩充运算符集,如增加乘方、单目减、赋值等运算;
(2)运算量可以是变量;(3)运算量可以是实数类型;(4)计数器的功能和仿镇界面。
17.稀疏矩阵运算器
*问题描述:
稀疏矩阵是指那些多数元素为0的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本原酸的运算器。
*基本要求:
以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示,而运算结构的矩阵则以通常的阵列形式列出。
*实现提示:
(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。
可设矩阵的行数和列数均不超过20。
(2)程序可以对三元组的输入顺序加以限制,例如,按行优先。
注意研究教科书中的算法,以便提高计算效率。
(3)在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可以用二维数组存放。
18.图书管理
*问题描述:
图书管理基本业务活动包括:
对一本书的采编入库、清除库存、借阅和归还等等。
试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。
60
30
20
50,52
70,72
68
71
100
*基本要求:
(1)每种书的登记内容至少包括书号、书名、作者、现存量和总库存量等五4。
(2)作为演示系统,不必使用文件,全部数据可以都在内存存放。
但是由于上述四项基本业务活动都是通过书号(即关键字)进行的,所以要用B树对书号尽力索引,以获得高效率。
(3)系统应实现的操作及功能定义如下:
①采编入库:
新购入一种书,经分类和确定书号后登记到图书帐目中去。
如果这种书在帐目中已有,则只将总库存量增加。
②清除库存:
某种书已无保留价值,将它从图书帐目中注销。
③某种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期限。
④归还:
注销对借阅者的登记,改变该书的现存量。
⑤显示:
以凹入表的形式显示B树。
这个操作是为了调试和维护的目的而设置的。
下列B树的打印格式如下所示:
19、文章编辑
*问题描述:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行。
*要求
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
*存储结构使用线性表,分别用几个子函数实现相应的功能;
*输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
*输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
20、回文判断
[问题描述]
试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1 & 序列2’模式的字符序列。
其中序列1和序列2 中都不含字符‘&’,且序列2 是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
[实现提示]
首先,序列1进栈,然后序列1出栈并与序列2比较。
21、建立二叉树,层序、先序遍历(用递归或非递归的方法都可以)
*问题描述:
要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数;
五、参考书目
《数据结构C语言》严蔚敏清华大学出版社
《c语言程序设计》谭浩强清华大学出版社
《数据结构》高教出版社
《数据结构习题》李春保清华大学出版社
《数据结构习题》严蔚敏清华大学出版社
《c语言与数据结构》王立柱清华大学出版社
《数据结构(C语言篇)习题与解析》李春葆清华大学出版社
计算机软件教研室
2004年1月7日