当前位置:文档之家› 数据结构实验课件(2013年)zy

数据结构实验课件(2013年)zy

数据结构实验课件(2013年)zy
数据结构实验课件(2013年)zy

数据结构课程实验实施方案(2013年)

一、总体设计要求

1、采用C/C++编程语言,应用抽象数据类型的设计,在实现数据结构基本操作的基础上,完成数据结构的基本应用。

2、程序采用模块化设计思想,划分功能模块结构,确定必要的模块间的联系,按照基本操作调试、主算法设计与实现、主函数模块调用的步骤进行实验。

3、给出必要的测试用例数据。

4、推荐程序完成必要的界面设计。

5、完成实验题目中规定的基本功能,在完成基本功能的基础上,可以增加和完善功能。

6、对所完成的实验课题的算法进行必要的时间和空间的性能评价。

7、对于自主学习研究性题目,采用C++的模板类(STL)完成题目的设计与实现。

二、实验分组要求

1、每个班分成若干个实验课题小组,每组原则上2-3人,个人自愿入组,采用组长负责制。

2、每个实验给出若干个实验参考题目供课题组选择其中之一。前4个实验为必做实验。

3、第5个自主学习性实验为选作实验,可以重新组合实验课题组。

4、班级的最后1次上机课为程序验收,每个人选定其中1次最好的实验课题作为实验程序验收,并向主讲教师上交该实验的纸板报告。

三、实验题目参考

实验一线性表应用类实验题目参考

1、运动会竞赛成绩统计

【问题描述】

东北大学第51届运动大会成功举行。共有N个学院的男女代表队参赛。大会共设M个男子项目和W个女子项目。大会即将闭幕,准备公布成绩。

【实验要求】

设计运动会竞赛成绩统计程序。

(1)采用顺序表或链表等数据结构。

(2)统计各代表队的男女总分和团体总分。

(3)公布各单项成绩的前六名和团体成绩的前三名。

(4)可以查询成绩。

2、约瑟夫环问题

【问题描述】

Josephus排列问题定义如下:假设n个竞赛者排成一个环形。给定一个正整数m≤n,从第1人开始,沿环计数,第m人出列。这个过程一直进行到所有人都出列为止。最后出列者为优胜者。全部出列次序定义了1,2,…n的一个排列。称为(n,m)Josephus排列。例如,(7,3)Josephus排列为3,6,2,7,5,1,4。

【实验要求】

设计求解Josephus排列问题程序。

(1)采用顺序表、单链表或双向循环链表等数据结构。

(2)采用双向循环链表实现Josephus排列问题,且奇数次顺时针轮转,偶数次逆时针轮转。

(3)推荐采用静态链表实现Josephus排列问题。

3、集合的并交差运算

【问题描述】

设计一个能演示集合的并、交、差运算程序。

【实验要求】

(1)采用顺序表或链表等数据结构。

(2)集合的元素限定为数字和小写英文字母。

4、一元多项式运算

【问题描述】

设计一个一元多项式简单计算器。

【实验要求】

(1)采用顺序表或链表等数据结构。

(2)输入并建立多项式。

(3)输出运算结果的多项式。

5、复数四则运算

【问题描述】

设计一个简单的复数四则运算计算器。

【实验要求】

(1)采用顺序表或链表等数据结构。

(2)输入并生成复数。

(3)输出运算结果的标准复数形式。

6、三元组长整数四则运算

【问题描述】

设计一个长整数四则运算计算器。

【实验要求】

(1)采用顺序表或链表定义的三元组数据结构。

(2)输入并生成长整数。

(3)完成定义的长整数的加减运算。

7、学生成绩管理

【问题描述】

对信息学院计算机科学与技术专业的2011级本科生的学生成绩管理作一个简单的模拟。

【实验要求】

设计学生成绩管理的模拟程序。

(1)采用顺序表登录学生成绩。

(2)可以登记、查询、插入、删除学生成绩。

(3)将成绩按科目存储到链表中。

8、图书信息管理

【问题描述】

对图书馆的图书信息管理作一个简单的模拟。

【实验要求】

设计图书信息管理的模拟程序。

(1)采用顺序表登录图书成绩。

(2)可以登记、查询、插入、删除图书成绩。

(3)将图书信息按类别存储到链表中。

9、商品库存信息维护

【问题描述】

对超市的库存商品信息管理作一个简单的模拟。例如,库中有一批电视机,按型号和价格排序,新近一批电视机,将新商品插入到线性表中。

【实验要求】

设计超市库存商品信息维护管理的模拟程序。

(1)采用单链表存储结构。

(2)可以登记、查询、入库、出库商品信息。

(3)将禄存商品信息按类别存储到链表中。

10、元素整体互换

【问题描述】

对线性表中的前M个元素和后N个元素整体互换。

【实验要求】

设计元素整体互换的模拟程序。

(1)采用顺序表存储结构实现。

(2)采用链表存储结构实现。

(3)分别采用低效和高效两种算法实现。

实验二栈和队列应用类实验题目参考

1、算术表达式求值

【问题描述】

由输入的四则算术表达式字符串,动态生成算术表达式所对应的后缀式,通过后缀式求值并输出。

【实验要求】

设计十进制整数四则运算计算器。

(1)采用顺序栈等数据结构。可以将数据存储在顺序表中。

(2)给定表达式字符串,后缀表达式。

(3)对后缀表达式求值并输出。

2、停车场管理

【问题描述】

设停车场采用南北方向的双口,每个口都有一个入口和出口。另外停车场入口处各有一个单车道的等候通道,并允许等候的车辆因急事从等候通道直接开走。

【实验要求】

设计停车场模拟管理程序。

(1)采用栈或队列等数据结构。

(2)等候车辆的管理。

(3)停车位的管理。

3、运动员混合双打组合

【问题描述】

设有M个男羽毛球运动员和N个女羽毛球运动员,现进行男女混合双打组合K轮配对。男女运动员分别编号排队在等候队列,按顺序依次从男女运动员中各出队1人组合配对。本轮没成功配对者等待下一轮次配对。

【实验要求】

设计程序模拟完成运动员组合配对过程。

(1)采用队列等数据结构。

(2)输出每轮的配对信息。

4、电路布线问题

【问题描述】

印刷电路板将布线区域划分为n╳n个方格阵列。在布线时,电路只能沿直线或直角布线。为避免线路相交,已布线的方格要做封锁标记。设起始位置为a,终止位置为b,求解电路布线问题。

【设计要求】

设计印刷电路板的布线模拟程序。

(1)采用栈或队列等数据结构。

(2)采用穷举法的回溯搜索,求a到b可能的布线线路。

(3)推荐采用层次优先搜索,求a到b最优的布线线路。

5、迷宫问题

【问题描述】

设一个M×N的迷宫,0和1分别表示通道和障碍。

【实验要求】

设计程序实现求从入口到出口的任意通道。

(1)采用栈等数据结构。

(2)应用穷举法回溯策略求解。

(3)尝试求解所有通路或最佳路径。

6、车厢调度

【问题描述】

假设停在铁路调度入口处的列车编号依次为1,2,…,n。

【实验要求】

设计程序求出所有可能的长度为n的输出车厢序列。

(1)采用栈或队列等数据结构。

(2)输出调度序列。

(3)推荐采用双栈结构求解。

7、八皇后问题

【问题描述】

设一个8×8的棋盘里放置8个皇后,要求在每行、每列、没斜线只允许放置1个皇后。

【实验要求】

设计实现所有可能解的程序。

(1)采用栈等数据结构。

(2)应用穷举法回溯策略求解。

(3)尝试采用递归和非递归算法求解。

8、马踏棋盘问题

【问题描述】

中国象棋中的“马”走子的规则是:马走日字形。

【实验要求】

设计实现求象棋盘中的某一点出发踏遍棋盘所有点的程序。

(1)采用栈等数据结构。

(2)应用穷举法回溯策略求解。

(3)尝试求解所有出发点的可能解。

9、简单背包问题

【问题描述】

设一个背包所允许的重量是M,假设有N件物品,物品的重量分别是W i,可以任意挑选物品将背包装满。

【实验要求】

设计程序实现将给定背包装满的可能解。

(1)采用栈等数据结构。

(2)应用穷举法回溯策略求解。

(3)尝试采用递归和非递归算法求解。

10、公交车站台排队问题

【问题描述】

假设某公交车站站点有4路公交车都可以到达某商业区,人们排队等候上车。现要调研统计每天每路公交车的乘客平均人数和等候时间。

【实验要求】

设计程序模拟公交车的乘客运营情况。

(1)采用线性表等数据结构。

(2)可随机产生乘客到达车站的时间和等候时间。

(3)设每路公交车都按规定时间运营。

(4)可以简化给定条件。

实验三树和图应用类实验题目参考

1、二叉树算术表达式求值

【问题描述】

由输入的四则算术表达式字符串,动态生成算术表达式所对应的二叉树,通过二叉树遍历求值并输出。

【实验要求】

设计十进制整数四则运算计算器。

(1)采用二叉树等存储结构。

(2)给定表达式字符串,生成二叉树。

(3)对二叉树遍历求值并输出。

2、哈夫曼编码

【问题描述】

利用哈夫曼树求得用于通信的二进制编码称为哈夫曼编码。以N中字符出现的频率作为权值,设计电文总长度最短的二进制前缀编码(哈夫曼编码)。

【实验要求】

设计哈夫曼编码及解码程序。

(1)采用二叉树等存储结构。

(2)创建哈夫曼树,生成哈夫曼编码。

(3)编码文件的译码。

(4)可尝试位图文件的压缩问题。

3、互联网域名查询

【问题描述】

互联网域名系统是一个典型的树形层次结构。从根节点往下的第一层是顶层域,如cn、com等,最底层(第四层)是叶子结点,如www等。因此,域名搜索可以看成是树的遍历问题。

【实验要求】

设计搜索互联网域名的程序。

(1)采用树的孩子兄弟链表等存储结构。

(2)创建树形结构。

(3)通过深度优先遍历搜索。

(4)通过层次优先遍历搜索。

4、全线索链表应用

【问题描述】

对二叉树的二叉链表结点增加两个指针域,前驱指针prior和后继指针next。通过该结点构造全线索二叉链表。

【实验要求】

设计一个全线索二叉链表的应用程序。

(1)创建全线索二叉树。

(2)完成全线索二叉树的主要基本操作。

(3)给出简单应用实例。

5、图遍历生成树演示

【问题描述】

通过对连通图和非连通图的遍历,访问图中全部结点。

【实验要求】

设计图遍历生成树演示程序。

(1)采用邻接表和邻接矩阵等存储结构。

(2)分别采用深度优先和广度优先遍历实现。

(3)尝试插入或删除一条边或一个结点的访问操作。

6、校园导游咨询

【问题描述】

设计有N个校园景点的平面图,为来访客人提供时间最省的优质服务。

【实验要求】

设计校园导游咨询的模拟程序。

(1)采用邻接表或邻接矩阵存储结构。

(2)可以查询任意两个景点间的最短路径。

(3)尝试求解遍历全部景点时间最省的程序。

7、学期授课计划编制

【问题描述】

大学每个学期的课程授课有学分及授课门数上限的规定。课程之间有先行课的限制。设计编制学期授课计划,使得总的教学时长为最短的拓扑集合划分程序。

【实验要求】

设计大学四年制授课计划编制的模拟程序。

(1)采用邻接表或邻接矩阵存储结构。

(2)使用栈或队列等作为拓扑排序的辅助数据结构。

(3)可以尝试采用深度优先遍历求解问题。

8、光纤管道铺设施工问题

【问题描述】

设计校园内有N个教学楼及办公楼,要铺设校园光纤网,如何设计施工方案使得工程总的造价为最省。

【实验要求】

设计校园光纤网铺设的最小生成树模拟程序。

(1)采用邻接表或邻接矩阵存储结构。

(2)分别采用普利姆算法和克鲁斯卡尔算法实现。

9、关键路径问题

【问题描述】

设计有N个工序的工程施工图,为保证工程进度,求其关键路径,以保证工期完成。

【实验要求】

设计求解工程关键路径的模拟程序。

(1)采用邻接表或邻接矩阵存储结构。

(2)使用栈或队列等作为拓扑排序的辅助数据结构。

(3)可以尝试采用深度优先遍历求解问题。

10、关节点问题

【问题描述】

对无向连通图,若删除某个结点使其成为非连通图,则称该结点为关节点。假设某一地区公路交通网,求解关节点。

【实验要求】

设计求解无向连通图关节点的模拟程序。

(1)采用邻接表或邻接矩阵存储结构。

(2)采用深度优先遍历求解。

实验四查找和排序应用类实验题目参考

1、索引顺序表应用

【问题描述】

东北大学信息学院学生信息查询系统。各专业按名称有序,专业内按班级编号有序,班级内记录无序。

【实验要求】

设计索引顺序表的学生信息查询系统。

(1)采用顺序表、索引表等存储结构。

(2)采用二级顺序表索引。

(3)完成表的创建、插入、查询等操作。

(4)分析平均查找长度特性。

2、哈希表应用

【问题描述】

针对学生的手机号码,设计一个哈希表,使得平均查找长度不超过给定值R。【实验要求】

设计哈希表应用程序。

(1)采用顺序或链式存储结构。

(2)设计哈希函数。

(3)分析平均查找长度特性。

3、二叉排序树应用

【问题描述】

互联网域名系统是一个典型的树形层次结构。从根节点往下的第一层是顶层域,如cn、com等,最底层(第四层)是叶子结点,如www等。因此,域名搜索可以构造树的结构完成。

【实验要求】

设计基于二叉排序树的搜索互联网域名的程序。

(1)采用二叉树的二叉链表存储结构。

(2)完成二叉排序树的创建、插入、删除、查询操作。

(3)可以考虑两棵二叉排序树的合并。

4、平衡二叉树演示

【问题描述】

利用平衡二叉树设计动态查找表。

【实验要求】

设计平衡二叉树的动态演示的模拟程序。

(1)采用平衡二叉树存储结构。

(2)完成平衡二叉树的创建、查找、插入和删除的演示操作。

(3)可以考虑两棵平衡二叉树的合并。

5、3阶B-树应用

【问题描述】

应用3阶B-树,对图书馆的图书进行简单管理。

【实验要求】

设计基于B-树的图书管理模拟程序。

(1)采用3阶B-树存储结构。

(2)以书号为关键字,完成图书的入库、出库和查询操作。

(3)自定义显示操作结果的形式。

6、快速排序应用

【问题描述】

应用快速排序算法,查找顺序表中的第K小的元素。

【实验要求】

设计求顺序表中的第K小元素。

(1)采用顺序表存储结构。

(2)完成顺序表的快速排序。

(3)应用快速排序求第K小元素。

(4)通过性能分析,尝试如何改进。

7、堆排序

【问题描述】

应用堆排序求出记录中的前K名。

【实验要求】

设计堆排序应用程序。

(1)采用二叉树的二叉链表结构。

(2)完成堆排序的插入、删除、查找等基本操作。

(3)给出应用实例。

8、计数式基数排序

【问题描述】

统计研究生入学成绩的排名。除了总分的要求外,还有专业课等单科小分的要求。

【实验要求】

设计计数式基数排序的应用程序。

(1)采用顺序表存储结构。

(2)利用对关键字位的统计和复制的方法实现计数式基数排序。

(3)给出应用实例。

9、传统排序与优化排序比较

【问题描述】

传统的插入、选择、交换排序,对应优化的排序方法有希尔排序、堆排序和快速排序。

【实验要求】

设计传统排序和优化排序算法的比较程序。

(1)采用顺序表等存储结构。

(2)比较算法的关键字比较次数、移动次数、时间复杂度、平均性能、空间复杂度等。

(3)测试数据由随机数生成器生成。

10、置换-选择排序的实现

【问题描述】

对文件中的记录的关键字采用外部排序的置换-选择算法实现。

【实验要求】

设计置换-选择排序的模拟程序。

(1)记录存储在文件中。

(2)采用多路归并算法实现。

(3)采用置换-选择算法实现。

(4)两种方法的性能比较。

实验五自主研究性实验题目参考------基于STL数据结构及应用

1、STL的一维向量类vector

(1)实现STL的一维向量类vector。

(2)一维向量类vector的简单应用。

2、STL的双端队列deque

(1)实现STL的双端队列类deque。

(2)双端队列类deque的简单应用。

3、STL的静态链表类

(1)实现STL的静态链表类。

(2)静态链表类的简单应用。

4、STL的双向循环链表类

(1)实现STL的双向循环链表类。

(2)双向循环链表类的简单应用。

5、STL的栈stack类

(1)实现STL的栈stacke类。

(2)栈stacke类的简单应用。

6、STL的队列queue类

(1)实现STL的队列queue类。

(2)队列queue类的简单应用。

7、STL的优先队列类类

(1)用堆实现STL的优先队列类。

(2)优先队列类的简单应用。

8、STL的二叉排序树stree类

(1)实现STL的二叉排序树stree类。

(2)二叉排序树stree类的简单应用。

9、STL的邻接表结构图类

(1)采用STL的邻接表结构图类。

(2)邻接表结构图类的简单应用。

10、基于STL的拓扑排序

(1)采用STL的图、栈等数据结构。

(2)实现STL的邻接表结构图类的拓扑排序。

四、实验报告要求

实验教师收集每个人递交个人实验报告的全部电子版。

实验报告的内容包括:

1、问题定义及需求分析

说明课题的目的和任务。应包括:输入的形式和输入值的范围;输出的形式;程序的功能;测试数据。

2、概要设计

说明程序中所用到的抽象数据类型的定义、主程序的流程以及各程序模块之间的调用关系。

3、详细设计

实现概要设计中定义的所有数据类型及存储结构;对每个模块及操作写出伪码算法。

4、调试分析

对所遇问题的解决方法及分析;算法的时空分析及改进设想;经验和体会。

5、使用说明

如何使用该程序,详细列出每一步的操作步骤。

6、测试结果

列出包括输入和输出的测试结果。

7、附录

带注释的源程序或程序盘。

五、实验成绩

实验成绩采用百分制,由平时实验课成绩(20%),实验报告成绩(30%),实验程序验收(50%)组成,按比例折算到课程的总成绩。

12

六、实验教材及参考书

[1] 严蔚敏、吴伟民编著.《数据结构题集》(C语言版). 北京:清华大学出

版社. 1999

[2] 严蔚敏、吴伟民编著.《数据结构》(C语言版).北京:清华大学出版社. 2007

[3] 严蔚敏、陈文博编著.《数据结构及应用算法教程》(修订版). 北京:清

华大学出版社. 2011

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构实验一顺序表问题及实验报告模板 - Copy

实验一顺序表问题 【实验报告】 《数据结构与算法》实验报告一 学院:计算机与信息学院班级: 学号:姓名: 日期:程序名: 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输出结点值。 调试数据:9 8 7 6 5 4 3 2 1 2.从键盘输入1个整数,在顺序表中查找该结点。若找到,输出结点的位置;若找不到, 则显示“找不到”。 调试数据:第一次输入11,第二次输入3 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 调试数据:第一次insert "11" after "6" ,第二次insert "86" at "2" 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 调试数据:第一次delete the number at "2" ,第二次delete value "9" 注意:顺序表输出表现形式如下(实验报告上为截图): 顺序表: 第一题 Initially Seq: head -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null 第二题 找不到 6 第三题 insert "11" after "6": head -> 9 -> 8 -> 7 -> 6 -> 11 -> 5 -> 4 -> 3 -> 2 -> 1 -> null insert"86"at"2":head -> 9 -> 8 -> 86 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null 第四题 delete the number at "2":head -> 9 -> 8 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 ->null delete value "9": head -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include// 库头文件------ 动态分配内存空间 typedef int elemtype;// 定义数据域的类型 typedef struct linknode// 定义结点类型 { elemtype data;// 定义数据域 struct linknode *next;// 定义结点指针 }nodetype; 2)创建单链表

nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"<> d; if(d==0) break;// 以0 表示输入结束 if(i==1)// 建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));// 表示指针h h->data=d;h->next=NULL;t=h;//h 是头指针 } else// 建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t 始终指向生成的单链表的最后一个节点

数据结构实验总结报告

数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,

会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

数据结构实验总结报告

数据结构实验总结报告 李博杰PB10000603 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。 ①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构实验报告

数据结构实验报告 第次实验 学号: 20141060106 姓名:叶佳伟 一、实验目的 1、复习二叉树的逻辑结构、存储结构及基本操作; 2、掌握二叉链表及二叉树的创建、遍历; 3、了解二叉树的应用。 二、实验内容 1、(必做题)假设二叉树中数据元素类型是字符型,请采用二叉链表实现二叉树的以下基本操作: (1)根据二叉树的先序序列和中序序列构造二叉树; (2)根据先序遍历二叉树; (3)根据中序遍历二叉树; (4)根据后序遍历二叉树。 测试数据包括如下错误数据: 先序:1234;中序:12345 先序:1234;中序:1245 先序:1234;中序:4231 2、(必做题)对于一棵二叉树,请实现: (1)计算二叉树的叶子数目; (2)计算二叉树的深度。 三、算法描述 (采用自然语言描述) 1、先构造一个二叉树的结构体,再构造createtree的函数实现数据的输入。在键盘上输入先序和中序序列。先判断先序和后序序列是否符合逻辑。若符合逻辑,则在先序、中序、后序函数将二叉树输出。 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #define max 5 #define TEL 2*max+1

#include "stdio.h" #include "stdlib.h" #include "string.h" typedef char TElemType; typedef struct BiTNode{ TElemType data; //数据域 struct BiTNode *lchild, *rchild; //左右孩子指针域 } BiTNode, *BiTree; BiTNode root; BiTree rt=&root; int calculate(char c,char s[],int st) {char *p; p=s+st; while(*p!=c && *p!='\0') p++; return p-s; } void createtree(BiTree *t,int i1,int i2,int len,char preorder[],char pinorder[]) {int r,llen,rlen; if(len<=0) *t=NULL; else {*t=(BiTree)malloc(sizeof(BiTNode)); (*t)->data=preorder[i1]; r=calculate(preorder[i1],pinorder,i2); llen=r-i2; rlen=len-(llen+1); createtree(&(*t)->lchild,i1+1,i2,llen,preorder,pinorder); createtree(&(*t)->rchild,i1+llen+1,r+1,rlen,preorder,pinorder); } } void PostOrderTraverse(BiTree t) {if(t) {PostOrderTraverse(t->lchild); PostOrderTraverse(t->rchild); putchar(t->data); } } void PreOrderTraverse(BiTree t) {if(t) {putchar(t->data);

数据结构实验报告模板(验证型)

学期:2010-2011学年第一学期指导教师:杨华莉成绩: 实验一顺序表的基本操作 一、实验目的 1.掌握使用VC++6.0调试程序的基本方法; 2.掌握线性表的顺序存储结构的类型定义; 3.掌握顺序表的基本操作的实现,如:插入、删除、遍历、查找、排序、修改、合并等; 4.掌握顺序表的应用。 二、实验要求 1.认真阅读和掌握本实验的示例程序。 2.上机运行示例程序,打印出程序的运行结果,并作必要的说明。 3.对示例程序,按照对线性表的操作需要,在程序中至少添加2个顺序表的相关操作。如: i.查找并显示分数在区间[a,b)的学生信息; ii.查找并显示最高分或最低分学生信息; iii.统计不及格或及格人数及所占比例; iv.将信息表按学号、姓名或分数升序或降序排列; v.按学号顺序进行数据元素的插入; vi.删除指定学号或姓名的学生信息; vii.修改某个学生的信息; viii.其它。 4.重新改写主函数(要求必需调用自己添加的操作),打印出文件清单(自己添加的函数、修改后的主函数和运行结果)。 5.对修改后的程序,分析每一个算法(函数)的时间复杂度。 6.根据上述要求撰写实验报告,并简要给出算法设计小结和心得。 三、实验环境 1.台式计算机每人一台; 2.软件:Visual C++6.0 四、实验内容和实验结果

一.示例程序运行结果及说明

二.自己添加的新函数(至少2个),要求加必要的注释。 SqList Delete_SqList(SqList &L)//删除学生信息 { Elemtype x; int i=0; int choice=DMenu(); char name[25]; int num,k; if(!L.length) { printf("表为空,无法删除!"); exit(0); } switch(choice) { case 1: //按姓名删除 printf("\n请输入要删除的学生的姓名\n"); scanf("%s",&name); k=strcmp(name,L.data[i].name);//比较姓名 if(k==0) { x=L.data[i-1]; for(int m=L.length-1;m>=i-1;--m) L.data[i-1]=L.data[i]; --L.length; break; } case 2: //按学号删除 printf("\n请输入要删除学生的学号\n"); scanf("%d",&num); if(num==L.data[i].num) { for(int m=L.length-1;m>=i-1;--m) L.data[i-1]=L.data[i]; --L.length; break; } case 3:break; } return L;

数据结构实验报告范例

《数据结构与算法》实验报告 专业班级姓名学号 实验项目 实验一二叉树的应用 实验目的 1、进一步掌握指针变量的含义及应用。 2、掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。 3、掌握用指针类型描述、访问和处理二叉树的运算。 实验内容 题目1:编写一个程序,采用一棵二叉树表示一个家谱关系。要求程序具有如下功能:(1)用括号表示法输出家谱二叉树, (2)查找某人的所有儿子, (3)查找某人的所有祖先。 算法设计分析 (一)数据结构的定义 为了能够用二叉树表示配偶、子女、兄弟三种关系,特采用以下存储关系,则能在二叉树上实现家谱的各项运算。 二叉树型存储结构定义为: typedef struct SNODE {char name[MAX]; //人名 struct SNODE *left; //指向配偶结点 struct SNODE *right; //指向兄弟或子女结点 }FNODE; (二)总体设计 实验由主函数、家谱建立函数、家谱输出函数、儿子查找函数、祖先查找函数、结点定位函数、选择界面函数七个函数共同组成。其功能描述如下: (1)主函数:统筹调用各个函数以实现相应功能 void main() (2)家谱建立函数:与用户交互建立家族成员对应关系 void InitialFamily(FNODE *&head) //家谱建立函数 (3)家谱输出函数:用括号表示法输出家谱 输出形式为:父和母(子1和子妻1(孙1),子2和子妻2(孙2)) void PrintFamily(FNODE *head) //家谱输出函数

(4)儿子查找函数:在家谱中查找到某人所有的子女并输出,同时也能辨别出其是否为家族成员与是否有子女 void FindSon(FNODE *b,char p[]) //儿子查找函数 (5)祖先查找函数:在家谱中查找到某人所有的祖先并输出,同时也能辨别出其是否为家族中成员。 int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数 (6)结点定位函数:在家谱中找到用户输入人名所对应的结点。 FNODE *findnode(FNODE *b,char p[]) //结点定位函数 (7)选择界面函数:为便于编写程序,将用户选择部分独立为此函数。 void PRINT(int &n) (三)各函数的详细设计: void InitialFamily(FNODE *&head) //家谱建立函数 1:首先建立当前人的信息,将其左右结点置为空, 2:然后让用户确定其是否有配偶,如果没有配偶,则当前程序结束, 3:如果有则建立其配偶信息,并将配偶结点赋给当前人的左结点; 4:再让用户确定其是否有子女,如果有则递归调用家谱建立函数建立子女结点,并将其赋给配偶结点的下一个右结点。 5:如无,则程序结束 void PrintFamily(FNODE *head) //家谱输出函数 1:首先判断当前结点是否为空,如果为空则结束程序; 2:如果不为空,则输出当前结点信息, 3:然后判断其左结点(配偶结点)是否为空,如不为空则输出“和配偶信息。 4:再判断配偶结点的右结点是否为空,如不为空则递归调用输出其子女信息,最后输出“)”; 5:当配偶结点为空时,则判断其右结点(兄弟结点)是否为空 6:如果不为空,则输出“,”,并递归调用输出兄弟信息 7程序结束 FNODE *findnode(FNODE *b,char p[]) //结点定位函数 1:当前结点是否为空,为空则返回空; 2:如果和查找信息相同,则返回当前结点; 3:如不然,则先后递归访问其左结点,再不是则递归访问右结点 void FindSon(FNODE *b,char p[]) //儿子查找函数 1:在家谱中定位到要查找的结点,如无则输出“查找不到此人” 2:判断其配偶结点与子女结点是否为空,为空则输出“无子女” 3:不为空则输出其配偶结点的所有右结点(子女结点)。 int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数 1:先在家谱中定位到要查找的结点,如为空输出“不存在此人”,程序结束 2:先将父母结点入栈,当栈为空时程序结束, 3:栈不为空时,判断栈顶元素是否已访问过, 4:访问过,再判断是否为查找结点,如是则输出栈中保存的其祖先结点,并滤过其兄弟结点不输出;不是查找结点,则退栈一个元素 5:未访问过,则取当前栈顶元素,置访问标志——1,同时取其右结点 6:栈不为空或当前所取结点不为空时,转到2; 实验测试结果及结果分析

数据结构实验报告

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构 实验学期2015至2016学年第一学期 学生所在系部计算机学院 年级2014专业班级物联B142班 学生姓名杨文铎学号201407054201 任课教师白磊 实验成绩

用哈夫曼编码实现文件压缩 1、了解文件的概念。 2、掌握线性表的插入、删除的算法。 3、掌握Huffman树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用Haffman树及Haffman编码,掌握实现文件压缩的一般原理。 微型计算机、Windows系列操作系统、Visual C++6.0软件 根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。 本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符,无须全部都用S为的ascii码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制数字符进行存储,已达到节省存储空间,压缩文件的目的,解决了压缩需要采用的算法,程序的思路已然清晰: 1、统计需压缩文件中的每个字符出现的频率 2、将每个字符的出现频率作为叶子节点构建Haffman树,然后将树中结点引向 其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码 即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman 编码,将每个字符用最短的二进制字符表示。 3、打开需压缩文件,再将需压缩文件中的每个ascii码对应的haffman编码按bit 单位输出。 4、文件压缩结束。 (1)构造haffman树的方法一haffman算法 构造haffman树步骤: I.根据给定的n个权值{w1,w2,w3…….wn},构造n棵只有根结点的二叉 树,令起权值为wj。 II.在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 III.在森林中删除这两棵树,同时将得到的二叉树加入森林中。 IV.重复上述两步,知道只含一棵树为止,这棵树即哈夫曼树。 对于haffman的创建算法,有以下几点说明: a)这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为

数据结构实验报告七查找、

云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2010秋季学期 任课教师: 实验题目: 查找算法设计与实现 姓名: 王辉 学号: 20091120154 电子邮件: 完成提交时间: 2010 年 12 月 27 日

云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号:姓名:本人承担角色: 综合得分:(满分100分) 指导教师:年月日(注:此表在难度为C时使用,每个成员一份。)

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 1 哈希表查找。根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。 熟悉各种查找算法的思想。 2、掌握查找的实现过程。 3、学会在不同情况下运用不同结构和算法求解问题。 4 把每个学生的信息放在结构体中: typedef struct //记录 { NA name; NA tel; NA add; }Record; 5 void getin(Record* a)函数依次输入学生信息 6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。并采用二次探测再散列法解决冲突。 7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。将初始班级的通讯录信息存入文件。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1抽象数据类型的功能规格说明和结构体: #include

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构二叉树实验报告

实验三二叉树的遍历 一、实验目的 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 二、实验环境 运行C或VC++的微机。 三、实验内容 1、依次输入元素值,以链表方式建立二叉树,并输出结点的值。 2、分别以前序、中序和后序遍历二叉树的方式输出结点内容。 四、设计思路 1. 对于这道题,我的设计思路是先做好各个分部函数,然后在主函数中进行顺序排列,以此完成实验要求 2.二叉树采用动态数组 3.二叉树运用9个函数,主要有主函数、构建空二叉树函数、建立二叉树函数、访问节点函数、销毁二叉树函数、先序函数、中序函数、后序函数、范例函数,关键在于访问节点 五、程序代码 #include #include #include #define OK 1 #define ERROR 0 typedef struct TNode//结构体定义 {

int data; //数据域 struct TNode *lchild,*rchild; // 指针域包括左右孩子指针 }TNode,*Tree; void CreateT(Tree *T)//创建二叉树按,依次输入二叉树中结点的值 { int a; scanf("%d",&a); if(a==00) // 结点的值为空 *T=NULL; else // 结点的值不为空 { *T=(Tree)malloc(sizeof(TNode)); if(!T) { printf("分配空间失败!!TAT"); exit(ERROR); } (*T)->data=a; CreateT(&((*T)->lchild)); // 递归调用函数,构造左子树 CreateT(&((*T)->rchild)); // 递归调用函数,构造右子树 } } void InitT(Tree *T)//构建空二叉树 { T=NULL; } void DestroyT(Tree *T)//销毁二叉树 { if(*T) // 二叉树非空 { DestroyT(&((*T)->lchild)); // 递归调用函数,销毁左子树 DestroyT(&((*T)->rchild)); // 递归调用函数,销毁右子树 free(T); T=NULL; } } void visit(int e)//访问结点 { printf("%d ",e); }

数据结构实验报告示例

数据结构实验 实验二 线性表的应用 计算机科学与技术系班 组长: 组员: 日期:

实验报告 实验类型__综合设计__实验室____________ 1.实验题目 编制一个演示单链表插入、删除、查找等操作的程序 2.实验目的和要求 1)掌握线性表的特点 2)掌握线性表的顺序存储结构和链式存储结构的基本运算及应用。 3)尽可能考虑算法的健壮性 4)实验报告中要写出测试数据、错误分析以及收获。 3.需求分析 本演示程序用TC编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。 ①输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数②输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置 ③程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作 ④测试数据 A、插入操作中依次输入11,12,13,14,15,16,生成一个单链表 B、查找操作中依次输入12,15,22返回这3个元素在单链表中的位置 C、删除操作中依次输入2,5,删除位于2和5的元素 4.概要设计 为了实现上述程序功能,需要定义单链表的抽象类型如下: ADT LinkList { 数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0} 数据关系:R={|ai,ai+1 ∈D} 基本操作: InitLinkList(&L) 操作结果:构造一个空的单链表L. InsLinkList(&L,pos,e) 初始条件:单链表L已存在

数据结构实验报告图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif #include using namespace std; #include "" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0;

《数据结构实验》实验题目及实验报告模板

《数据结构实验》的实验题目及实验报告模板 实验一客房管理(链表实验) ●实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练 掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法 实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 ●实验机时:8 ●设计要求: #include #include #include //定义客房链表结点结构 typedef struct HNode { char roomN[7]; //客房名称 float Price; //标准价格 float PriceL; //入住价格(默认值=标准价格*80%) int Beds; //床位数Beds char State[5]; //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲") struct HNode *next; //指针域 }Hotel, *HLink; (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,要求:用文件操作来输入客房信息(客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN),查找房间名称为roomN的客房。如果找到,则返回该客房在链表中的位置序号(>=1),否则返回0。提示:用strcmp()字符串比较函数; (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。提示:用strcpy()字符串拷贝函数; (5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%; (6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除; (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法;

相关主题
文本预览
相关文档 最新文档