数据结构 实验指导书.docx
《数据结构 实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构 实验指导书.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
数据结构实验
•实验目的意义
数据结构实验是《数据结构》课程必不可少的一个教学环节。
通过实验,学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构和算法的能力,而且可以在问题分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。
实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养软件工作所需要的动手能力。
•实验基本步骤及要求
1.阅读实验指导书
每一次实验从阅读实验指导书开始。
对于本次实验的实验目的、实验题目、实现提示以及思考题目、选做题目等应认真了解。
2.算法设计
分析实验题目,参考实现提示,进行算法设计。
3.程序设计
根据已完成的算法,用C语言进行程序设计。
4.调试和测试
将所编程序在计算机上调试通过,并选取若干组测试数据对程序进行尽可能全面的测试。
5.整理完成实验报告
实验报告一般包括下列内容:
(1)实验者姓名、学号、专业和班级,课程名称(数据结构实验),实验日期等;
(2)本次实验的实验编号及实验名称(例如:
实验一线性表的应用);
(3)本次实验的实验目的(可参考《数据结构实验指导》相关内容);
(4)本次实验的实验地点、设备编号、硬件及软件环境;
(5)程序结构的描述及各模块的规格说明;
(6)主要算法及其基本思想;
(7)调试过程简述(调试过程是否顺利,遇到些什么问题,如何解决的,以及上机操作所花费的时间等);
(8)测试数据和相应输出的客观纪录,对运行结果的分析讨论。
•注意:
为了有效地利用上机时间,上述实验步骤1,2,3应在上机之前完成。
实验一线性表的应用
一.实验目的
熟悉线性表的链式存储结构,熟练掌握线性表各种基本操作的实现,培养灵活运用线性表解决实际问题的能力。
二.实验题目
键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,在单向链表中删除元素E,然后将单向链表逆置,设计一个MAIN()函数,分别调试上述算法。
对于单向链表的建立可以有两种方式选择,一种是从头结点后面依次插入,一种是从尾结点后面依次插入,可以根据实际需要选择这两种方法之一实现。
单向链表的逆置要求不增加新的存储空间,只是在原来已有链表的基础上进行逆置,而不是构造一个新的链表,将元素逆向插入到新的链表实现逆置功能。
三.实现提示
1.数据的存储结构选择链表,链表的每个结点的定义如下。
typedefintElemType;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
2.线性链表的逆置操作可以参照下图,本图给出了一个结点逆置的过程,至少需要两个中间指针完成这个工作:
四.思考及选做
1.如何使用顺序表实现本实验提出的要求。
2.比较顺序表和单向链表的优缺点。
3.线性链表的逆置如何能拿递归算法实现。
实验二栈的应用
一.实验目的
熟悉掌握数据结构中栈的基本操作,能够使用栈的结构解决一些实际中常见的问题。
二.实验题目
计算机内部存储数值的时候可以有二、十、八以及十六四种数制,利用栈的特性设计程序自动实现数制之间的转化。
需要注意的是,在程序中要能实现带小数部分的数值的转化。
尤其需要注意的是对十六进制的转化,在实际中分别用A、B、C、D、E、F来表示10、11、12、13、14、15。
在实际输出的时候要注意这一现象。
三.实现提示
1.栈的主要数据结构定义如下:
typedefstruct{
ElemType*base;
ElemType*top;
intstacksize;
}sqstack;
2.具体实现中,将待转化的数按照数制取模,将余数放入栈中,而将商作为下一次取模的操作数,重复上述过程,直到最后的商为0。
而对于有小数部分的数进行转化时一定要注意,将整数部分和小数部分分开处理,小数部分的转化与前述过程类似,不同之处在于,每次都是乘以待转数制,然后取整数部分放入栈中,重复这一过程。
四.思考及选做
1.对于有小数部分的数进行转化后,输出怎么能将整数和小数部分连接起来一起输出。
实验三栈和队列的综合应用
一.实验目的
熟悉掌握数据结构中队列的基本操作,能够结合栈与队列的结构灵活解决一些实际中问题。
二.实验题目
在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。
设计一个程序可以判断给定的一个文字是否是回文。
考虑到栈的先进后出以及队列的后进先出,可以结合这两种结构来实现需要的功能,即将文字分别入队和入栈,然后依次输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。
三.实现提示
1.队列的主要数据结构定义如下:
typedefstructQNode{
chardata;
structQNode*next;
}QNode,*Queueptr;
typedefstruct{
Queueptrfront;
Queueptrrear;
}linkQueue;
2.程序的主框架如下:
scanf("%c",&c);
while(c!
='#'){push(&s,c);EnQueue(&Q,c);scanf("%c",&c);}
while(!
(s.top==s.base))
{pop(&s,&a);DeQueue(&Q,&b);
if(a!
=b){printf("Thisisn'tacycle\n");exit(0);}
}
printf("Thisisacycle\n");returnOK;
实验四字符串处理
一.实验目的
熟悉并掌握字符串的处理技术,熟悉并掌握文本文件的操作技术,进而对一般的文字处理软件的设计方法有所了解。
二.实验题目
语言文字研究人员常常需要对某些词汇的使用频率进行统计。
试帮助他们设计一个程序,统计某篇英文小说中某些词汇的出现次数和位置。
设英文小说已存于一个文本文件中,待统计的词汇集要一次输入完毕,即统计工作应在程序的一次运行之后全部完成。
程序的输出结果是每个词的出现次数以及出现位置所在行的行号。
上机实验时,可以用C源程序模拟英文小说,用若干C保留字模拟待统计的词汇集。
三.实现提示
1.设文本文件中的词汇一律不跨行。
出现位置所在行的行号可以用链表存储。
若某词在某行中出现了不止一次,不必存多个相同的行号。
2.待统计词汇可以完全由小写字母组成,但文本文件中或许存在大写字母,程序应能够识别并予以正确统计。
3.下表中列出的用于文件操作的C标准函数可以在程序中调用。
标识符
类型
功能
fopen
函数
用于打开一个外部文件
fgetc
函数
从外部文件读取一个字符
fclose
函数
用于关闭一个文件
EOF
变量
用于判断文件是否结束
其中,fopen的调用方式为fp=fopen(filename,"r")),filename指定要打开的外部文件名,它是一个字符串类型的常量,“r”指定文件的打开方式为只读打开。
返回值fp为一个FILE*类型的指针,指向被打开的文件。
fgetc的调用方式为c=fgetc(fp),c为读取得字符。
下面是一个程序片断,该程序的功能是显示上文本文件readme.txt的内容。
if((fp=fopen(“readme.txt”,"r"))==NULL)
{
cout<<"Cannotopenfile."<}
c=fgetc(fp);
while(c!
=EOF)//文本没结束
{
c=fgetc(fp);
cout<}
四.思考及选做
1.用待统计词汇集中的词作为模式在文件的每一行中进行匹配,或用文件中的每一个词在待统计词汇集中进行查找,你更喜欢哪一种方法,为什么?
2.若文本文件中的词汇有可能跨行,在程序中应如何处理?
实验五二叉树的遍历
一.实验目的
二叉树的遍历操作是树形结构其他众多操作的基础。
本实验旨在使学生进一步加深对二叉树的先序、中序和后序等三种遍历次序特点的理解,熟悉二叉链表存储结构,熟练掌握二叉树上的递归算法的设计技术。
二.实验题目
构造一棵二叉树,使用二叉链表方式存储,试设计程序,按照先序、中序、后序三种方式将这棵二叉树遍历出来,要求使用递归和非递归两种实现方式。
三.实现提示
1.二叉树的线性链表存储数据结构:
typedefcharelemtype;
typedefstructbitree{
elemtypedata;
structbitree*lchild,*rchild;
}BiTree;
2.二叉树的构造方式:
BiTree*create()
{
BiTree*q[100];//定义q数组作为队列存放二叉链表中结点,100为最//大容量
BiTree*s;//二叉链表中的结点
BiTree*root;//二叉链表的根指针
intfront=1,rear=0;//定义队列的头、尾指针
charch;//结点的data域值
root=NULL;
cin>>ch;
while(ch!
='#')//输入值为#号,算法结束
{s=NULL;
if(ch!
=',')//输入数据不为逗号,表示不为虚结点,否则为虚结点
{s=newBiTree;
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
q[rear]=s;//新结点或虚结点进队
if(rear==1)
root=s;
else
{if((s!
=NULL)&&(q[front]!
=NULL))
{if(rear%2==0)
q[front]->lchild=s;//rear为偶数,s为双亲左孩子
else
q[front]->rchild=s;//rear为奇数,s为双亲右孩子
}
if(rear%2==1)front++;//出队
}
cin>>ch;
}
returnroot;
}
四.思考及选做
1.本实验给出了建立二叉树的二叉链表存储结构的一种方法,是否还有更简单的方法?
2.对于非递归先序遍历一般需要对每个结点进行二次进栈,这就需要一个标志位,如何处理这个标志位,使得既不需要构造新的存储结构也不需要增加一个新的标志栈。
实验六各种排序算法的比较
一.实验目的
实现常用的排序算法,加深对这些算法的理解,以后可以将这些算法应用到实际问题的解决上。
二.实验题目
排序是在实际问题中经常用到的算法,快速、选择和插入三种排序算法是排序算法中最简单的也是最常用到的,实现这三种算法,在不同的数值序列上运行,然后比较三种方法的空间复杂度和时间复杂度,分析比较结果,得出选择这三种排序算法的一般原则。
三.实现提示
1.待排序列的数据结构描述:
#defineMAXSIZE20//一个用作示例的顺序表的最大长度
typedefintKeyType;//定义关键字类型为整数类型
typedefstruct
{
KeyTypekey;//关键字项
InfoTypeotherifo;//其他数据项
}RedType;//记录类型
typedefstruct
{
RedTyper[MAXSIZE+1];//r[0]闲置或用作哨兵单元
intlength;//顺序表的长度
}SqList;//顺序表类型
2.待排序列应该考虑多种情况,例如基本有序以及基本无序的情况等,这样才能得到在不同的数据情况下算法优劣性的比较。
四.思考及选做
1.进一步探讨其他的排序算法的比较,得出类似的时间复杂度以及空间复杂度的分析,特别要注意针对不同的算法,测试数据的结构也要尽可能的丰富。
实验七表达式求值
一.实验目的
通过一个具体实际应用例子,加深对数据结构课程的理解,能够综合利用数据结构以及C语言的知识设计程序,应用到实际问题中去。
二.实验题目
常见的小型计算器可以通过输入一个由操作数和操作符组成的表达式计算出结构,设计一个程序模拟上述功能。
本实验要求至少建立两个栈和一个运算符优先级比较表,按照运算法优先级的不同操作两个栈,最终实现整个表达式的求值。
本程序可以移植到任何一个小型计算器中。
三.实现提示
1.运算符优先级表如下图所示:
+
-
*
/
(
)
#
+
>
>
<
<
<
>
>
-
>
>
<
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
2.从键盘上输入的都是按照字符的形式,而实际的计算过程中需要将其转化成对应的操作符和操作数,将其转化可以通过对应的ASCII码表实现,通过查找ASCII码表来找出字符所对应的操作数以及操作符。
3.表达式中可能含有多位数以及带小数的数,对这种情况的处理主要是要通过一个子函数进行,依次读入字符据直到遇到下一个运算符结束,然后整体处理整个字符串,转化成数据。
而对于带小数的情况则需要将整数部分和小数部分分开按照前述过程处理,最后再将两部分合并。
四.思考及选做
1.需要注意的是在程序实际运行的时候,对于有小数部分的情况计算的结果会出现截断误差,也就是说计算出的值有舍入情况,注意这一现象,深入理解计算机进行科学计算的本质。
实验八停车场管理模拟
一.实验目的
学习将现实世界中的问题描述为计算机所能处理的数据结构的形式,熟悉用栈和队列表示问题、解决问题的过程,熟练掌握针对具体问题时栈和队列的操作。
二.实验题目
某地下停车场由两条狭长的通道组成如下图所示。
其中停车通道可停放n辆汽车,汽车只能从入口进入.从出口开出,在停车通道内按其到达的先后顺序依次排列;临时通道不停放汽车,仅用于汽车调度。
当停车通道内某辆车要离开时,停在它前面的汽车必须依次进入临时通道为其让路,待该车离开后,这些汽车再按逆序依次返回停车通道。
每辆停放在车场的车在它离开停车场时应按其停放时间的长短交纳费用。
试根据上述情况编制一个停车场管理的模拟程序。
三.实现提示
1.停车通道类似于队列,而临时通道显然是一个栈,最好用顺序存储结构实现之。
2.输入数据可设计为一个三元组(operation,no,time),其中operation是操作类别,包括“汽车到达”、“汽车离去”及“操作结束”等信息,可用字符型数据表示;no是汽车牌照号码,可用整数表示;而time则是汽车到达或离去的时刻,为了简化问题,也可用整数来表示。
除了表示操作结束的输入数据外,其他输入数据应按time的值从小到大有序。
例如以下是一组输入数据:
(A,1,0),(A,2,5),(A,3,10),(D,2,15),(A,4,20),(D,3,25),(D,1,30),(E,0,0)。
其中,A表示汽车到达,D表示汽车离去,E表示操作结束。
3.队列或栈中每个元素表示一辆汽车,应包含两个数据项:
汽车的牌照号码和进入停车场的时刻。
4.一辆车到达后,应输出整个停车通道的停车状况。
5.某辆车离去时,应输出:
(1)停在它前面的车进入临时通道后,整个停车通道和临时通道的停车状况;
(2)离去汽车的结算情况(车号,停车时间及应付的停车费用);
(3)该车离去后,整个停车通道的停车状况。
四.思考及选做
1.为什么说,本实验题目最好用顺序存储结构实现?
2.若汽车到达或离去的时刻用“时:
分”的形式表示,并且停车场昼夜可停可取,应如何修改程序?