11实验指导手册.docx
《11实验指导手册.docx》由会员分享,可在线阅读,更多相关《11实验指导手册.docx(15页珍藏版)》请在冰豆网上搜索。
11实验指导手册
《数据结构》
实验指导手册
计算机教研室
1.实验教学的目的:
通过实验,加深对算法与数据结构基本知识的理解,掌握数据结构的理论和设计技术及其使用,培养学生数据结构的设计、开发能力。
2.实验教学的要求:
学生每次实验前必须根据实验指导手册,设计出实验方案(程序和实验步骤);在实验过程中要求独立进行程序调试和排错,必须学会使用在线帮助解决实验中遇到的问题,必须应用理论知识分析问题、解决问题。
3.实验内容:
实验1:
VC6的使用
一、实验目的
理解和掌握如何使用VisualC++环境编写C/C++程序。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
1、熟悉VC6环境
掌握如何创建控制台应用程序。
掌握一些常用快捷键,例如编译F7,运行Ctrl+F5,调试运行F5,单步运行F10/F11,设置断点F9,格式化代码Alt+F8。
2、掌握如何编译程序
理解编译过程中的错误信息,并掌握如何排错。
3、掌握如何调试程序
掌握如何通过设置断点来单步调试程序,如何查看当前变量的值。
4、实验题:
完成实验教材的实验题、、。
要求:
实现该实验结果。
通过该实验题,熟悉VC6环境下的程序编写、编译、调试。
实验2:
顺序表基本运算
一、实验目的
(1)掌握顺序表的各种基本运算的实现。
(2)能够利用基本运算进行顺序表的操作。
二、实验环境
装有VisualC++的计算机。
本次实验共计2学时。
三、实验内容
1、顺序表基本运算
实现顺序表的各种基本运算;并在此基础上设计一个主程序,完成如下功能:
初始化顺序表L(元素类型为char型)
依次采用尾插法插入a,b,c,d,e元素
输出顺序表L
输出顺序表L的长度
判断顺序表L是否为空
输出顺序表L的第3个元素
输出元素’a’的位置
在第4个元素位置上插入’f’元素
输出顺序表L
删除顺序表L的第3个元素
输出顺序表
释放顺序表
提示:
可以参考上课教材、实验教材的实验题。
2、顺序表的应用(选做)
(1)设计通讯录(也可为其他应用)文件的存储格式和线性表的顺序存储结构
(2)设计在通讯录(也可为其他应用)中添加、删除、查找某个节点信息程序
(3)调试程序
实验3:
单链表基本运算
一、实验目的
(1)掌握链表的概念;掌握单链表的各种基本运算的实现。
(2)能够利用基本运算进行单链表的操作。
(3)加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计2学时。
三、实验内容
实现单链表的各种基本运算;并在此基础上设计一个主程序,完成如下功能:
(1)初始化单链表L
(2)依次采用尾插法插入a,b,c,d,e元素
(3)输出单链表L
(4)输出单链表L的长度
(5)判断单链表L是否为空
(6)输出单链表L的第3个元素
(7)输出元素’a’的位置
(8)在第4个元素位置上插入’f’元素
(9)输出单链表L
(10)删除单链表L的第3个元素
(11)输出单链表L
(12)释放单链表L
提示:
可以参考上课教材、实验教材的实验题。
实验4:
单链表综合实验
一、实验目的
(1)能够利用单链表的基本运算进行单链表的相关操作。
(2)掌握文件的应用
(3)加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
1、通讯录设计
设计一个班级同学的通讯录,要求如下:
通讯录中每个同学的信息包含以下内容:
学号(id)、姓名(name)、电话号码(tel)。
如果需要更多其他信息,请自行添加。
程序主菜单包含以下几个功能:
添加记录:
通过键盘输入信息,添加一条通讯录记录。
删除记录:
通过键盘输入学号,删除该学号的记录。
输出记录:
输出通讯录全部记录。
按姓名查找:
通过键盘输入姓名,输出该同学的所有信息。
保存记录:
把通讯录中所有的记录保存到文件中。
清空记录:
删除通讯录中的全部记录,并删除文件。
退出
提示:
程序启动时应判断是否存在记录文件,如果存在,则读取每条记录到链表中。
用户选择并完成主菜单某功能后,除了退出程序,应该返回主菜单。
添加一条记录时,插入到链表的尾部。
查找、删除记录时,如果该记录不存在,则应该输出不存在的提示。
添加记录、删除记录时不需要写文件。
保存记录时,用覆盖写文件的方法。
(或者先删除原文件,再保存全部记录信息)
各个功能模块写成函数,由主函数调用。
选做:
主菜单增加一个排序功能选项,可以按照学号从小到大进行排序。
排序方法可以用冒泡排序或者插入排序。
实验5:
链栈的基本操作
一、实验目的
1)熟悉栈的定义和栈的基本操作。
2)掌握链式存储栈的基本运算。
3)加深对栈数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计2学时。
三、实验内容
必做内容:
链栈的基本操作
编写栈的基本操作函数
栈类型的定义,数据域使用char型
typedefcharElemType;
typedefstructnode{
ElemTypedata;
structnode*next;
}LinkStack;
2.初始化空栈:
函数原型如下:
voidInitLinkStack(LinkStack*&s)
其中函数参数为LinkStack*&类型,表示指向创建的空栈的指针,并且用引用方式传入。
3.判断是否空栈:
函数原型如下:
intIsEmptyLinkStack(LinkStack*s)
其中函数参数为栈指针;返回值为int型,1表示是空栈,0表示不是空栈。
4.入栈:
函数原型如下:
voidPushLinkStack(LinkStack*&s,ElemTypex)
其中函数参数s为栈指针,x为入栈的数据。
5.出栈:
函数原型如下:
intPopLinkStack(LinkStack*&s,ElemType&x)
其中函数参数s为栈指针,x为出栈的数据的引用;返回值为int型,1表示出栈成功,0表示出栈失败。
6.取栈顶元素:
(栈保持不变)函数原型如下:
intGetLinkStackTop(LinkStack*s,ElemType&x)
其中函数参数s为栈指针,x存放栈顶元素值;返回值为int型,1表示成功,0表示失败。
编写主函数
调用上述函数实现下列操作。
1.初始化空栈。
2.键盘输入字符,使得输入的字符依次入栈(结束符号自定,例如回车键(值为10)或'#')
每插入一个元素,必须输出当时的栈顶元素(调用GetLinkStackTop函数)。
3.判断链栈是否为空。
输出判断结果。
4.调用出栈函数,打印出栈元素的值;反复此步骤,直至栈为空。
5.判断链栈是否为空。
输出判断结果。
6.释放链栈。
选做内容
(一):
判断对称字符串
设计一个算法,调用栈的基本运算,判断一个字符串是否为对称字符串。
若是返回1;否则返回0。
例如:
“abcba”和“abba”都是对称字符串。
实验6:
队列的基本操作
一、实验目的
1)熟悉队列的定义和队列的基本操作。
2)掌握顺序循环队列和链式存储队列的基本运算。
3)加深对队列数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计2学时。
三、实验内容
队列的基本操作
队列的存储结构从顺序循环队列或者链队任选一种。
编写一个程序,实现队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
初始化队列q
判断q是否非空
依次进队元素a,b,c
出队一个元素,输出该元素
输出队列q的元素个数
依次进队列元素d,e,f
输出队列q的元素个数
输出出队序列
释放队列
实验7:
栈和队列综合实验
一、实验目的
(1)能够利用栈和队列的基本运算进行相关操作。
(2)进一步熟悉文件的应用
(3)加深队列和栈的数据结构理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
以下两个实验任选一个。
迷宫求解
设计一个迷宫求解程序,要求如下:
以M×N表示长方阵表示迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
能任意设定的迷宫
(选作)如果有通路,列出所有通路
提示:
以一个二维数组来表示迷宫,0和1分别表示迷宫中的通路和障碍,如下图迷宫数据为:
11
01
01
01
01
01
01
01
01
11
入口位置:
11
出口位置:
88
探索过程可采用如下算法,设定当前位置的初值为入口位置;
do{
若当前位置可通,
则{
将当前位置插入栈顶;
若该位置是出口位置,则结束;
否则切换当前位置的东邻方块为新的当前位置;
}
否则,
{
若栈不空且栈顶位置尚有其他方向未经探索,
则设定新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块;
若栈不空但栈顶位置的四周均不可通,
则{删去栈顶位置;
有向图G的邻接矩阵:
050700
004000
800009
005006
000500
300010
图G的邻接矩阵转换成邻接表:
0:
13
1:
2
2:
05
3:
25
4:
3
5:
04
从顶点0开始的DFS:
012543
从顶点0开始的BFS:
013254
第1次查找:
在[0,9]中查找到元素R[4]:
5
第2次查找:
在[5,9]中查找到元素R[7]:
8
第3次查找:
在[8,9]中查找到元素R[8]:
9
元素9的位置是8
12],哈希函数为H(k)=key%p,(p取13),并采用线性探查法解决冲突。
在上述哈希表中查找关键字为29的记录。
在上述哈希表中删除关键字为77的记录,再将其插入。
【输出结果】
输出结果例子如下:
哈希表地址:
0123456789101112
哈希表关键字:
7754164331294660748890
搜索次数:
21111411111
平均搜索长度ASL(11)=
ha[6].key=29
删除关键字77
哈希表地址:
0123456789101112
哈希表关键字:
54164331294660748890
搜索次数:
1111411111
平均搜索长度ASL(10)=
未找到77
插入关键字77
哈希表地址:
0123456789101112
哈希表关键字:
7754164331294660748890
搜索次数:
21111411111
平均搜索长度ASL(11)=
实验19:
查找综合实验
一、实验目的
1)熟悉查找的基本操作。
2)掌握二叉排序树的基本运算。
3)加深对查找的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
1、统计字符串中字符出现的次数
编写一个程序,由键盘输入一个字符串,统计该字符串中出现的字符及其次数。
然后输出结果。
要求用一个二叉树来保存处理结果,字符串中每个不同的字符用树的结点表示,结点应该包含四个域:
该字符、该字符出现的次数、左子树指针、右子树指针;其中左子树的字符的ASCII码均小于该字符,右子树的字符的ASCII码均大于该字符。
提示:
从字符串中依次读取字符,在二叉树中查找该字符是否存在。
如果存在,则该字符的出现次数加1;如果不存在,则按照二叉排序树的要求插入该字符结点,同时设置出现次数为1。
全部字符读完以后,调用二叉树的中序遍历,有序的输出每个字符及其出现的次数。
2、二叉排序树
【基本要求】
编写一个程序,实现二叉排序树的基本运算,并在此基础上完成如下功能:
由{4,9,0,1,8,6,3,5,2,7}创建一棵二叉排序树bt,并以括号表示法输出。
判断bt是否为一棵二叉排序树。
采用递归和非递归两种方法查找关键字为6的结点,并输出其查找路径。
分别删除bt中的关键字为4和5的结点,并输出删除后的二叉排序。
【输出结果】
输出结果例子如下:
创建一棵BST树:
第1步,插入4:
4
第2步,插入9:
4(,9)
第3步,插入0:
4(0,9)
第4步,插入1:
4(0(,1),9)
第5步,插入8:
4(0(,1),9(8))
第6步,插入6:
4(0(,1),9(8(6)))
第7步,插入3:
4(0(,1(,3)),9(8(6)))
第8步,插入5:
4(0(,1(,3)),9(8(6(5))))
第9步,插入2:
4(0(,1(,3
(2))),9(8(6(5))))
第10步,插入7:
4(0(,1(,3
(2))),9(8(6(5,7))))
BST:
4(0(,1(,3
(2))),9(8(6(5,7))))
bt是一棵BST
查找6关键字(递归):
4986
查找6关键字(非递归):
6894
删除操作:
原BST:
4(0(,1(,3
(2))),9(8(6(5,7))))
删除结点4:
3(0(,1(,2)),9(8(6(5,7))))
删除结点5:
3(0(,1(,2)),9(8(6(,7))))
实验20:
内排序
一、实验目的
1)熟悉排序的基本操作。
2)掌握各种内排序的操作。
3)加深对排序的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
【基本要求】
编写一个程序,实现直接插入排序算法,并输出{9,8,7,6,5,4,3,2,1,0}的排序过程。
编写一个程序,实现冒泡排序算法,并输出{9,8,7,6,5,4,3,2,1,0}的排序过程。
编写一个程序,实现快速排序算法,并输出{6,8,7,9,0,1,3,2,4,5}的排序过程。
编写一个程序,实现直接选择排序算法,并输出{6,8,7,9,0,1,3,2,4,5}的排序过程。
编写一个程序,实现堆排序算法,并输出{6,8,7,9,0,1,3,2,4,5}的排序过程。
【输出结果】
a)的输出结果例子如下:
其他的输出结果类似,要求输出排序每一步骤的状态。
初始关键字9876543210
i=18976543210
i=27896543210
i=36789543210
i=45678943210
i=54567893210
i=63456789210
i=72345678910
i=81234567890
i=90123456789
最后结果0123456789
实验21:
内排序综合实验
一、实验目的
1)熟悉排序的基本操作。
2)掌握各种内排序的操作。
3)加深对排序的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++的计算机。
本次实验共计4学时。
三、实验内容
某个二维数组存放了一系列的字符串,试利用排序的一些算法(如插入、冒泡、快速排序等)对这些字符串按照字典顺序进行排序。
例如:
二维数组的字符串如下:
chars[][20]={“while”,”if”,“else”,”do”,“for”,”switch”,“case”};