数据结构实验指导书new高艳霞.docx
《数据结构实验指导书new高艳霞.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书new高艳霞.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书new高艳霞
《数据结构》
实
验
指
导
书
计算机学院数据结构课程组
2015-3
前言
计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习计算机编程仅仅了解计算机语言是不够的,还必须掌握数据的组织、存储和运算的一般方法,这便是数据结构课程中所研究的内容,也是我们编写计算机程序的重要基础,由于它对计算机学科起到承前启后的作用,因此本课程被列为计算机等相关专业最重要的专业基础课;同时数据结构是计算机专业教学的一门核心课程。
计算机各领域都要用到各种数据结构,而且要从事计算机科学与技术工作,尤其是计算机领域的软件开发工作,必须具备较强的数据结构基础。
数据结构课程内容丰富、学习量大,实践性强;隐含在各部分内容中的方法和技术多;算法设计具有动态性和抽象性等特点,看懂听明白与掌握会应用之间有相当大的一段距离。
所以学生必须多实践才能进一步加深对课程的理解,理解和掌握算法设计所需的方法和技术,为整个专业学习打下良好的基础。
实验目录
实验一线性表的基本操作及其应用4
实验二栈和队列的基本操作及其应用8
实验三二叉树的基本运算12
实验四哈夫曼树与哈夫曼编码15
实验五图的基本操作17
实验六图的应用19
实验七查找、排序的应用24
实验一线性表的基本操作及其应用
一、实验目的
1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。
二、实验内容
本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,学生可以根据自己的情况选做!
题目一:
单链表的基本操作(*)
[问题描述]
实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求]
(1)依次从键盘读入数据,建立带头结点的单链表;
(2)输出单链表中的数据元素
(3)求单链表的长度;
(4)根据指定条件能够取元素和修改元素;
(5)实现在指定位置插入和删除元素的功能。
[测试数据]
由学生任意指定。
题目二:
约瑟夫环(**)
[问题描述]
约瑟夫(Joseph)问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
[基本要求]
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
[测试数据]
由学生任意指定。
如:
m的初值为20;n的值为7;密码:
3,1,7,2,4,8,4;
(正确的输出结果应为6,1,4,7,2,3,5)。
(报告上要求写出多批数据测试结果)
[实现提示]
程序运行后首先要求用户输入初始报数上限值m,人数n,(设n≤30)。
然后输入各人的密码。
[选作内容]
向上述程序中添加在顺序结构上实现的部分。
题目三:
多项式的表示及相加(***)
[问题描述]
设计一个算法,以实现一元稀疏多项式的加法运算。
[基本要求]
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b。
[测试数据]
由学生任意指定。
[实现提示]
用带表头结点的单链表存储多项式。
[选作内容]
多项式a和b相减,建立多项式a-b。
题目四:
Dr.Kong设计了一件艺术品(****)
[问题描述]
Dr.Kong设计了一件艺术品,该艺术品由N个构件堆叠而成,N个构件从高到低按层编号依次为1,2,……,N。
艺术品展出后,引起了强烈的反映。
Dr.Kong观察到,人们尤其对作品的高端部分评价甚多。
狂热的Dr.Kong一激动,对组成该艺术品的N个构件重新组合,比如:
把第6层到第12层的构件搬下来,想一想,然后整体放到剩下构件的第7层下面;过一会儿,又把第2层到第9层的构件搬下来,整体放到剩下构件的第1层下面等等。
于是,Dr.Kong在进行了连续若干次“搬来搬去”后,还是这N个构件,又诞生了一件新的艺术品。
编程:
请输出新的艺术品最高十层构件的编号。
【标准输入】
第一行:
NK表示构件的总数和“搬来搬去”的总次数
第2~K+1行:
ABC表示要搬动的构件(即从第A层到第B层)整个放在第C层下面;
如果C等于0,则要搬动的构件将放到最高层。
【标准输出】
由十行组成,分别为组成新艺术品的第一层到第十层构件的编号。
【约束条件】
(1)10≤N≤200001≤k≤1000
(2)1≤A≤B≤N,0≤C≤N-(B-A+1)
【样例】
提示:
样例中仅是常规的测试数据输入及对应结果,特殊情况需要全面考虑,自己设计测试数据验证算法的健壮性。
标准输入(测试数据):
133
6121
290
10138
标准输出结果:
6
7
8
9
10
11
12
2
3
4
[实现提示]
适宜于用带表头结点的单链表实现,涉及单个结点或连续多个结点的插入与删除。
[选作内容]
分别用不带头结点的单链表和顺序表实现,领会三种方法的算法设计的优缺点和时间复杂度。
三、实验前的准备工作
1、掌握线性表的逻辑结构。
2、掌握线性表的链式存储结构。
3、熟练掌握线性表的插入、删除等操作。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
实验二栈和队列的基本操作及其应用
一、实验目的
1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。
2、掌握栈和队列的特点,即后进先出和先进先出的原则。
3、掌握栈和队列的基本运算,如:
入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。
二、实验内容
本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,学生可以根据自己的情况选做!
题目一:
回文判断(*)
[问题描述]
对于一个从键盘输入的字符串,判断其是否为回文。
回文即正反序相同。
如“abba”是回文,而“abab”不是回文。
[基本要求]
(1)数据从键盘读入;
(2)输出要判断的字符串;
(3)利用栈和队列对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。
[测试数据]
由学生任意指定。
题目二:
商品货架管理(**)
[问题描述]
商店货架以栈的方式摆放商品。
生产日期越近的越靠近栈底,出货时从栈顶取货。
一天营业结束,如果货架不满,则需上货。
入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。
这样就需要倒货架,使生产日期越近的越靠近栈底。
[基本要求]
设计一个算法,保证每一次上货后始终保持生产日期越近的商品越靠近栈底。
[实现提示]
可以用一个队列和一个临时栈作为周转。
[测试数据]
由学生任意指定。
题目三:
舞伴问题(**)
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题。
【实验提示】
先入队的男士或女士亦先出队配成舞伴。
因此该问题具体有典型的先进先出特性,可用队列作为算法的数据结构。
在算法中,假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。
当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。
此时,若某队仍有等待配对者,算法输出此队列中等待者的人数及排在队头的等待者的名字,他(或她)将是下一轮舞曲开始时第一个可获得舞伴的人。
【实验要求】
利用队列实现,存储结构采用顺序或链式均可
题目四:
Rails(***)
[Description]
ThereisafamousrailwaystationinPopPushCity.Countrythereisincrediblyhilly.Thestationwasbuiltinlastcentury.Unfortunately,fundswereextremelylimitedthattime.Itwaspossibletoestablishonlyasurfacetrack.Moreover,itturnedoutthatthestationcouldbeonlyadead-endone(seepicture)andduetolackofavailablespaceitcouldhaveonlyonetrack.
ThelocaltraditionisthateverytrainarrivingfromthedirectionAcontinuesinthedirectionBwithcoachesreorganizedinsomeway.AssumethatthetrainarrivingfromthedirectionAhasN<=1000coachesnumberedinincreasingorder1,2,...,N.ThechieffortrainreorganizationsmustknowwhetheritispossibletomarshalcoachescontinuinginthedirectionBsothattheirorderwillbea1,a2,...,aN.Helphimandwriteaprogramthatdecideswhetheritispossibletogettherequiredorderofcoaches.YoucanassumethatsinglecoachescanbedisconnectedfromthetrainbeforetheyenterthestationandthattheycanmovethemselvesuntiltheyareonthetrackinthedirectionB.Youcanalsosupposethatatanytimetherecanbelocatedasmanycoachesasnecessaryinthestation.ButonceacoachhasenteredthestationitcannotreturntothetrackinthedirectionAandalsoonceithasleftthestationinthedirectionBitcannotreturnbacktothestation.
[Input]
Theinputconsistsofblocksoflines.Eachblockexceptthelastdescribesonetrainandpossiblymorerequirementsforitsreorganization.InthefirstlineoftheblockthereistheintegerNdescribedabove.Ineachofthenextlinesoftheblockthereisapermutationof1,2,...,N.Thelastlineoftheblockcontainsjust0.
Thelastblockconsistsofjustonelinecontaining0.
[Output]
Theoutputcontainsthelinescorrespondingtothelineswithpermutationsintheinput.AlineoftheoutputcontainsYesifitispossibletomarshalthecoachesintheorderrequiredonthecorrespondinglineoftheinput.OtherwiseitcontainsNo.Inaddition,thereisoneemptylineafterthelinescorrespondingtooneblockoftheinput.Thereisnolineintheoutputcorrespondingtothelast``null''blockoftheinput.
[SampleInput]
5
12345
54123
0
6
654321
0
0
[SampleOutput]
Yes
No
Yes
三、实验前的准备工作
1、掌握栈的逻辑结构和存储结构。
2、熟练掌握栈的出栈、入栈等操作。
3、掌握队列的逻辑结构和存储结构。
4、熟练掌握队列的出队、入队等操作
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
实验三二叉树的基本运算
一、实验目的
1、使学生熟练掌握二叉树的逻辑结构和存储结构。
2、熟练掌握二叉树的各种遍历算法。
二、实验内容
题目一:
二叉树的基本操作实现(必做题)
[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
1.按先序序列构造一棵二叉链表表示的二叉树T;
2.对这棵二叉树进行遍历:
先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
3.求二叉树的深度/结点数目/叶结点数目;(选做)
4.将二叉树每个结点的左右子树交换位置。
(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:
ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:
ABCDEGF
中序:
CBEGDFA
后序:
CGEFDBA
层序:
ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
题目二、TheNumberoftheSameBST(选作)
【Description】
Manypeopleknowsbinarysearchtree.ThekeysinabinarysearchtreearealwaysstoredinsuchawayastosatisfytheBSTproperty:
LetXbeanodeinabinarysearchtree.IfYisanodeintheleftsubtreeofX,thenY<=X.IfYisanodeintherightsubtreeofX,thenY>X.
Forexample,
Itisabinarysearchtree.AnditcanbebuiltbyinsertingtheelementsofvectorA=(12,6,3,18,20,10,4,17,20)sequentially.ButitcanalsobebuiltbythevectorB=(12,18,17,6,20,3,10,4,20).
NowgivenavectorX,thenyoumaygetabinarysearchtreefromX.Yourjobistocalculatehowmanydifferentvectorscanbuildthesamebinarysearchtree.Tomakeiteasy,youshouldjustoutputthenumberofdifferentvectorsmod9901.
【Input】
Inputconsistsofseveralcases.Eachcasestartswithalinecontainingonepositiveintegern,whichisthelengthoftestvector.Theintegernislessthan20.Followingthistherewillbenpositiveintegers,whicharelessthen1000,onthenextline.Theinputwillendwithacasestartingwithn=0.Thiscaseshouldnotbeprocessed.
【Output】
Foreachtestcase,printalinewithasingleinteger,whichisthenumberofdifferentvectorsmod9901.
【SampleInput】
3
213
9
56318201041720
0
【Sampleoutput】
2
168
三、实验前的准备工作
1、掌握树的逻辑结构。
2、掌握二叉树的逻辑结构和存储结构。
3、掌握二叉树的各种遍历算法的实现。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
实验四哈夫曼树与哈夫曼编码
一、实验目的
1、使学生熟练掌握哈夫曼树的生成算法。
2、熟练掌握哈夫曼编码的方法。
二、实验内容
本次实验提供4个题目,难度相当,学生可以根据自己的情况选做,其中题目一是必做题,其它选作!
题目一、哈夫曼树和哈夫曼编码
[问题描述]
一电文,有若干个不同字符,要求从终端输入这些不同字符及其出现的频率,然后对这些字符进行哈夫曼编码,并输出。
[测试数据]
利用教材P.148例6-2中的数据调试程序(可自己设定测试数据)。
[选作内容]
1、打印出该哈夫曼树
2、若从终端输入任意一段电文(假设仅为26个大小写英文字母),试编程高效地求出该段电文的哈夫曼编码。
提示:
如何快速统计不同字符的出现频率
3、译码:
将上述1的编码结果还原成电文。
题目二、寻求最佳判断(ACM/ICPC训练题)
[问题描述]
试设计一个算法,用最少的比较,尽快地将N个随机的百分制成绩转换成五级分制.
0~59————————————————————bad
60~69————————————————————pass
70~79————————————————————general
80~89————————————————————good
90~100————————————————————excellent
[设计要求]
输入n个任意的百分制分数,要求输出对应的等级
[测试数据]
自己定义
题目三果子合并
[问题描述]
n堆果子,每堆果子数量任意,试设计一种最佳方案,将这n堆果子合并为一堆,使得合并工作量最小。
注:
规定合并两堆果子的工作量是这两堆果子的数量之和。
[标准输入]
M,NM表示M组测试数据,N表示每组测试数据数量不超过N个,每堆果子数量不超过10000。
随后的M行是测试数据。
[标准输出]
M行数据表示对应果子的合并工作量
[输入样例]:
26
7,5,2,4
5,6,2,9,7
【输出样例】:
35
65
题目四文本文件加密器(本题有一定难度,可协作完成)
【问题描述】
对任意文本文件,为安全保密,试为该文件内容加密,并输出加密后的文字,或对加密后的文件解密。
[设计要求]
一个完整的加解密其应具有以下功能:
(1)初始化:
从终端读入一文本文件,统计每个字符出现的频率(考虑效率),建立哈夫曼树,并将该树存入某文件(考虑方式);
(2)编码:
利用建好的哈夫曼树对输入的文本文件中各字符进行编码,用列表的形式显示在屏幕上,并将编码结果存入另一文件中;
(3)解码:
对输入的加密文件能正确进行解码,获得原文件
[测试数据]
自行设计
三、实验前的准备工作
1、掌握树的逻辑结构。
2、掌握哈夫曼树的定义及生成算法。
3、掌握哈夫曼编码的方法。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
实验五图的基本操作
一、实验目的
1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容
本次实验提供4个题目,难度相当,学生可以根据自己的情况选做,其中题目一是必做题,其它选作!
题目一:
图的遍历(必做)
[问题描述]
对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】
由学生依据软件工程的测试技术自己确定。
题目二:
在图G中求一条从顶点i到顶点s的简单路径
[测试数据]
自行设计
[题目三]:
在图G中求一条从顶点i到顶点s且长度为K的简单路径
[测试数据]
自行设计
三、实验前的准备工作
1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
实验六图的应用
一、实验目的
1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、掌握如何应用图解决各种实际问题。
二、实验内容
本次实验提供若干个题目,难易程度不等,学生可以根据自己的情况选做至少一题。
题目一:
最小生成树问题
[问题描述]
若要在n个城市之间建设通信网络,只需要假设