数据结构实验指导.docx
- 文档编号:30459679
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:40
- 大小:88.77KB
数据结构实验指导.docx
《数据结构实验指导.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导.docx(40页珍藏版)》请在冰豆网上搜索。
数据结构实验指导
数据结构实验指导书
(第一版)
计算机科学与技术系
《数据结构》课程组
目录
1概述1
1.1《数据结构》课程实验的地位与作用1
1.2实验的目的和要求1
1.3本书安排1
2实验环境选择3
3实验类型5
4实验步骤6
4.1验证型实验的一般步骤6
4.2设计型实验和综合型实验的一般步骤6
5实验报告规范9
6实验内容10
6.1实验一线性表10
题目1:
顺序表的基本操作10
题目2:
链表的基本操作11
题目3:
双向链表的基本操作11
题目4:
一元稀疏多项式的表示及基本操作12
题目5:
约瑟夫环12
题目6:
记事本13
6.2实验二栈、队列与递归算法设计13
题目1:
数制转换问题14
题目2:
回文判断14
题目3:
括号匹配的检验15
题目4:
商品货架管理15
题目5:
四则运算实现16
题目6:
停车场管理17
6.3实验三树及其应用18
题目1:
二叉树的建立与遍历18
题目2:
二叉树的层序遍历19
题目3:
二叉排序树19
题目4:
哈夫曼编码设计20
6.4实验四图及其应用20
题目1:
图的邻接矩阵存储和广度优先遍历20
题目2:
图的邻接表存储和深度遍历21
题目3:
最小生成树问题21
题目4:
排课序列22
6.5实验五:
排序与查找的综合应用22
题目1:
查找和排序的基本算法22
题目2:
快速排序23
题目3:
二叉排序树23
题目4:
堆排序算法24
题目5:
统计成绩24
附录A实验报告封面25
附录B实验报告示例26
附录C实验工具使用30
1概述
1.1《数据结构》课程实验的地位与作用
“数据结构”是计算机专业一门重要的专业技术基础课程,是一门关键性核心课程。
本课程系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了多种常用的查找和排序技术,并对其进行了性能分析和比较,内容非常丰富。
本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。
由于以下原因,使得掌握这门课程具有较大难度:
●内容多,时间短,给学习带来困难;
●贯穿全书的动态链表存储结构和递归技术是学习中的重点和难点;
●隐含在各部分的技术和方法丰富,也是学习的重点和难点;
●先修课程中所介绍的专业性知识不多,加大了学习难度。
1.2实验的目的和要求
由于数据结构课程的技术性与实践性,其实践环节十分必要。
为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。
数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。
在掌握基本算法的基础上,掌握分析、解决实际问题的能力。
通过实验实践内容的训练,突出构造性思维训练的特征,提高学生组织数据及编写大型程序的能力。
上机实验是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
较大的实验题比平时的习题要复杂得多,也更接近实际。
实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力。
实验还能使书上的知识变“活”,达到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:
机器是比任何教师都严格的检查者。
1.3本书安排
为了达到上述目的,本书安排了5个实验单元,各单元的训练重点在于基本的数据结构和经典算法。
各单元与教科书的各章只具有粗略的对应关系,某些实验题可能涉及多个部分的教学内容。
在每个单元中安排有难度不等的4~6个实验题目,每人可以从中选做一个实验题。
建议选做难度略高于自己所做过的最难题目的难度,切忌过分追求难题。
较大的综合型题目适合于多人合作。
每个实验题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等5个部分组成。
问题描述旨在为读者建立问题提出的背景环境,指明问题“是什么”;
基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求;
测试数据部分旨在为检查学生上机作业提供方便,在完成实验题时应自己设计完整和严格的测试方案,当数据输入量较大时,提倡以文件形式向程序提供输入数据;
实现提示对实现中的难点及其解法思路等问题作了简要提示;
选做内容向那些尚有余力的实验者提出了更严峻的挑战,同时也能开拓其他读者的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改扩充。
书中题目设计得比较详细,给出了问题说明和问题分解求精的范例,使读者在无形中学会模仿,它起到把读者的思路引上正轨的作用,避免不良结构程序和坏习惯,同时也传授了系统划分方法和程序设计的一些具体技术,保证实现预定的训练意图,使某些难点和重点不会被绕过去,而且也便于教学检查。
题目设计策略是:
一方面使其难度和工作量都较大,另—方面给读者提供的辅助和可以模仿的部分也较多。
当然还应指出的是,提示的实现方法未必是最好的,读者不应拘泥于此,而应争取找出更好的方法和结构。
在实现的时候应注意,要尽量减少依赖于具体机器计算环境的用法,若使用,也应在注释中指出。
这样得出的程序易于在不同机器上运行,有好的可移植性。
C语言是结构化程序设计语言,具有递归能力,可移植性也较好,是特别推荐的实现语言。
本书的另一个特点是为实验制定了严格的规范。
一种普遍存在的错误观念是,调试程序全凭运气。
学生花2个小时的机上时间只找出一个错误,甚至一无所获的情况是常见的。
其原因在于,很多人只认识到找错误,而没有认识到努力预先避免错误的重要性,也不知道应该如何努力。
实际上,结构不好、思路和概念不清的程序可能是根本无法调试正确的。
严格按照实验步骤规范进行实验,不但能有效地避免上述种种问题,更重要的是有利于培养软件工作者不可缺少的科学工作方法和作风。
在附录C中提供了一个完整的实验报告示例,在起到实验报告规格范例作用的同时,还隐含地提供了很多有益的东西,比如基于数据类型的系统划分方法以及所提倡的程序设计风格等等。
计算机学科在不断发展,可以使用的语言工具越来越丰富,在本书中的实验示例是应用面向过程的语言进行设计和编程,同样的实验题,也可以用面向对象的语言来实现。
2实验环境选择
数据结构的抽象数据类型(ADT)特点决定了可以采用多种工具来描述,每种描述工具都有不同的实验环境。
本课程采用类C语言作为描述语言,可采用turboc或者VisualC++6.0集成开发环境。
另外,在实验中,实验者通常对Dos程序、Console程序、Windows程序区分不清,归纳如下:
●DOS程序
过去在DOS环境下开发的程序,称为DOS程序,该类程序以main为程序进入点,可以调用Cruntime函数,但不能调用Win32API函数。
DOS程序仍然可以在Windows的DOSBox中运行。
●Windows程序
DOS编程方式属过程驱动。
Windows编程方式属消息驱动,程序的工作是产生消息,传递消息和处理消息。
Windows系统有一个存放消息的队列,每个应用程序也有一个消息队列。
Windows系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。
应用程序则从自身的队列中获取消息并进行处理。
基本流程见图2.1。
图2.1Windows程序流程
●Console程序(控制台程序)
说到Win32程序,并不是每个都如WindowsGUI程序那么复杂,可以在VisualC++中写一个“DOS-like”程序,而且仍然可以调用部分的,不牵扯到图形使用者接口(GUI)的Win32API函数,这种程序称为Console程序,可以在Console程序中使用部分的MFC类,甚至可以产生行程(processes),产生执行线程(threads)以及虚拟内存的信息。
其功能比以前的DOS程序强大得多。
另一方面,计算机在一个纯粹的“文字窗口”中处理文字的速度很快,程序的操作也比较简单,Console程序不能够调用与GUI有关的各种API函数,所以这种类型的程序速度快,操作简单。
在本课程中,为了将精力更多的集中在数据结构本身上而不是复杂的VisualC++操作平台上,实验者可选择VisualC++中Console程序来实验。
具体怎样建立一个Console程序参见附录C。
3实验类型
数据结构是一门实践性很强的课程,只靠读书和做习题是不能提高实践能力的,尤其是在数据结构中要解决的问题更接近于实际。
数据结构的实验是对学生的一种全面的综合训练,与程序设计语言课程中的实验不同,数据结构课程中的实验多属创造性的活动,需要学生自己分析问题,设计数据结构和算法,再上机调试和测试程序。
数据结构实验是一种自主性很强的学习过程,其教学目的主要有两个:
(1)深化理解和掌握书本上的理论知识,将书本上的知识变“活”;
(2)理论和实践相结合,使学生学会如何把书本上有关数据结构和算法的知识用于解决实际问题,培养数据结构的应用能力和软件工程所需要的实践能力。
为了达到上述目的,本书安排了如下三类实验:
(1)验证型实验:
其主要内容是将书上的重要数据结构上机实现,深化理解和掌握理论知识,这部分的实验不需要学生自己设计,只须将给定的方案实现即可;
(2)设计型实验:
其主要内容是针对具体问题,应用某一个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的简单应用能力;
(3)综合型实验:
其主要内容是针对具体问题,应用某几个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的综合应用能力。
4实验步骤
4.1验证型实验的一般步骤
验证实验安排的内容在书上都能找到具体的实现方法,这些验证实验是学生在学习完一种数据结构后进行的,对于深化理解和掌握相应数据结构具有很重要的意义。
1.预备知识的学习
由于篇幅所限,本书没有整理验证实验所用到的预备知识,但主教材中的相关内容已经叙述得很清楚了,需要学生在实验前复习实验所用的预备知识。
这需要学生有自主的学习意识和整理知识的能力。
2.上机前的准备
将实现提示中给出的数据类型和算法转换为对应的程序,并进行静态检查,尽量减少语法错误和逻辑错误。
很多学生在上机时只带一本数据结构书或实验指导书,而书上只有算法设计而没有实验程序,于是就直接在键盘上输入程序,结果不仅程序的输入速度慢,而且编译后出现很多错误。
上机前的充分准备能高效利用机时,在有限的时间内完成更多的实验内容。
3.上机调试和测试程序
调试程序是一个辛苦但充满乐趣的过程,也是培养程序员素质的一个重要环节。
很多学生都有这样的经历:
花了好长时间去调试程序,错误却越改越多。
究其原因,一方面,是对调试工具不熟悉,出现了错误提示却不知道这种错误是如何产生的;另一方面,没有认识到努力预先避免错误的重要性,也就是对程序进行静态检查。
对程序进行测试,首先须设计测试数据。
在数据结构中测试数据须考虑以下两种情况。
(1)一般情况:
例如循环的中间数据、随机产生的数据等;
(2)特殊情况:
例如循环的边界条件、数据结构的边界条件等。
4.实验报告
在实验后要总结和整理实验报告。
4.2设计型实验和综合型实验的一般步骤
设计实验和综合实验的自主性比较强,涉及到的知识点也比较多,主要目的是为了培养数据结构的应用能力、软件工程的规范训练、团队精神和良好的科学作风。
随着计算机性能的提高,它所面临的软件开发的复杂度也日趋增加,因此软件开发需要系统的方法。
一种常用的软件开发方法,是将软件开发过程分为分析、设计、实现和维护四个阶段。
虽然数据结构课程中的实验题的复杂度远不如实际中真正的软件系统,但为了培养一个软件工作者所应具备的科学工作的方法和作风,我们制订了如下所述完成实验的5个步骤:
1.问题分析和任务定义
在设计实验和综合实验中的问题描述通常都很简洁,因此,首先要充分理解问题,明确问题要求做什么,限制条件是什么,也就是对所要完成的任务做出明确的描述,例如,输入数据的类型、值的范围以及输入的形式,输出数据的类型、值的范围以及输出的形式,哪些属于非法输入,等等。
在问题分析时还应该准备好测试数据。
2.概要设计
概要设计是对问题描述中涉及到的数据定义抽象数据类型,设计数据结构,设计算法的伪代码描述。
在这个过程中,要综合考虑系统的功能,使得系统结构清晰、合理、简单,抽象数据类型尽可能做到数据封闭,基本操作的说明尽可能明确。
而不必过早地考虑存储结构,不必过早地考虑语言的实现细节,不必过早地表述辅助数据结构和局部变量。
3.详细设计
在详细设计阶段,要设计具体的存储结构以及算法所需的辅助数据结构,算法在伪代码的基础上要考虑细节问题并用类C语言描述。
此外,还要设计一定的用户界面。
数据结构课程实验的主要目的是为了培养数据结构的应用能力,因此在实验中不要求图形界面,只要在屏幕上提示用户每一步操作的输入,并将结果输出即可。
4.编码实现和静态检查
编码是把详细设计的结果进一步求精为程序设计语言程序。
如何编写程序才能较快地完成调试是特别要注意的问题。
程序的每行不要超过60个字符。
每个过程(函数)体一般不要超过40行,最长不得超过60行,否则应该分割成较小的过程(函数)。
要控制if语句连续嵌套的深度,分支过多时应考虑使用switch语句。
对函数功能和重要变量进行注释。
一定要按格式书写程序,分清每条语句的层次,对齐括号,这样便于发现语法错误。
在上机之前,应该用笔在纸上写出详细的程序编码,并做认真地静态检查。
多数初学者在编好程序后处于以下两种状态之一:
一种是对自己的“精心作品”的正确性确信不疑;另一种是认为上机前的任务已经完成,纠查错误是上机的工作。
这两种态度是极为有害的。
对一般的程序设计者而言,当编写的程序长度超过50行时,通常会含有语法错误或逻辑错误。
上机动态调试决不能代替静态检查,否则调试效率将是极低的。
静态检查主要有两种方法,一是用一组测试数据手工执行程序(通常应先检查单个模块);二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注解。
5.上机调试和测试程序
上机准备包括以下几个方面:
(1)熟悉C语言用户手册或程序设计指导书。
(2)注意TurboC、VC与标准C语言之间的细微差别。
(3)熟悉机器的操作系统和语言集成环境的用户手册,尤其是最常用的命令操作,以便顺利进行上机的基本活动。
(4)掌握调试工具,考虑调试方案,设计测试数据并手工得出正确结果。
“磨刀不误砍柴工”。
学生应该熟练运用高级语言的程序调试器DEBUG调试程序。
上机调试程序时要带一本高级语言教材或手册。
调试最好分模块进行,自底向上,即先调试低层过程或函数。
必要时可以另写一个调用驱动程序。
这种表面上麻烦的工作实际上可以大大降低调试所面临的复杂性,提高调试工作效率。
在调试过程中可以不断借助DEBUG的各种功能,提高调试效率。
调试中遇到的各种异常现象往往是预料不到的,此时不应“苦思冥想”,而应借助系统提供的调试工具确定错误。
调试正确后,认真整理源程序及其注释,印出带有完整注释的且格式良好的源程序清单和结果。
6.总结并整理实验报告
5实验报告规范
实验报告的封面请按照附录A中给定模板的填写相关信息。
实验报告正文应包括以下7个内容:
1.需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
并明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2.概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
4.调试分析
内容包括:
●调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
●算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和
改进设想;
●经验和体会等。
5.用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6.测试结果
列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.附录
带注释的源程序。
附录B中提供了一份实验报告实例,可供参考。
希望书中的报告示例能起到一个抛砖引玉的作用,以引来更多实验者更优秀的设计范例。
值得注意的是,实验报告的各种文档资料,如:
上述中的前三部分要在程序开发的过程中逐渐充实形成,而不是最后补写(当然可以也应该最后用实验报告纸誊清或打印)。
6实验内容
6.1实验一线性表
实验目的:
本次实验的主要目的在于掌握线形表的逻辑结构,并熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。
通过本次实验还可帮助读者复习高级语言的使用方法。
通过本次实验,应能达到:
●掌握线性表的逻辑特征;
●掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算;
●熟练掌握线性表的链式存储结构定义及基本操作;
●理解循环链表和双链表的特点和基本运算;
●加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
题目1:
顺序表的基本操作
实验类型:
验证型
【问题描述】
利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:
1.创建一个新的顺序表,实现动态空间分配的初始化;
2.根据顺序表结点的位置插入一个新结点(位置插入);
3.根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);
4.实现顺序表的各个元素的输出;
5.彻底销毁顺序线性表,回收所分配的空间;
6.对顺序表的所有元素删除,置为空表;
6.返回顺序表元素个数;
7.按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i个结点,查找该元素的值,对查找结果进行返回;
8.按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;
编写主程序,实现对上述各不同算法的调用。
【基本要求】
对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
【测试数据】
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
题目2:
链表的基本操作
实验类型:
验证型
【问题描述】
利用线性表的链式存储结构,设计一组输入数据(假定为一组整数),能够对单链表进行如下操作:
1.初始化一个带表头结点的空链表;
2.创建一个单链表。
是指从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立起前后相互链接的关系。
可采用逆位序(插在表头)输入n个元素的值或者正位序(插在表尾)输入n个元素的值;
3.根据给定位置插入新结点;
4.删除给定位置的结点(位置删除);
5.删除链表中所有结点值为给定值的结点(值删除);
6.输出单链表的内容;
7.销毁单链表,回收所分配的空间;
8.返回顺序表元素个数。
编写主程序,实现对上述各不同算法的调用。
【基本要求】
各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
【测试数据】
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
题目3:
双向链表的基本操作
实验类型:
验证型
【问题描述】
实现双向链表的基本操作,并在此基础上设计一个主程序完成如下功能:
1.初始化一个带头结点的双向链表;
2.创建一个双向链表a,b,c,d,e。
可采用逆位序(插在表头)输入元素的值或者正位序(插在表尾)输入;
3.输出双向链表;
4.输出双向链表的长度;
5.判断双向链表是否为空;
6.输出双向链表的第四个元素;
7.输出元素c的位置;
8.在第三个元素前插入新元素f;
9.删除双向链表的所有元素,将链表置为空。
9.释放双向链表。
【基本要求】
各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
【测试数据】
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
题目4:
一元稀疏多项式的表示及基本操作
实验类型:
设计型
【问题描述】
实现一元稀疏多项式的表示及基本操作(建立、销毁、输出、加法、减法、乘法等)。
【基本要求】
一元多项式一定要包含系数项和指数项的描述,在选择合理的数据结构基础上完成多项式的建立、销毁、输出和加减法操作。
【测试数据】
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
【实现提示】
由于一元多项式包含系数项和指数项,其系数为float型,指数项为int型,往往将其两项组合成一个结构元素类型,将多项式看成是一个有序表,则多项式定义中的各个操作均可利用有序表操作来完成。
【选做内容】
完成多项式的相乘操作。
题目5:
约瑟夫环
实验类型:
设计型
【问题描述】
约瑟夫(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。
题目6:
记事本
实验类型:
综合型
【问题描述】
制作一个“记事本”程序,界面如右图所示。
要求首先在显示窗口按行显示可以使用的若干条信息的摘要,利用上下翻屏按钮可以顺序查看各条信息的摘要,当按下查看按钮时,则被选中信息在显示窗口完全显示。
【基本要求】
被使用的信息条数可以随意增、删、改,最小条数不少于100。
要求信息在后台要使用线性表结构来存储。
【测试数据】
由学生依据软件工程的测试技术自己确定。
【实现提示】
可自定义所用线性表的存储结构,可以是顺序的、链式的、静态的、循环的、双向的等。
6.2实验二栈、队列与递归算法设计
实验目的:
仅仅认识到栈和队列是两种特殊的线性表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导
![提示](https://static.bdocx.com/images/bang_tan.gif)