数据结构实验指导书重要参考.docx
《数据结构实验指导书重要参考.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书重要参考.docx(36页珍藏版)》请在冰豆网上搜索。
![数据结构实验指导书重要参考.docx](https://file1.bdocx.com/fileroot1/2023-1/9/ccdfff77-e272-465e-927d-723baac8a501/ccdfff77-e272-465e-927d-723baac8a5011.gif)
数据结构实验指导书重要参考
前言
《数据结构》是计算机相关专业的一门核心基础课程,也是很多高校考研专业课之一。
它主要介绍线性结构、树型结构、图状结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法效率分析。
这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。
通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。
学习这门课程,习题和实验是两个关键环节。
学生理解算法,上机实验是最佳的途径之一。
因此,实验环节的好坏是学生能否学好《数据结构》的关键。
为了更好地配合学生实验,特编写试验指导书;同时,为每个主要的知识点配有精选的典型习题。
希望学生对习题要注意理解。
一、实验目的
更好的理解算法的思想、培养编程能力。
二、实验要求
1.每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。
2.在指导教师的帮助下能够完成实验内容,得出正确的实验结果。
3.实验结束后总结实验内容、书写实验报告。
4.遵守实验室规章制度、不缺席、按时上、下机。
5.实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。
6.实验报告有一次不合格,扣5分,两次以上不合格者,平时成绩以零分记。
三、实验环境
TurboC或VC++6.0
四、说明
1.本实验的所有算法中元素类型可以根据实际需要选择。
2.实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成70%,否则实验不合格)。
3.数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。
五、实验报告的书写要求
1.明确实验的目的及要求;
2.记录实验的输入数据和输出结果;
3.说明实验中出现的问题和解决过程;
4.写出实验的体会和实验过程中没能解决的问题;
六、成绩考评办法
1.期末考试占80分,闭卷。
2.平时考评占20分。
其中实验环节占15分(实验准备、上机、报告、考试等);平时占5分(出勤,作业,测验等)
七、参考书目
1.《数据结构》(C语言版)严蔚敏等清华大学出版社
2.《数据结构题集》(C语言版)严蔚敏等清华大学出版社
3.《DATASTRUCTUREWITHC++》WilliamFord,WilliamTopp清华大学出版社(影印版)
实验一线性表的顺序存储结构
实验学时2学时
背景知识:
顺序表的插入、删除及应用。
目的要求:
1.掌握顺序存储结构的特点。
2.掌握顺序存储结构的常见算法。
实验内容
1.输入一组整型元素序列,建立顺序表。
2.实现该顺序表的遍历。
3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。
4.判断该顺序表中元素是否对称,对称返回1,否则返回0。
5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
6.输入整型元素序列利用有序表插入算法建立一个有序表。
7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。
8.编写一个主函数,调试上述算法。
*9.综合训练:
利用顺序表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等)
实验说明
1.算法1至算法7可以以头文件的方式存储,主函数实现该头文件的包含即可调用
2.存储定义
#defineMAXSIZE100//表中元素的最大个数
typedefintElemType;//元素类型
typedefstructlist{
ElemTypeelem[MAXSIZE];//静态线性表
intlength;//表的实际长度
}SqList;//顺序表的类型名
3.建立顺序表时可利用随机函数自动产生数据。
注意问题
1.插入、删除时元素的移动原因、方向及先后顺序。
2.解不同的函数形参与实参的传递关系。
实验二链式存储结构
(一)----单向链表的有关操作
实验学时2学时
背景知识:
单向链表的插入、删除及应用。
目的要求
1.掌握单向链表的存储特点及其实现。
2.掌握单向链表的插入、删除算法及其应用算法的程序实现。
实验内容
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
*9.采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。
10.在主函数中设计一个简单的菜单,分别调试上述算法。
*11.综合训练:
利用链表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等,并能够实现将数据存储到文件中)
实验说明
1.类型定义
#include
typedefintElemType;//元素类型
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
2.为了算法实现简单,最好采用带头结点的单向链表。
注意问题
1.重点理解链式存储的特点及指针的含义。
2.注意比较顺序存储与链式存储的各自特点。
3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
__4.单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。
实验三链式存储结构
(二)----双向链表的有关操作
实验学时2学时
背景知识:
双向链表的插入、删除及应用。
目的要求
1.掌握双向链表的存储特点及其实现。
2.掌握双向链表的插入、删除算法及其应用算法的程序实现。
实验内容
1.利用尾插法建立一个双向链表。
2.遍历双向链表。
3.实现双向链表中删除一个指定元素。
4.在非递减有序双向链表中实现插入元素e仍有序算法。
5.判断双向链表中元素是否对称若对称返回1否则返回0。
6.设元素为正整型,实现算法把所有奇数排列在偶数之前。
7.在主函数中设计一个简单的菜单调试上述算法。
双向链表的类型定义
typedefintElemType;//元素类型
typedefstructDuLNode
{ElemTypedata;
structDuLNode*prior,*next;
}DuLNode,*DuLinkList;
注意问题
注意比较单向、双向链表的特点。
_
实验四栈.队列
实验学时2学时
背景知识:
入栈、出栈,入队、出队。
目的要求
1.掌握栈、队列的思想及其存储实现。
2.掌握栈、队列的常见算法的程序实现。
实验内容
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
*6.综合训练:
1)利用栈实现表达式求值算法。
2)利用栈实现迷宫求解。
实验说明
1.基本要求:
实现算法1、3或算法2、4即可。
2.类型定义
顺序栈示例
#defineMAX100//栈的最大值
typedef struct
{ElemType*base;
inttop;
}SqStack;
顺序队列示例
#defineMAX100//队列的最大长度
typedef struct
{ElemType*base;
intfront,rear;
}SqQueue;
3.算法6的每个子功能尽可能写成函数形式。
注意问题
1.重点理解栈、队列的算法思想,能够根据实际情况选择合适的存储结构。
2.注意算法6的各个函数之间值的传递情况。
_3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。
实验五二叉树的常见操作
实验学时2学时
背景知识:
二叉树的存储、建立、遍历及其应用。
目的要求
1.掌握二叉树的存储实现。
2.掌握二叉树的遍历思想。
3.掌握二叉树的常见算法的程序实现。
实验内容
1.输入字符序列,建立二叉链表。
2.中序遍历二叉树:
递归算法。
3.中序遍历二叉树:
非递归算法。
(最好也能实现先序,后序非递归算法)
4.求二叉树的高度。
5.求二叉树的叶子个数。
*6.将二叉链表视为森林的孩子兄弟链表,计算森林中叶子个数。
*7.建立中序线索二叉树,并实现中序遍历。
8.借助队列实现二叉树的层次遍历。
9.在主函数中设计一个简单的菜单,分别调试上述算法。
*10.综合训练:
为N个权值设计哈夫曼编码。
实验说明
1.类型定义//二叉链表存储
#defineElemTypechar//元素类型
typedefstructBiTNode
{ElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
2.元素类型可以根据实际情况选取。
注意问题
1.注意理解递归算法的执行步骤。
2.注意字符类型数据在输入时的处理。
3.重点理解如何利用栈结构实现非递归算法。
实验六图的有关操作
实验学时2学时
背景知识:
图的存储、遍历、及其应用。
目的要求
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3.掌握图的常见应用算法的思想及其程序实现。
实验内容
1.键盘输入数据,建立一个有向图的邻接表。
2.输出该邻接表。
*3.建立一个无向图的十字链表。
4.在有向图的邻接表的基础上计算各顶点的度,并输出。
5.以有向图的邻接表为基础实现输出它的拓扑排序序列。
*6.采用邻接矩阵存储一个有向图,输出单源点到其它顶点的最短路径。
7.采用邻接表存储实现无向图的深度优先非递归遍历。
8.采用邻接表存储实现无向图的广度优先遍历。
*9.采用邻接矩阵存储实现无向图的最小生成树的PRIM算法。
*10.判断无向图任意两个顶点间是否有路径,若有输出路径上的顶点序列。
11.在主函数中设计一个简单的菜单,分别调试上述算法。
*12.综合训练:
为计算机专业设计教学计划:
4个学年,每学年2个学期,开设50门课程,每学期所开课程门数尽量均衡,课程的安排必须满足先修关系。
实验说明1.类型定义(邻接表存储)#defineMAX_VERTEX_NUM8//顶点最大个数typedefstructArcNode
{intadjvex;
structArcNode*nextarc;
intweight;//边的权
}ArcNode;//表结点#defineVertexTypeint//顶点元素类型
typedefstructVNode
{intdegree,indegree;//顶点的度,入度VertexTypedata;
ArcNode*firstarc;
}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];typedefstruct{AdjListvertices;
intvexnum,arcnum;//顶点的实际数,边的实际数}ALGraph;
2.上述类型定义可以根据实际情况适当调整。
3.算法7、8分别利用栈、队列实现非递归算法。
注意问题
1.注意理解各算法实现时所采用的存储结构。
2.注意区别正、逆邻接。
实验七查找的有关操作
实验学时2学时
背景知识:
顺序查找、树表查找、散列查找。
目的要求:
1.掌握折半查找算法的思想及程序实现。
2.掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现。
3.掌握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散列表的查找、建立。
实验内容
1.利用实验一建立有序表,采用折半查找实现某一已知的关键字的查找。
2.随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后删除某一指定关键字元素。
*3.建立AVL树并实现删除某一指定关键字元素。
4.已知散列函数为H(key)=key%p(p为自定的常数),冲突处理方法分别为线性探测法、外拉链法实现散列表的建立(利用插入算法实现)。
实验说明
1.存储定义(散列表的外拉链法)
#definen9
typedefstructnode
{intkey;
structnode*next;
}NODE;
NODE*HashTable[9];
算法1、2、3可以参考顺序表,二叉链表的存储实现。
2.各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。
3.算法1存储在文件seqlist.h中,算法2、3存储在文件bintree.h中,算法4存储在文件hash.h中
注意问题1.注意理解折半查找的适用条件(链表能否实现折半查找?
)。
2.注意建立二叉排序树、散列表时相同元素的处理。
3.注意理解静态查找、动态查找概念。
4.比较各种查找算法的各自特点,能够根据实际情况选择合适的查找方法。
实验八排序
实验学时2学时
背景知识:
各种排序方法
目的要求
1.掌握常见的排序算法的思想及其适用条件。
2.掌握常见的排序算法的程序实现。
实验内容
输入一组关键字序列分别实现下列排序:
1.实现简单选择排序、直接插入排序和冒泡排序。
2.实现希尔排序算法。
3.实现快速排序算法。
4.实现堆排序算法。
*5.快速排序的非递归算法。
*6.实现折半插入排序。
*7.采用链式存储实现简单选择排序、直接插入排序和冒泡排序。
8.在主函数中设计一个简单的菜单,分别测试上述算法。
*9.综合训练:
采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。
实验说明
1.类型定义
#defineMAXSIZE100/*参加排序元素的最大个数*/
typedefstructlist
{intkey;
}RedType;
typedefstruct{
RedTyper[MAXSIZE+1];
intlength;/*参加排序元素的实际个数*/
}SqList;
2.算法5可以借助栈实现。
注意问题
1.在RedType中增加一个数据项验证各种排序算法的稳定性。
2.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。
//部分算法程序示例
//实验一线性表的顺序存储结构
#include"stdio.h"
#include"stdlib.h"
#defineStatusint
#defineOVERFLOW0
#defineTRUE1
#defineFALSE0
#defineOK1
#defineMAXSIZE100
typedefintElemType;
typedefstructlist
{ElemTypeelem[MAXSIZE];
intlength;
}SqList;
voidInitList(SqList&L){
L.length=0;
}
/*建立顺序表*/
voidCreateList(SqList&L)
{
inti;
printf("inputthelength");
scanf("%d",&L.length);//输入表长
for(i=1;i<=L.length;i++)
scanf("%d",&L.elem[i-1]);//输入元素
}
//顺序表的遍历
voidprintdata(ElemTypee){
printf("%4d",e);
}
voidTraverse(SqListL,void(*visit)(ElemTypee))
{inti;
printf("Theelementsofthelistsare:
\n");
for(i=1;i<=L.length;i++){
if(i%10==0)printf("\n");//每行显示10个元素
visit(L.elem[i-1]);//输出表中元素
}
printf("\n");
}
//有序顺序表L中插入元素e使序列仍有序
voidInsert(SqList&L,ElemTypee)
{inti,j;
if(L.length==MAXSIZE)exit(OVERFLOW);//表满,不能插入
for(i=1;i<=L.length&&L.elem[i-1]<=e;i++);//向后查找
for(j=L.length;j>=i;j--)
L.elem[j]=L.elem[j-1];//元素后移
L.elem[i-1]=e;//插入e
L.length=L.length+1;//表长加1
}
//建立递增有序的顺序表
voidCreateList_Sorted(SqList&L)
{inti,num;
ElemTypee;
L.length=0;
printf("Createasortedlist,Inputthelengthofthelist\n");
scanf("%d",&num);
printf("Inputthedata%dnumbers\n",num);
for(i=1;i<=num;i++){
scanf("%d",&e);
Insert(L,e);
}
}
/*Mergetwosortedlists*/
voidMergeList(SqListLa,SqListLb,SqList&Lc)
{int*pa,*pb,*pc;
if(La.length+Lb.length>MAXSIZE)exit(OVERFLOW);
else
{pa=La.elem;pb=Lb.elem;pc=Lc.elem;
while(pa*pc++=(*pa<=*pb)?
*pa++:
*pb++;/*公共部分合并*/
while(pa/*R1表的剩余部分放到R的后部*/
while(pb/*R2表的剩余部分放到R的后部*/
Lc.length=La.length+Lb.length;/*R表长*/
}
}
//判断元素是否对称,对称返回TRUE否则返回FALSE
StatusSymmetric(SqListL)
{intlow,high;
low=0;
high=L.length-1;
while(lowif(L.elem[low]==L.elem[high]){low++;high--;}
elsereturn(FALSE);return(TRUE);}
//顺序表的主函数部分
//#include"seqlist.h"
voidmain()
{SqListL1,L2,L;
intselect;
ElemTypee;
do{printf("\n1insert2merge");
printf("\n3symmetric0exit\n");
printf("Pleaseselect(0--3)\n");
scanf("%d",&select);
switch(select){
case1:
InitList(L);
CreateList_Sorted(L);
Traverse(L,printdata);
printf("\nInputtheelementofinserted\n");
scanf("%d",&e);
Insert(L,e);
Traverse(L,printdata);
break;
case2:
InitList(L1);
CreateList_Sorted(L1);
Traverse(L1,printdata);
InitList(L2);
CreateList_Sorted(L2);
Traverse(L2,printdata);
InitList(L);
MergeList(L1,L2,L);
Traverse(L,printdata);
break;
case3:
InitList(L);
CreateList(L);
Traverse(L,printdata);
if(Symmetric(L))printf("Yes!
\n");elseprintf("Not\n");
break;
case0:
break;
default:
printf("Error!
Tryagain!
\n");
}
}while(select);
}
/*实验二链式存储结构
(一)----单向链表的有关操作
/*类型定义及头文件部分,文件名为sllink.h*/
#include
#include
typedefintElemType;//元素实际类型
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;//定义结点、指针类型名
//头插法建立无序链表
voidCreateList(LinkList&L){
LinkListp;
ElemTypee;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("头插法建立链表,以0结束\n");
scanf("%d",&e);
while(e){
p=(LinkList)malloc(sizeof