1、数据结构实验指导书08年数据结构实验教学大纲课程编号:17012030 课程类别:专业基础课 适用专业:计算机科学与技术 实验学时:12一、本门课程实验的性质、任务与目的数据结构课程是计算机科学与技术专业的一门重要的专业基础课。通过此实验教学和学生的上机实践,要求学生掌握各种数据结构的具体物理实现方法,掌握用数据结构知识解决实际问题的方法,以达到理论指导实践的目的。从而进一步提高学生的编程能力、算法设计能力及分析问题、解决问题的能力。二、实验项目序号实验名称学时实验性质开出要求1线性表2设计性必做2栈与队列2设计性必做3二叉树2设计性必做4图2设计性必做5查找2设计性必做6排序2设计性必做三、
2、实验概述实验一:线性表目的:掌握线性表的表示及其基本操作的实现方法与算法。原理概述:顺序表及链表的实现方法方法与手段:利用顺序序表及各种链表的实现方法,学生自行设计并编写程序实现线性表的存储表示及其主要的基本操作,并上机调试、运行及进行验证。还可以进一步设计并编程实现集合的表示及并、交等操作,一元多项式的表示及其相加等操作。应得到的实验结果和数据:能够编程实现线性表的一种或多种表示,通过输出相应操作结果(如各种操作后线性表中的元素)验证设计算法的正确性。实验二:栈与队列 目的:掌握栈与队列的表示及其基本操作的实现方法与算法。原理概述:栈的特性及其实现方法;队列的特性及链队列、循环队列的实现方法
3、。方法与手段:利用栈与队列的实现方法,学生自行设计并编写程序实现栈与队列存储表示及其主要的基本操作,并上机调试、运行及进行验证。还可以进一步设计并编程实现进制转换问题、括号匹配问题。应得到的实验结果和数据:能够编程实现栈与队列的一种或多种表示,通过输出相应操作结果(如各种操作后栈或队列中的元素)验证设计算法的正确性。实验三:二叉树目的:掌握二叉树的表示及其创建、遍历、求深度等基本操作的实现方法与算法。原理概述:二叉树的二叉链表表示方法与二叉树的创建、遍历等算法的实现方法。方法与手段:利用二叉树的二叉链表存储实现方法,学生自行设计并编写程序实现二叉树的表示及其创建、遍历等主要操作,并上机调试、运
4、行及进行验证。亦可进一步完成哈夫曼树及哈夫曼编码算法。应得到的实验结果和数据:能够编程实现二叉树的二叉链表表示,通过输出相应操作结果(如二叉树的各种遍历序列、二叉树的深度等)验证设计算法的正确性。实验四:图目的:掌握图的存储表示(邻接矩阵或邻接表)及相关操作的实现方法。原理概述:图的邻接矩阵表示法、邻接表表示法;图的创建、遍历等基本操作算法;以及最小生成树、拓扑排序等算法。方法与手段:利用图的一种存储实现方法,学生自行设计并编写程序实现图的表示及其创建、遍历等等主要操作,并上机调试、运行及进行验证。还可以进一步设计并编程实现图的最小生成树、拓扑排序等。应得到的实验结果和数据:能够编程实现图的一
5、种存储表示,通过输出相应操作结果(如存储结构图、图的遍历序列等)验证设计算法的正确性。实验五:查找目的:通过上机,掌握顺序查找、折半查找及二叉排序树等的相关查找算法。原理概述:顺序查找算法;折半查找(二分法查找)算法;二叉排序树及其创建、查找等算法。方法与手段:学生自行设计并编写程序实现顺序表上的顺序查找与折半查找算法,以及二叉排序树及其创建、查找等主要操作,并上机调试、运行及进行验证。应得到的实验结果和数据:(1)能够编程实现顺序表上顺序查找、折半查找算法的一种存储表示,通过输出相应操作结果(如查找表中的元素、查找结果等)验证设计算法的正确性。(2)能够编程完成二叉树排序树的创建、查找、中序
6、遍历等操作,通过输出其中序(根)序列验证设计算法的正确性。实验六:排序目的:通过上机,掌握相关排序算法的设计思想及实现方法。原理概述:直接插入排序、希尔(Shell)排序、快速排序、堆排序及二路归并排序等排序算法的设计思想及方法。方法与手段:利用相关的排序方法,学生自行设计并编写程序实现顺序表上排序,并上机调试、运行及进行验证。应得到的实验结果和数据:能够编程实现排序表的创建、排序等操作,并通过输出排序前及排序后排序表中元素的值,以验证设计的排序算法的正确性。四、主要仪器设备配置硬件环境:微机(每生一台)软件环境:VC+(或TC3.0)五、教学形式应用多媒体讲授实验内容、要求及注意事项,上机辅
7、导,最后进行实验总结,学生给出每次实验的实验报告。六、考核方式及成绩评定办法每次完成实验内容,进行总结分析,写出实验报告。按照学生每次的实验态度、实验内容完成情况及实验报告书写情况等方面进行考核,实验总成绩占期末成绩的20%。具体分配如下:(1)平时成绩(包括学生的实验态度、实验完成情况等):占实验总成绩的50%;(2)实验报告:占实验总绩的50%。数据结构上机实验编程指南为了更好地帮助同学们做好数据结构实验,在此给出数据结构上机编程的一般思路和程序的基本框架结构。具体程序结构按先后顺序可分为以下3个部分:1预定义常量及类型对于相关的常量与类型(如状态类型)进行定义,如:#define OK
8、1#define ERROR 0#define OVERFLOW 2#define TRUE 1#define FALSE 0typedef int Status;2相关数据结构类型定义此部分包括对所使用的数据结构给出其类型定义及其基本操作函数定义。(具体内容可参见实验一)3主调程序的定义此部分给出相关的主调程序,在此程序中定义相关数据结构变量,并通过调用其操作函数,实现设计目的。(具体内容可参见实验一)实验一 线性表一、实验目的1掌握顺序表及其基本操作的实现;2掌握链表及其基本操作的实现;3掌握利用C编程语言实现数据结构的编程方法;4通过上机实践进一步加深对线性表的顺序存储方式及链式存储方式
9、的理解;5通过上机实践加强利用数据结构解决实际应用应用问题的能力。二、实验要求1实验前做好充分准备,包括复习第一章、第二章所学内容,事先预习好本次实验内容;2实验时记录实验结果,按要求完成各题;3实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。三、实验题目与要求1实验题目一:顺序表的定义及其相关操作算法的实现要求:编程实现顺序表的类型定义及顺序表的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。2实验题目二:链表的定义及其相关操作算法的实现要求:编程实现单链表(或双向链表、循环链表)的类型定义及其初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其
10、进行验证。3实验题目三:集合的表示与运算要求:利用题目一或题目二所定义的线性表(顺序表或链表)实现集合的表示及其并、交等运算,并进行验证给出结果。4实验题目四:一元多项式的表示与运算要求:利用线性表(顺序表或链表)实现一元多项的类型定义及其相加等等运算,并进行验证给出结果。说明:(1)实验题目一与实验题目二为必做内容;(2)实验题目三与实验题目四为选做内容。四、实验程序示例本指导书所给出的示例程序均为VC环境下完成的,若使用其它C开发环境,则部分语句要进行少许修改。例如,对于如下的文件包含命令:#include “malloc.h”则在TC3.0环境中需改为:#include “alloc.h
11、”示例1:顺序表的实现#include stdio.h#include malloc.h /-(1)预定义常量及类型-#define OK 1#define ERROR 0#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status; /-(2)顺序表类型及其基本操作函数的定义-#define InitSize 100#define INCR 20typedef int LElemType; /定义元素类型(LElemType)为int类型typedef struct LElemType *Elem;int Length;
12、int ListSize;SqList; /SqList类型为顺序表类型Status InitList_sq(SqList &L) /初始化操作函数定义 L.Elem=(LElemType *)malloc(InitSize*sizeof(LElemType); if (!(L.Elem)return(OVERFLOW); L.Length=0; L.ListSize=InitSize; return OK; Status ListInsert_sq(SqList &L, int i, LElemType e) /插入操作函数定义 int j; if (iL.Length+1) return
13、ERROR; 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.Elemj+1=L.Elemj; L.Elemi-1=e; L.Length+; return OK; void ListOutput_sq(SqList L) /顺序表输出操作 int i; for(i=0;i=L.Length-1;i+) printf
14、(%6d,L.Elemi); printf(n);/其它操作如删除、查找、判空等操作略/-(3)主函数定义-void main() SqList La; int i; InitList_sq(La); for (i=0;inext=NULL; return OK; Status ListInsert_l(LinkList &L,int i, LElemType e) /插入操作函数定义 LinkList p,s; int j; p=L;j=0; while(p&jnext;j+; if (!p|ji-1) return ERROR; s=(LinkList)malloc(sizeof(stru
15、ct Lnode); s-data=e; s-next=p-next; p-next=s; return OK; void ListOutput_l(LinkList L) /输出操作函数定义 LinkList p; p=L-next; while(p) printf(%6d,p-data); p=p-next; printf(n); /其它操作如删除、查找、判空等操作略/-(3)主函数定义-void main() int i; LinkList La; InitList_l(La); for (i=0;inext=NULL; p=L; for(i=1;icoef=coef;s-expn=ex
16、pn; s-next=NULL;p-next=s;p=s; void OutputPoly(POLY L) /一元多项式的输出操作 int flag=1; /flag用来是否为第一项的标识 POLY p; p=L-next; while(p) if(flag) printf(%dX%d,p-coef,p-expn); flag=0; else printf(%+dX%d,p-coef,p-expn); p=p-next; printf(n); void AddPoly(POLY La, POLY Lb, POLY &Lc) /一元多项式的相加操作,即实现Lc=La+Lb int x; POLY
17、 pa,pb,pc,s; Lc=(POLY)malloc(sizeof(struct PNode); Lc-next=NULL;pc=Lc; pa=La-next;pb=Lb-next; while(pa&pb) if(pa-expnexpn) s=(POLY)malloc(sizeof(struct PNode); s-coef=pa-coef;s-expn=pa-expn; s-next=NULL;pc-next=s;pc=s; pa=pa-next; else if(pa-expnpb-expn) s=(POLY)malloc(sizeof(struct PNode); s-coef=p
18、b-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(struct PNode); 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(struct PNode); s-coef=pa-coef;s-expn=pa-expn; s-next=NULL;
19、pc-next=s;pc=s; pa=pa-next; while(pb) s=(POLY)malloc(sizeof(struct PNode); s-coef=pb-coef;s-expn=pb-expn; s-next=NULL;pc-next=s;pc=s; pb=pb-next; void main() POLY La,Lb,Lc; int n; printf(Creat Poly La:n); printf(t Input the number of items of La:); scanf(%d,&n); CreatPoly(La,n); printf(nLa(x)=); Out
20、putPoly(La); printf(Creat Poly Lb:n); printf(tInput the number of items of Lb:); 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实验前做好
21、充分准备,包括复习第三章所学内容,事先预习好本次实验内容;2实验时记录实验结果,按要求完成各题;3实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。三、实验题目与要求1实验题目一:顺序栈的定义及其操作算法的实现要求:编程实现顺序栈表的类型定义及顺序表的初始化操作、入栈操作、出栈操作、取栈顶元素操作、输出操作等,并对其进行验证。2实验题目二:链式队列的定义及其相关操作算法的实现要求:编程实现链式队列的类型定义及其初始化操作、入队操作、出队操作、取队头操作、输出操作等,并对其进行验证。3实验题目三:循环队列定义及其操作算法的实现要求:编程实现循环队列的类型定义及其初始化操作、入队操作、出
22、队操作、取队头操作、输出操作等,并对其进行验证。4实验题目四:利用栈实现进制转换要求:利用栈(顺序栈或链式栈)实现进制转换问题说明:(1)实验题目一与实验题目三为必做内容。(2)实验题目二与实验题目四为选做内容。四、实验程序示例示例1:顺序栈的定义及其操作算法的实现#include stdio.h#include malloc.h#define OK 1#define ERROR 0#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status; #define STACK_INIT_SIZE 100#define STAC
23、KINCREMENT 20typedef int SElemType; /定义栈内元素类型(SElemType)为int类型typedef struct SElemType *base; SElemType *top; int stackSize;SqStack;Status InitStack(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; return
24、OK;Status Push(SqStack &S,SElemType e) 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; return OK; Status Pop(SqStack &S, SElemType &e) /代码略 Status GetTop(SqStack S, SElemType &e) /代码略void StackOutput(SqStack S) int i; for(i=0;iS.Top;i+) printf(%
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1