《数据结构》课程实验指导书.docx
- 文档编号:8230200
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:21
- 大小:74.55KB
《数据结构》课程实验指导书.docx
《《数据结构》课程实验指导书.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程实验指导书.docx(21页珍藏版)》请在冰豆网上搜索。
《数据结构》课程实验指导书
《数据结构》课程
实验指导书
河南理工大学
地理信息系统专业
二〇〇八年九月
前言
《数据结构》是计算机科学与技术及GIS专业的一门重要专业基础课,它主要介绍线性结构、树型结构、图状结构三种逻辑结构的存储实现,在此基础上介绍一些典型算法,以及算法的时间、空间效率分析。
这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。
通过本课程的学习,使学生熟练地掌握数据结构的内在逻辑关系及其在计算机中的表示方法(存储结构),以及相关基本操作的算法实现;掌握典型算法的设计思想及程序实现;熟悉各种数据结构在GIS软件开发、程序设计中的基本应用;培养和训练学生结合实际应用,根据实际问题选取合适的数据结构、存储方案设计出简洁、高效、实用的算法;并为学习《空间数据库原理》、《GIS设计与开发》等后续课程和研制开发各种系统和应用软件打下扎实的理论与实践基础。
学习这门课程,习题和实验是两个关键环节。
学生理解算法,上机实验是最佳的途径之一。
因此,实验环节的好坏是学生能否学好《数据结构》的关键。
为了更好地配合学生实验,特编写此实验指导书。
实验指导书按照实验教学大纲的要求,为每个主要的知识点精选了的典型的实验题目,对每个实验题目提出具体实现要求,并对算法的实现进行提示,希望对同学们完成实验有所帮助。
目录
实验一线性表的链表实现类的设计…………………………………………………………1
实验二顺序栈的自定义类设计………………………………………………………………2
实验三字符串的操作类设计…………………………………………………………………3
实验四树和二叉树的自定义类的设计………………………………………………………4
实验五图的最短路径算法设计………………………………………………………………5
实验六自定义类应用综合设计………………………………………………………………6
实验一线性表的链表实现类的设计
实验类型:
验证性实验学时:
2学时
一、实验目的:
1、掌握C++面向对象类的设计和用VC++上机调试线性表的基本方法;
2、掌握线性表的基本操作,如插入、删除、查找,以及线性表合并等运算在链式存储结构上的运算;并能够运用线性表基本操作解决问题,实现相应算法。
二、实验要求:
1、C++完成类的设计及基本操作算法并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
设计你的线性表的链式存储结构类,编程实现通过键盘输入数据建立链表、查找、插入结点、删除结点、显示链表以及两链表的合并运算等操作。
测试数据示例:
(1)以L1={0,5,9,10,12,12,17,20,24}构造链表;
(2)找到重复的第二个元素12并删除它;
(3)在第五个元素后插入55;
(4)生成L2={33,45,50}的链表并将它与L1的链表合并。
注:
也可以完成课本第二章习题2.14题(P85)的代码设计作为本次课堂实验内容。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言设计类,并实现相关类的基本操作,程序在VC++环境下调试通过。
并选择恰当的测试数据验证算法的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
实验二顺序栈的自定义类设计
实验类型:
验证性实验学时:
2学时
一、实验目的:
1、掌握用VC++上机调试通过栈的顺序存储结构类的设计;
2、掌握顺序栈的基本操作,如进栈、出栈、判断栈空和栈满,取栈顶元素等运算在顺序存储结构上的运算;并能够运用栈的基本操作解决问题,实现相应算法。
二、实验要求:
1、C++完成类的设计及基本操作算法并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
设计你的栈的顺序存储结构类,编程实现栈的基本操作。
栈中的数据元素类型最好为字符类型,方便今后对字符串的算法设计和应用。
测试数据示例:
(1)以“ABCDEFG”的字符串顺序进栈;
(2)以合适顺序出栈得到序列“CDBAGFE”;
(3)取栈顶元素得到‘F’;
(4)进栈直到栈满和出栈直到栈空,检验对这两种情形的正确判断和处理。
注:
也可以完成课本第三章习题3.13题(P132)的代码设计作为本次课堂实验内容。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言设计类,并实现相关类的基本操作,程序在VC++环境下调试通过。
并选择恰当的测试数据验证算法的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
实验三字符串的操作类设计
实验类型:
验证性实验学时:
2学时
一、实验目的:
1、掌握动态分配空间的字符串的顺序存储类的设计;
2、掌握实现字符串的基本操作,如求串的长度、串的比较、复制、串的连接,取子串、子串匹配定位和串替换等运算。
二、实验要求:
1、C++完成类的设计并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
用堆分配存储表示串,实现串的比较、复制、串的连接,取子串、子串匹配定位和串替换等基本操作。
测试数据示例:
(1)以“abcde”构造一个串s1,以“gabcdef”构造另一个串s2;
(2)比较s1和s2是否相等;
(3)在s2中定位s1子串;
(4)复制s2串并连接在s1串后。
注:
也可以完成课本第四章习题4.17题(P185)的代码设计作为本次课堂实验内容。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言设计类,并实现相关类的基本操作,程序在VC++环境下调试通过。
并选择恰当的测试数据验证算法的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
实验四树和二叉树的自定义类的设计
实验类型:
验证性实验学时:
2学时
一、实验目的:
1、进一步掌握树的结构及非线性特点,递归特点和动态性。
2、巩固对指针的使用和二叉树的三种遍历方法、建立方法及树的输入输出。
二、实验要求:
1、C++完成类的设计并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
实现二叉树的遍历,实现先序、中序和后序递归遍历算法;利用栈实现二叉树先序、中序遍历的非递归算法。
测试数据示例:
(1)以层序遍历序列为abcdefghijklmn构造一棵二叉树;
(2)分别输出其先序、中序和后序遍历结果;
注:
也可以完成课本第五章习题5.37题(P250)的代码设计作为本次课堂实验内容。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言设计类,并实现相关类的基本操作,程序在VC++环境下调试通过。
并选择恰当的测试数据验证算法的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
实验五图的最短路径算法设计
实验类型:
验证性实验学时:
2学时
一、实验目的:
了解最短路径的概念,掌握求最短路径的方法(Dijkstra算法或Floyd算法)。
二、实验要求:
1、C++完成图的相关类及算法的设计并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
建立一个包含6个结点的带权有向图,并求顶点V0到其它顶点的最短路径。
测试数据由同学们自行选择。
注:
也可以完成课本第八章习题8.23题(P395)的代码设计作为本次课堂实验内容。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言设计类,并实现相关类的基本操作,程序在VC++环境下调试通过。
并选择恰当的测试数据验证算法的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
实验六自定义类应用综合设计
实验类型:
综合性实验学时:
2学时
一、实验目的:
1、进一步掌握各种数据结构的特点和适合解决问题的分析;
2、通过具体的有实际应用意义的问题解决和对前面设计的类的使用进一步提高程序设计能力和算法设计、分析能力。
3、考察学生的程序设计中的逻辑思维能力和发现软件开发人才。
二、实验要求:
1、完成程序或简单系统的设计并上机调试通过。
2、撰写实验报告,提供实验结果和数据。
三、实验内容:
从下面给出的题目中选做其中的一题(多做可加分):
1.约瑟夫环问题
1)问题描述:
有编号为1,2…n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。
开始给定一个正整数m,从第一个人按顺时针方向自1开始报数,报到m者出列,不再参加报数,这时将出列者的密码作为m,从出列者顺时针方向的下一人开始重新自1开始报数。
如此下去,直到所有人都出列。
试设计算法,输出出列者的序列。
2)实验要求:
采用链式存储结构实现。
3)实现提示:
用链式存储解决此问题时可以采用循环链表。
2.停车场管理问题
1)问题描述:
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车走开,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编写程序模拟该停车场的管理。
2)实验要求:
要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和他在停车场内停留的时间。
3)实现提示:
以栈模拟停车场,以队列模拟便道,按照从终端读入的车辆“到达”“离开”信息模拟停车场管理。
3.实现一个哈夫曼编/译码系统
1)问题描述:
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码。
对于双工信道,每端都需要一个完整的编码/译码系统。
试为这样的信息收发站写一个哈夫曼的编/译码系统。
2)实验要求:
一个完整的系统应具有以下功能:
(1)I:
初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:
编码(Encoding)。
利用已建好的哈夫曼树对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:
译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:
打印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5)T:
打印哈夫曼树(Treeprinting)。
将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
3)实现提示:
(1)文件CodeFile的基类型可以设为字节型。
(2)用户界面可以设计为“菜单”方式:
显示上述功能符号,再加上“Q”,表示退出运行Quit。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“E”为止。
(3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。
每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。
4.利用最小生成树算法解决通信网的总造价最低问题
1)问题描述:
若在n个城市之间建通信网络,秩序架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网络的最小生成树问题。
2)实验要求:
利用克鲁斯卡尔算法求网的最小生成树
3)实现提示:
通信线路一旦建立,必然是双向的。
因此,构造最小生成树的网一定是无向网。
为简单起见,图的顶点数不超过10个,网中边的权值设置成小于100。
5.教学计划编制问题
1)问题描述:
软件专业的学生要学习一系列课程,其中有些课程必须在其先修课完成后才能学习。
2)实验要求:
假设每门课程的学习时间为一个学期,试为该专业的学生设计教学计划,使他们能在最短时间内修完专业要求的全部课程。
3)实现提示:
以顶点代表课程,弧代表课程的先后修关系,按课程先后关系建立有向无环图。
利用拓扑排序实现。
6.公交线路优化路径的查询
【问题描述】
对于某城市的公交线路,乘坐公交的顾客希望在这样的线路上实现各种优化路径的查询。
设该城市的公交线路的输入格式为:
线路编号:
起始站名(该站坐标);经过的站点1名(该站坐标);经过的站点2名(该站坐标);……;经过的站点n名(该站坐标);终点站名(该站坐标)。
该线路的乘坐价钱。
该线路平均经过多少时间来一辆。
车速。
例如:
63:
A(32,45);B(76,45);C(76,90);……;N(100,100)。
1元。
5分钟。
150米/每分钟。
假定线路的乘坐价钱与乘坐站数无关,假定不考虑公交线路在路上的交通堵塞。
对这样的公交线路,需要在其上进行的优化路径查询包括:
任何两个站点之间最便宜的路径;任何两个站点之间最省时间的路径。
【设计要求】
①根据上述公交线路的输入格式,定义并建立合适的图模型。
②针对上述公交线路,能查询获得任何两个站点之间最便宜的路径,即输入站名S,T后,可以输出从S到T的最便宜的路径,输出格式为:
线路x:
站名S,…,站名M1;换乘线路x:
站名M1,…,站名M2;…;换乘线路x:
站名MK,…,站名T。
共花费x元。
③针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(不考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:
线路x:
站名S,…,站名M1;换乘线路x:
站名M1,…,站名M2;…;换乘线路x:
站名MK,…,站名T。
共花费x时间。
④针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(要考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:
线路x:
站名S,…,站名M1;换乘线路x:
站名M1,…,站名M2;…;换乘线路x:
站名MK,…,站名T。
共花费x时间。
四、仪器设备:
计算机、VC++编译环境
五、实验方法:
用C++语言完成设计,程序在VC++环境下调试通过。
并选择恰当的测试数据验证程序的正确性。
六、实验步骤:
1、在上机前提前完成设计代码;
2、程序调试通过,可运行;
3、通过测试数据和对象方法调用验证算法正确性。
七、实验结果处理:
对程序调试中的问题要进行总结。
八、实验注意事项:
独立完成实验及实验报告,抄袭者不给成绩。
九、预习与思考题:
见课堂讲授课件和作业布置。
十、实验报告要求:
本门课程实验报告格式见附件1,鼓励手写,可以打印。
附件1:
测绘与国土信息工程学院
《数据结构》课程
实验报告
姓名:
学号:
成绩:
日期:
实验一线性表的链表实现类的设计
一、需求分析
本次程序设计要求建立一个以链表为储存方式的线性表,以及实现线性表所需求的各种功能。
对线性表的操作有:
(1)输入形式为从键盘输入,用户根据界面的提示从键盘直接输入所对应的数即可。
输入的值要求为整数类型,用户输入其它类型的数据时(例如字符串)会产生不可预测的错误。
(2)输出的界面为DOS窗口,系统按照用户输入的数据类型,将会把相应的输出结果显示到界面上。
(3)程序可以建立一个以链表形式储存的线性表,对线性表可以进行查找、删除、插入、构造、销毁和获取链表长度的操作。
(4)以L1={0,5,9,10,12,12,17,20,24}构造链表;找到重复的第二个元素12并删除它;在第五个元素后插入55;生成L2={33,45,50}的链表并将它与L1的链表合并。
二、概要设计
链表结点的数据结构:
structLinkNode{//链表结点定义(数据类型为整形)
intdata;//数据域
LinkNode*link;//指针域
LinkNode(LinkNode*ptr=NULL)//仅初始化指针成员的构造函数
{
link=ptr;
}
//初始化数据和指针成员的构造函数
LinkNode(constintx,LinkNode*ptr=NULL)
{
data=x;
link=ptr;
}
};
链表类:
classList{//带头结点的单链表类的定义
public:
List(){first=newLinkNode;}//构造函数
List(constintx){first=newLinkNode(x);}//构造函数
List(List&L);//复制构造函数
~List(){
MakeEmpty();//使链表为空表
deletefirst;//删除附加头结点
}
voidMakeEmpty();//将链表置为空表,保留头结点
intLength()const;//计算链表长度
LinkNode*Search(intx);//搜索含数据x的结点
LinkNode*Locate(inti);//返回第i个元素的地址
LinkNode*GetHead()const{returnfirst;}//获取头结点地址
intGetData(inti);//取出第i个元素的值
voidSetData(inti,intx);//用x修改第i个元素的值
boolInsert(inti,intx);//在链表的第i个元素后插入x
boolRemove(inti,int&x);//删除第i个元素,通过x返回其元素值
voidAddTail(intx);//在链表尾部添加元素x
voidDeleteRepeatedElem();//删除表中重复元素
voidMergeList(List&L);//将链表L链接在当前链表尾部
boolIsEmpty()const//判断表空
{
returnfirst->link==NULL?
true:
false;
}
voidInput();//输入数据元素,建立表
voidDisplay();//显示表中元素
List&operator=(List&L);//重载操作符:
赋值"="
private:
LinkNode*first;
};
三、详细设计
List:
:
List(List&L)//复制构造函数
{
intval;
LinkNode*srcPtr=L.GetHead();//被复制表的头结点地址
LinkNode*desPtr=first=newLinkNode;//生成头结点
while(srcPtr->link!
=NULL){//逐个结点复制
val=srcPtr->link->data;
desPtr->link=newLinkNode(val);//开辟新结点内存,并为数据域赋值X
desPtr=desPtr->link;
srcPtr=srcPtr->link;
}
desPtr->link=NULL;
}
voidList:
:
MakeEmpty()//将链表置为空表,保留头结点
{
LinkNode*p;
while(first->link!
=NULL)//当链不为空时,删除链中所有结点
{
p=first->link;
first->link=p->link;//保存被删除结点的下一结点地址
deletep;//删除从链上摘下的结点
}
}
intList:
:
Length()const//计算链表长度
{
LinkNode*p=first->link;
intlength=0;
while(p!
=NULL)//扫描直到链尾
{
p=p->link;
length++;
}
returnlength;
}
LinkNode*List:
:
Search(intx)//搜索含数据x的结点,返回结点地址
{
LinkNode*p=first->link;
while(p!
=NULL)//扫描直到链尾,找含有数据x的结点
{
if(p->data=x)break;
elsep=p->link;
}
returnp;
}
LinkNode*List:
:
Locate(inti)//返回第i个元素的地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)