《数据结构实验指导书》08年.docx
《《数据结构实验指导书》08年.docx》由会员分享,可在线阅读,更多相关《《数据结构实验指导书》08年.docx(40页珍藏版)》请在冰豆网上搜索。
![《数据结构实验指导书》08年.docx](https://file1.bdocx.com/fileroot1/2023-2/3/c21b598e-2ec0-44e6-ad83-653059de922b/c21b598e-2ec0-44e6-ad83-653059de922b1.gif)
《数据结构实验指导书》08年
《数据结构》实验教学大纲
课程编号:
17012030课程类别:
专业基础课适用专业:
计算机科学与技术实验学时:
12
一、本门课程实验的性质、任务与目的
《数据结构》课程是计算机科学与技术专业的一门重要的专业基础课。
通过此实验教学和学生的上机实践,要求学生掌握各种数据结构的具体物理实现方法,掌握用数据结构知识解决实际问题的方法,以达到理论指导实践的目的。
从而进一步提高学生的编程能力、算法设计能力及分析问题、解决问题的能力。
二、实验项目
序号
实验名称
学时
实验性质
开出要求
1
线性表
2
设计性
必做
2
栈与队列
2
设计性
必做
3
二叉树
2
设计性
必做
4
图
2
设计性
必做
5
查找
2
设计性
必做
6
排序
2
设计性
必做
三、实验概述
实验一:
线性表
目的:
掌握线性表的表示及其基本操作的实现方法与算法。
原理概述:
顺序表及链表的实现方法
方法与手段:
利用顺序序表及各种链表的实现方法,学生自行设计并编写程序实现线性表的存储表示及其主要的基本操作,并上机调试、运行及进行验证。
还可以进一步设计并编程实现集合的表示及并、交等操作,一元多项式的表示及其相加等操作。
应得到的实验结果和数据:
能够编程实现线性表的一种或多种表示,通过输出相应操作结果(如各种操作后线性表中的元素)验证设计算法的正确性。
实验二:
栈与队列
目的:
掌握栈与队列的表示及其基本操作的实现方法与算法。
原理概述:
栈的特性及其实现方法;队列的特性及链队列、循环队列的实现方法。
方法与手段:
利用栈与队列的实现方法,学生自行设计并编写程序实现栈与队列存储表示及其主要的基本操作,并上机调试、运行及进行验证。
还可以进一步设计并编程实现进制转换问题、括号匹配问题。
应得到的实验结果和数据:
能够编程实现栈与队列的一种或多种表示,通过输出相应操作结果(如各种操作后栈或队列中的元素)验证设计算法的正确性。
实验三:
二叉树
目的:
掌握二叉树的表示及其创建、遍历、求深度等基本操作的实现方法与算法。
原理概述:
二叉树的二叉链表表示方法与二叉树的创建、遍历等算法的实现方法。
方法与手段:
利用二叉树的二叉链表存储实现方法,学生自行设计并编写程序实现二叉树的表示及其创建、遍历等主要操作,并上机调试、运行及进行验证。
亦可进一步完成哈夫曼树及哈夫曼编码算法。
应得到的实验结果和数据:
能够编程实现二叉树的二叉链表表示,通过输出相应操作结果(如二叉树的各种遍历序列、二叉树的深度等)验证设计算法的正确性。
实验四:
图
目的:
掌握图的存储表示(邻接矩阵或邻接表)及相关操作的实现方法。
原理概述:
图的邻接矩阵表示法、邻接表表示法;图的创建、遍历等基本操作算法;以及最小生成树、拓扑排序等算法。
方法与手段:
利用图的一种存储实现方法,学生自行设计并编写程序实现图的表示及其创建、遍历等等主要操作,并上机调试、运行及进行验证。
还可以进一步设计并编程实现图的最小生成树、拓扑排序等。
应得到的实验结果和数据:
能够编程实现图的一种存储表示,通过输出相应操作结果(如存储结构图、图的遍历序列等)验证设计算法的正确性。
实验五:
查找
目的:
通过上机,掌握顺序查找、折半查找及二叉排序树等的相关查找算法。
原理概述:
顺序查找算法;折半查找(二分法查找)算法;二叉排序树及其创建、查找等算法。
方法与手段:
学生自行设计并编写程序实现顺序表上的顺序查找与折半查找算法,以及二叉排序树及其创建、查找等主要操作,并上机调试、运行及进行验证。
应得到的实验结果和数据:
(1)能够编程实现顺序表上顺序查找、折半查找算法的一种存储表示,通过输出相应操作结果(如查找表中的元素、查找结果等)验证设计算法的正确性。
(2)能够编程完成二叉树排序树的创建、查找、中序遍历等操作,通过输出其中序(根)序列验证设计算法的正确性。
实验六:
排序
目的:
通过上机,掌握相关排序算法的设计思想及实现方法。
原理概述:
直接插入排序、希尔(Shell)排序、快速排序、堆排序及二路归并排序等排序算法的设计思想及方法。
方法与手段:
利用相关的排序方法,学生自行设计并编写程序实现顺序表上排序,并上机调试、运行及进行验证。
应得到的实验结果和数据:
能够编程实现排序表的创建、排序等操作,并通过输出排序前及排序后排序表中元素的值,以验证设计的排序算法的正确性。
四、主要仪器设备配置
硬件环境:
微机(每生一台)
软件环境:
VC++(或TC3.0)
五、教学形式
应用多媒体讲授实验内容、要求及注意事项,上机辅导,最后进行实验总结,学生给出每次实验的实验报告。
六、考核方式及成绩评定办法
每次完成实验内容,进行总结分析,写出实验报告。
按照学生每次的实验态度、实验内容完成情况及实验报告书写情况等方面进行考核,实验总成绩占期末成绩的20%。
具体分配如下:
(1)平时成绩(包括学生的实验态度、实验完成情况等):
占实验总成绩的50%;
(2)实验报告:
占实验总绩的50%。
数据结构上机实验编程指南
为了更好地帮助同学们做好数据结构实验,在此给出数据结构上机编程的一般思路和程序的基本框架结构。
具体程序结构按先后顺序可分为以下3个部分:
1.预定义常量及类型
对于相关的常量与类型(如状态类型)进行定义,如:
#defineOK1
#defineERROR0
#defineOVERFLOW–2
#defineTRUE1
#defineFALSE0
typedefintStatus;
2.相关数据结构类型定义
此部分包括对所使用的数据结构给出其类型定义及其基本操作函数定义。
(具体内容可参见实验一)
3.主调程序的定义
此部分给出相关的主调程序,在此程序中定义相关数据结构变量,并通过调用其操作函数,实现设计目的。
(具体内容可参见实验一)
实验一线性表
一、实验目的
1.掌握顺序表及其基本操作的实现;
2.掌握链表及其基本操作的实现;
3.掌握利用C编程语言实现数据结构的编程方法;
4.通过上机实践进一步加深对线性表的顺序存储方式及链式存储方式的理解;
5.通过上机实践加强利用数据结构解决实际应用应用问题的能力。
二、实验要求
1.实验前做好充分准备,包括复习第一章、第二章所学内容,事先预习好本次实验内容;
2.实验时记录实验结果,按要求完成各题;
3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。
三、实验题目与要求
1.实验题目一:
顺序表的定义及其相关操作算法的实现
要求:
编程实现顺序表的类型定义及顺序表的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。
2.实验题目二:
链表的定义及其相关操作算法的实现
要求:
编程实现单链表(或双向链表、循环链表)的类型定义及其初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。
3.实验题目三:
集合的表示与运算
要求:
利用题目一或题目二所定义的线性表(顺序表或链表)实现集合的表示及其并、交等运算,并进行验证给出结果。
4.实验题目四:
一元多项式的表示与运算
要求:
利用线性表(顺序表或链表)实现一元多项的类型定义及其相加等等运算,并进行验证给出结果。
说明:
(1)实验题目一与实验题目二为必做内容;
(2)实验题目三与实验题目四为选做内容。
四、实验程序示例
本指导书所给出的示例程序均为VC环境下完成的,若使用其它C开发环境,则部分语句要进行少许修改。
例如,对于如下的文件包含命令:
#include“malloc.h”
则在TC3.0环境中需改为:
#include“alloc.h”
示例1:
顺序表的实现
#include"stdio.h"
#include"malloc.h"
//-------------
(1)预定义常量及类型-----------------
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
typedefintStatus;
//-------
(2)顺序表类型及其基本操作函数的定义---------
#defineInitSize100
#defineINCR20
typedefintLElemType;//定义元素类型(LElemType)为int类型
typedefstruct
{LElemType*Elem;
intLength;
intListSize;
}SqList;//SqList类型为顺序表类型
StatusInitList_sq(SqList&L)//初始化操作函数定义
{L.Elem=(LElemType*)malloc(InitSize*sizeof(LElemType));
if(!
(L.Elem))return(OVERFLOW);
L.Length=0;L.ListSize=InitSize;
returnOK;
}
StatusListInsert_sq(SqList&L,inti,LElemTypee)//插入操作函数定义
{intj;
if(i<1||i>L.Length+1)returnERROR;
if(L.Length>=L.ListSize)
{L.Elem=(LElemType*)malloc((L.ListSize+INCR)*sizeof(LElemType));
if(!
(L.Elem))return(OVERFLOW);
L.ListSize+=INCR;
}
for(j=L.Length-1;j>=i-1;j--)
L.Elem[j+1]=L.Elem[j];
L.Elem[i-1]=e;
L.Length++;
returnOK;
}
voidListOutput_sq(SqListL)//顺序表输出操作
{inti;
for(i=0;i<=L.Length-1;i++)
printf("%6d",L.Elem[i]);
printf("\n");
}
//其它操作如删除、查找、判空等操作略
//-------------(3)主函数定义--------------------
voidmain()
{SqListLa;
inti;
InitList_sq(La);
for(i=0;i<5;i++)ListInsert_sq(La,i+1,2*i);
ListOutput_sq(La);
ListInsert_sq(La,1,999);ListOutput_sq(La);
ListInsert_sq(La,4,888);ListOutput_sq(La);
ListInsert_sq(La,La.Length+1,111);ListOutput_sq(La);
}
说明:
对于顺序表的其它操作函数,本示例程序未给出,学生上机实验时可以自行给出定义,并在主程序中加以验证。
本指导书中后面的示例程序也有这种情况,将不在说明。
示例2:
单链表(带头结头)实现
#include"stdio.h"
#include"malloc.h"
//------------------
(1)预定义常量及类型---------------
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
typedefintStatus;
//------------
(2)单链表类型及其基本操作函数的定义------
typedefintLElemType;//定义元素类型(LElemType)为int类型
typedefstructLnode
{LElemTypedata;
structLnode*next;
}*LinkList;//LinkList为单链表类型
StatusInitList_l(LinkList&L)//初始化操作函数定义
{L=(LinkList)malloc(sizeof(structLnode));
if(!
L)return(OVERFLOW);
L->next=NULL;
returnOK;
}
StatusListInsert_l(LinkList&L,inti,LElemTypee)//插入操作函数定义
{LinkListp,s;
intj;
p=L;j=0;
while(p&&jnext;j++;}
if(!
p||j>i-1)returnERROR;
s=(LinkList)malloc(sizeof(structLnode));
s->data=e;
s->next=p->next;
p->next=s;
returnOK;
}
voidListOutput_l(LinkListL)//输出操作函数定义
{LinkListp;
p=L->next;
while(p)
{printf("%6d",p->data);p=p->next;}
printf("\n");
}
//其它操作如删除、查找、判空等操作略
//-------------(3)主函数定义------------------
voidmain()
{inti;
LinkListLa;
InitList_l(La);
for(i=0;i<5;i++)ListInsert_l(La,i+1,3*i);
ListOutput_l(La);
ListInsert_l(La,1,999);ListOutput_l(La);
ListInsert_l(La,4,888);ListOutput_l(La);
}
示例3:
一元多项式的单链表表示与相加操作的实现
#include"stdio.h"
#include"malloc.h"
typedefstructPNode
{intcoef;
intexpn;
structPNode*next;
}*POLY;//POLY为一元多项式的类型
voidCreatPoly(POLY&L,intn)//一元多项式的创建操作,其中n为一元多项式的项数
{inti,coef,expn;
POLYp,s;
L=(POLY)malloc(sizeof(structPNode));
L->next=NULL;
p=L;
for(i=1;i<=n;i++)
{printf("input%dthcoef:
",i);
scanf("%d",&coef);
printf("input%dthexpn:
",i);
scanf("%d",&expn);
s=(POLY)malloc(sizeof(structPNode));
s->coef=coef;s->expn=expn;
s->next=NULL;p->next=s;p=s;
}
}
voidOutputPoly(POLYL)//一元多项式的输出操作
{intflag=1;//flag用来是否为第一项的标识
POLYp;
p=L->next;
while(p)
{if(flag){printf("%dX^%d",p->coef,p->expn);flag=0;}
elseprintf("%+dX^%d",p->coef,p->expn);
p=p->next;
}
printf("\n");
}
voidAddPoly(POLYLa,POLYLb,POLY&Lc)//一元多项式的相加操作,即实现Lc=La+Lb
{intx;
POLYpa,pb,pc,s;
Lc=(POLY)malloc(sizeof(structPNode));
Lc->next=NULL;pc=Lc;
pa=La->next;pb=Lb->next;
while(pa&&pb)
{if(pa->expnexpn)
{s=(POLY)malloc(sizeof(structPNode));
s->coef=pa->coef;s->expn=pa->expn;
s->next=NULL;pc->next=s;pc=s;
pa=pa->next;
}
elseif(pa->expn>pb->expn)
{s=(POLY)malloc(sizeof(structPNode));
s->coef=pb->coef;s->expn=pb->expn;
s->next=NULL;pc->next=s;pc=s;
pb=pb->next;
}
else
{x=pa->coef+pb->coef;
if(x!
=0)
{s=(POLY)malloc(sizeof(structPNode));
s->coef=x;s->expn=pa->expn;
s->next=NULL;pc->next=s;pc=s;
}
pa=pa->next;pb=pb->next;
}
}
while(pa)
{s=(POLY)malloc(sizeof(structPNode));
s->coef=pa->coef;s->expn=pa->expn;
s->next=NULL;pc->next=s;pc=s;
pa=pa->next;
}
while(pb)
{s=(POLY)malloc(sizeof(structPNode));
s->coef=pb->coef;s->expn=pb->expn;
s->next=NULL;pc->next=s;pc=s;
pb=pb->next;
}
}
voidmain()
{POLYLa,Lb,Lc;
intn;
printf("CreatPolyLa:
\n");
printf("\tInputthenumberofitemsofLa:
");
scanf("%d",&n);
CreatPoly(La,n);
printf("\nLa(x)=");
OutputPoly(La);
printf("CreatPolyLb:
\n");
printf("\tInputthenumberofitemsofLb:
");
scanf("%d",&n);
CreatPoly(Lb,n);
printf("\nLb(x)=");
OutputPoly(Lb);
AddPoly(La,Lb,Lc);
printf("Lc(x)=La(x)+Lb(x)=");
OutputPoly(Lc);
}
实验二栈与队列
一、实验目的
1.掌握栈的存储实现方式及其基本操作的实现;
2.掌握队列的存储实现方式及其基本操作的实现;
3.进一步掌握利用TC实现数据结构的编程方法。
二、实验要求
1.实验前做好充分准备,包括复习第三章所学内容,事先预习好本次实验内容;
2.实验时记录实验结果,按要求完成各题;
3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。
三、实验题目与要求
1.实验题目一:
顺序栈的定义及其操作算法的实现
要求:
编程实现顺序栈表的类型定义及顺序表的初始化操作、入栈操作、出栈操作、取栈顶元素操作、输出操作等,并对其进行验证。
2.实验题目二:
链式队列的定义及其相关操作算法的实现
要求:
编程实现链式队列的类型定义及其初始化操作、入队操作、出队操作、取队头操作、输出操作等,并对其进行验证。
3.实验题目三:
循环队列定义及其操作算法的实现
要求:
编程实现循环队列的类型定义及其初始化操作、入队操作、出队操作、取队头操作、输出操作等,并对其进行验证。
4.实验题目四:
利用栈实现进制转换
要求:
利用栈(顺序栈或链式栈)实现进制转换问题
说明:
(1)实验题目一与实验题目三为必做内容。
(2)实验题目二与实验题目四为选做内容。
四、实验程序示例
示例1:
顺序栈的定义及其操作算法的实现
#include"stdio.h"
#include"malloc.h"
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
typedefintStatus;
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT20
typedefintSElemType;//定义栈内元素类型(SElemType)为int类型
typedefstruct
{SElemType*base;
SElemType*top;
intstackSize;
}SqStack;
StatusInitStack(SqStack&S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
exit(overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusPush(SqStack&S,SElemTypee)
{
if(S.top-S.base=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{
//代码略
}
StatusGetTop(SqStackS,SElemType&e)
{
//代码略
}
voidStackOutput(SqStackS)
{inti;
for(i=0;iprintf("%