《数据结构》实验指导书Java语言版Word文档下载推荐.docx
《《数据结构》实验指导书Java语言版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构》实验指导书Java语言版Word文档下载推荐.docx(115页珍藏版)》请在冰豆网上搜索。
![《数据结构》实验指导书Java语言版Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/1/73889582-b25b-4cab-8679-9a35a51c2473/73889582-b25b-4cab-8679-9a35a51c24731.gif)
每个实验完成后要认真书写实验报告,对程序运行的结构,要认真分析,总结每次实验项目的体会与收获。
四、报告与考核
每个实验都要求学生根据上机内容写出实验报告,报告要求包括以下七个方面的内容:
1.实验目的;
2.实验内容;
3.实验要求;
4.算法设计;
5.详细程序清单;
6.程序运行结果;
7.实验心得体会。
考核方式:
每个实验项目根据以下两个方面进行考核:
1.指导教师随堂抽查学生的实验过程(包括实验预习、实验出勤、实验结果的测试),并根据抽查结果评定学生成绩,此成绩占此实验总成绩的70%;
2.学生编写课程实验报告,每位学生按照实验报告的内容和要求编写详细的实验报告上交给指导老师,由指导老师根据每位学生的完成情况评定成绩,此成绩占实验总成绩的30%。
五、设备及器材材料配置
硬件:
奔腾以上PC机
软件:
Netbeans6.5以上或Eclipse、MyEclipse等编程环境
六、实验指导书及主要参考书
[1]刘小晶.数据结构实验指导书(Java语言版)
[2]RobertLafore著,计晓云等译.Java数据结构和算法(第二版)[M].北京:
中国电力出版社,2004.
[3]SartajSahni著,孔芳,高伟译.数据结构、算法与应用(Java语言描述)[M].北京:
中国水利水电出版社,2007.
[4]叶核亚.数据结构(Java版)[M].北京:
电子工业出版社,2004.
[5]邓俊辉.数据结构与算法(Java语言描述)[M].北京:
机械工业出版社,2006.
[6]朱战立.数据结构-Java语言描述[M].北京:
清华大学出版社,2005.
[7]张铭.数据结构与算法.高教出版社.2008.6
[8]张铭.数据结构与算法--学习指导与习题解析.高教出版社.2009
[9]耿国华等数据结构-C语言描述.高教出版社.2005.7
[10]刘怀亮.数据结构(C语言描述).冶金出版社.2005.2
[11]刘怀亮.数据结构(C语言描述)习题与实验指导导.冶金出版社.2005.2
[12]蔡子经,施伯乐.数据结构教程.上海:
复旦大学出版社.1994
[13]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社.1999;
[14]严蔚敏,吴伟民.数据结构题集(C语言版).北京:
[15]徐孝凯.数据结构课程实验.北京:
清华大学出版社.2002;
[16]孟佳娜,胡潇琨.算法与数据结构实验与习题.北京:
机械工业出版社.2004.
七、实验项目与内容提要
序号
实验名称
目的要求、内容提要
(限20字)
每组人数
实验学时
实验类型
必做
选做
所在实验分室
1
顺序表的基本操作
熟悉并完成顺序表上基本操作的算法及其应用问题的编程实现。
1个班
2
验证与设计
链表的基本操作
熟悉并完成单链表和双向链表基本操作算法的编程实现。
3
栈的基本操作
熟悉并完成顺序栈和链栈基本操作算法及其应用问题的编程实现
4
队列的基本操作
熟悉并完成循环顺序队列和循环链队列基本操作算法及其应用问题的编程实现。
5
二叉树的操作
熟悉并完成二叉树遍历算法及其应用问题的编程实现。
。
6
静态查找表的查找操作
熟悉并完成静态查找表上的顺序查找、二分查找和索引查找算法的编程实现
7
二叉排序树的查找操作
熟悉并完成在二叉排序树上进行查找、插入和删除操作的编程实现。
8
哈希表上的查找操作
熟悉并完成哈希表的建立、查找和插入操作的编程实现
9
排序操作
熟悉并完成几种主要排序操作的编程实现。
10
图的遍历
熟悉并完成图的遍历、最小生成树及其应用问题的编程实现
实验B01:
顺序表的操作实验
一、实验名称和性质
所属课程
数据结构
顺序表的操作
实验性质
√验证□综合√设计
必做/选做
√必做□选做
二、实验目的
1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.了解顺序表的应用。
三、实验内容
1.建立顺序表。
2.在顺序表上实现插入、删除和查找操作(验证性内容)。
3.删除有序顺序表中的重复元素(设计性内容)。
4.完成一个简单学生成绩管理系统的设计(应用性设计内容)。
四、实验的软硬件环境要求
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
Netbeans6.5以上或Eclipse、MyEclipse等编程环境下。
五、知识准备
前期要求熟练掌握了Java语言的编程规则、方法和顺序表的基本操作算法。
六、验证性实验
1.实验要求
编程实现如下功能:
(1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在顺序表的第i(0≤i≤n)个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。
(3)删除顺序表中第i(0≤i≤n-1)个元素,并输出删除后的顺序表中各元素值。
(4)在顺序表中查找值为x的数据元素初次出现的位置。
如果查找成功,则返回该数据元素在顺序表中的位序号;
如果查找失败,则返回-1。
2.实验相关原理
线性表的顺序存储结构称为顺序表,线性表的顺序存储结构在线性表Java接口的实现类中描述如下:
publicclassSqListimplementsIList{
privateObject[]listElem;
//线性表存储空间
privateintcurLen;
//线性表的当前长度
……
}
【核心算法提示】
⑴ 顺序表插入操作的基本步骤:
要在当前的顺序表中的第i(0≤i≤n,n为线性表的当前长度)个数据元素之前插入一个数据元素x,首先要判断插入位置i是否合法,i的合法值范围:
1≤i≤n+1,若是合法位置,就再判断顺序表是否满,如果不满,则将第i个数据元素及其之后的所有数据元素都后移一个位置,此时第i个位置已经腾空,再将待插入的数据元素x插入到该位置上,最后将线性表的当前长度值增加1,否则抛出异常。
⑵ 顺序表删除操作的基本步骤:
要删除当前顺序表中的第i(0≤i≤n-1)个数据元素,首先仍然要判断i的合法性,i的合法范围是0≤i≤n-1,若是合法位置,则将第i个数据元素之后的所有数据元素都前移一个位置,最后将线性表的当前长度减1,否则抛出异常。
⑶ 顺序表查找操作的基本步骤:
要在当前顺序表中查找一个给定值的数据元素,则可以采用顺序查找的方法,从顺序表中第0个数据元素开始依次将数据元素值与给定值进行比较,若相等则返回该数据元素在顺序表中的位置,如果所有数据元素都与x比较但都不相等,表明值为x的数据元素在顺序表中不存在,则返回-1值。
【核心算法描述】
⑴ 在当前顺序表上的插入操作算法
voidinsert(inti,Objectx)throwsException{
if(curLen==listElem.length)//判断顺序表是否已满
thrownewException("
顺序表已满"
);
//抛出异常
if(i<
0||i>
curLen)//i不合法
插入位置不合法"
//抛出异常
for(intj=curLen;
j>
i;
j--)
listElem[j]=listElem[j-1];
//插入位置及其之后的所有数据元素后移一位
listElem[i]=x;
//插入x
curLen++;
//表长加1
⑵在当前顺序表上的删除操作算法
voidremove(inti)throwsException{
curLen-1)//i不合法
删除位置不合法"
for(intj=i;
j<
curLen-1;
j++)
listElem[j]=listElem[j+1];
//被删除元素及其之后的数据元素左移一个存储位置
curLen--;
//表长减1
⑶在当前顺序表是的查找操作算法
intindexOf(Objectx){
intj=0;
//j指示顺序表中待比较的数据元素,其初始值指示顺序表中第0个数据元素
while(j<
curLen&
&
!
listElem[j].equals(x))//依次比较
j++;
if(j<
curLen)//判断j的位置是否位于顺序表中
returnj;
//返回值为x的数据元素在顺序表中的位置
else
return-1;
//值为x的数据元素在顺序表中不存在
}
3.源程序代码参考
packagesy;
importjava.util.Scanner;
classSqList{
//当前长度
publicintgetCurLen(){
returncurLen;
publicvoidsetCurLen(intcurLen){
this.curLen=curLen;
publicObject[]getListElem(){
returnlistElem;
publicvoidsetListElem(Object[]listElem){
this.listElem=listElem;
//顺序表的构造函数,构造一个存储空间容量为maxSize的空线性表
publicSqList(intmaxSize){
curLen=0;
//置顺序表的当前长度为0
listElem=newObject[maxSize];
//为顺序表分配maxSize个存储单元
//在线性表的第i个数据元素之前插入一个值为x的数据元素。
其中i取值范围为:
0≤i≤curLen。
publicvoidinsert(inti,Objectx)throwsException{
if(curLen==listElem.length)//判断顺序表是否已满
thrownewException("
//输出异常
if(i<
curLen)//i小于0或者大于表长
插入位置不合理"
listElem[j]=listElem[j-1];
//插入位置及之后的元素后移
listElem[i]=x;
curLen++;
//表长度增1
//将线性表中第i个数据元素删除。
0≤i≤curLen-1,如果i值不在此范围则抛出异常
publicvoidremove(inti)throwsException{
curlew-1)//i小于1或者大于表长减1
删除位置不合理"
listElem[j]=listElem[j+1];
//被删除元素之后的元素左移
curLen--;
//表长度减1
//查找顺序表中值的x元素,若查找成功则返回元素在表中的位序(0~curLen-1),否则返回-1
publicintindexOf(Objectx){
intj=0;
//输出顺序表中的数据元素
publicvoiddisplay(){
for(intj=0;
curLen;
System.out.print(listElem[j]+"
"
System.out.println();
//换行
//测试类
publicclassSY1_SqList{
publicstaticvoidmain(String[]args)throwsException{
SqListL=newSqList(20);
//构造一个存储容量为0的空顺序表
Scannersc=newScanner(System.in);
System.out.println("
请输入顺序表的长度:
"
intn=sc.nextInt();
请输入顺序表中的各个数据元素:
for(inti=0;
i<
n;
i++)
L.insert(i,sc.nextInt());
请输入待插入的位置i(0~curLen):
inti=sc.nextInt();
请输入待插入的数据值x:
intx=sc.nextInt();
L.insert(i,x);
插入后的顺序表为:
L.display();
请输入待删除元素的位置(0~curLen-1):
i=sc.nextInt();
L.remove(i);
删除后的顺序表为:
请输入待查找的数据元素:
x=sc.nextInt();
intorder=L.indexOf(x);
if(order==-1)
此顺序表中不包含值为"
+x+"
的数据元素!
值为"
元素在顺序表中的第"
+order+"
个位置上"
4.运行结果参考如图1-1所示:
图1-1:
验证性实验运行结果
备注:
以下设计性和应用性实验内容学生可根据自己的掌握程度或兴趣自行选择其一或其二完成。
七、设计性实验
编程实现删除有序顺序表中的所有重复元素,即使有序顺序表中相同的元素只保留一个。
1.实验要求
⑴根据输入的n个非递减的有序数据建立一个有序顺序表,并输出有序顺序表中各元素值。
⑵删除有序顺序表中所有的重复元素,并显示删除后的有序顺序表中各元素值。
2.核心算法提示
要在有序顺序表中删除重复的元素,首先就要抓住有序顺序表的特性:
重复的元素总是在相邻的位置上,如:
12,15,15,15,35,56,56,78。
则删除重复元素后所得的有序表为:
12,15,35,56,78。
下面给出大致的操作步骤:
从第0个元素开始,依次将它与后面相邻的元素进行比较,如果相等则将前面那个相等的元素从顺序表中删除;
如果不相等,则继续往下比较,如此重复,直到最后一个元素为止。
3.核心算法描述
//删除有序顺序表L中的所有重复元素,即使得有序顺序表中相同的元素只保留一个
publicstaticvoidremove_repeat(SqListL){
inti=0;
while(i<
L.getCurLen()-1)
if(L.getListElem()[i].equals(L.getListElem()[i+1])){
//如果第i个及第i+1个相邻元素值相等
for(intj=i+1;
j<
L.getCurLen();
j++)
//将第i+1个元素及其之后的所有元素前移一个位地置
L.getListElem()[j-1]=L.getListElem()[j];
L.setCurLen(L.getCurLen()-1);
//有序顺序表的表长减1
i++;
}
八、应用性设计实验
编程实现一个简单学生成绩管理系统的设计。
实验要求
此系统的功能包括:
1查询:
按特定的条件查找学生
2修改:
按学号对某个学生的某门课程成绩进行修改
3插入:
增加新学生的信息
4删除:
按学号删除已退学的学生的信息。
学生成绩表的数据如下:
学号
姓名
性别
大学英语
高等数学
2008001
Alan
F
93
88
2008002
Danie
M
75
69
2008003
Helen
56
77
2008004
Bill
87
90
2008006
Peter
79
86
Amy
68
要求采用顺序存储结构来实现对上述成绩表的相关操作。
实验B02:
链表的操作实验
链表的操作
1.掌握线性表的链式存储结构的表示和实现方法。
2.掌握链表基本操作的算法实现。
1.建立单链表,并在单链表上实现插入、删除和查找操作(验证性内容)。
2.建立双向链表,并在双向链表上实现插入、删除和查找操作(设计性内容)。
3.计算已知一个单链表中数据域值为一个指定值x的结点个数(应用性设计内容)。
Netbeans6.5以上或Eclipse、MyEclipse等编程环境下。
前期要求熟练掌握了Java语言的编程规则、方法和单链表和双向链表的基本操作算法。
(1)根据输入的一系列整数,以0标志结束,用头插法建立单链表,并输出单链表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在单链表的第i个元素之前插入一个值为x的元素,并输出插入后的单链表中各元素值。
(3)删除单链表中第i个元素,并输出删除后的单链表中各元素值。
(4)在单链表中查找第i个元素,如果查找成功,则显示该元素的值,否则显示该元素不存在。
2.实验相关原理:
线性表的链式储结构是用一组任意的存储单元依次存放线性表中的元素,这组存储单元可以是连续的,也可以是不连续的。
为反映出各元素在线性表中的前后逻辑关系,对每个数据元素来说,除了存储其本身数据值之外,还需增加一个或多个指针域,每个指针域的值称为指针,又称作链,它用来指示它在线性表中的前驱或后继的存储地址。
这两个部分的的一起组成一个数据元素的存储映像,称为结点,若干个结点链接成链表。
如果一个结点中只含一个指针的链表,则称单链表。
单链表中结点类描述如下:
clas