数据结构实验指导书.docx
- 文档编号:8486037
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:22.65KB
数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
《数据结构》实验指导书
一、实验目的
上机实践是各位对本门课程所学知识的一种全面、综合的能力训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节,也是对课堂教学与实践教学效果的一种检验。
通常,实验题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合,使你们学会如何把书上学到的知识运用于解决实际问题的过程中去,培养从事软件开发设计工作所必需的基本技能;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析(需求分析)、总体结构设计和用户界面设计(概要设计)、程序设计基本技能和技巧等,即一整套软件工程规范的训练和科学作风的培养。
此外,还有很重要的一点是:
机器是比任何教师都严厉的主考者。
为了达到上述目的,本课程共安排了10个实验单元,各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实验单元与教科书的各章具有紧密的对应关系。
实验编号
实验内容
实验学时
实验类型
备注
1
实验一、线性表的顺序存储结构
2
设计性
必做
2
实验二、线性表的链式存储结构
2
设计性
必做
3
实验三、栈的应用
2
设计性
必做
4
实验四、队列的应用
2
创新性
必做
5
实验五、稀疏矩阵的存储和快速转置
2
验证性
必做
6
实验六、二叉树的递归遍历及其应用
2
综合性
必做
7
实验七、二叉树的其他典型算法
2
设计性
必做
8
实验八、图的遍历
2
设计性
必做
9
实验九、查找
2
验证性
必做
10
实验十、内部排序
2
验证性
必做
合计
20
其中必修学时:
20学时
二、要求:
⒈做好每一次上机前的准备以提高上机效率:
①预先认真阅读相关实验内容,做到心中有明确的目的要求和任务,要有备而来,应该自己独立的思考和设计你的算法和程序,并争取在规定的时间内如期完成上机工作任务。
对于个别目前基础较差的同学,实在是没法完成任务的建议你先参考其他同学的算法,勤学好问,最终自己独立完成,以增强你的感性认识,强化你的实践基础,提高你的实践能力。
②按照实验内容规定的习题题目,事先在实验预习报告上编写好源程序及运行程序所需的典型数据,并经人工静态检查认为无误;手编程序应书写整齐,应在每个题目之间留出一定的空间,以备记录上机调试情况和运行结果等;对程序中自己有疑问的地方,应作出记号,以便上机时给以注意。
③将想要上机验证的问题草拟提纲;制定一个简捷的程序调试计划。
⒉上机时输入和调式自己所编写的程序。
对“出错信息”,应善于自己分析判断,并充分利用开发工具提供的错误信息和调试手段解决出现的问题,及时修改与完善算法、源程序,随时记录有价值的内容。
解决问题是学习调式程序的良好机会。
切不可不编程序或抄别人的程序去上机,应从养成严谨的科学作风。
⒊程序调试通过后,应运行程序并根据事先准备的典型数据验证结果,在运行时要注意在输入不同数据时所得到的不同结果。
⒋为便于教师、助教检查和以后复习,请不要删除已通过的程序,包括有问题待答疑的程序,应保存在自己的工作目录内。
源程序名应能反映哪一次实验的哪一个题目,如Lab1_1.c表示实验一的第1题,……,若有未完成调试的源程序,可以作存盘保存处理,待课后继续完成。
三、实验报告规范:
上机结束后,应整理出实验报告,每份实验报告总分100分,实验报告必须在该次实验后的下一周星期二上午1、2节课前交到学习委员处,由学习委员按学号整理好,在上课前交到讲台上。
实验报告必须包括以下七个部分,详细要求见课程教学大纲,模板见实验指导书(习题集):
⒈需求分析(10分)
⒉概要设计(20分)
⑴抽象数据类型的描述
⑵程序结构图(功能模块图)
⒊详细设计(30分)
⑴存储结构的描述(含描述对象和算法中工具的存储结构)
⑵算法的详细设计(对复杂算法,最好画出其N-S流程图)
⑶函数的调用关系图
⒋调试分析(10分)
⒌用户使用说明(10分)
⒍测试结果(10分)
⒎附录(10分)
源程序清单(包括注释)
实验一线性表的顺序存储结构(2学时)
实验目的:
掌握使用TurboC2.0上机调试线性表的基本方法;掌握现行表的基本操作。
实验要求:
掌握线性表的顺序存储结构;能够利用线性表的顺序存储结构实现表的合并操作。
实验内容:
题一:
阅读所给的源程序,上机输入该程序,并调试、运行,在实验报告中由学生写出该题目)。
程序如下:
#include
#include
#include
//符号常量
#defineERRORO
#defineOK1
#defineEQUAL1
#defineOVERFLOW-1
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
//类型声明
structSTU{//定义学生结构体类型,包括姓名,学号,年龄,成绩
charname[20];
charstuno[10];
intage;
intscore;
}stu[50];
typedefstructSTUElemType;//用ElemType代替学生
structLIST
{//定义表LIST为结构体类型
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量
};
typedefstructLISTList;//用list代表结构体LIST
intinit(List*L)
{//构造一个空的线性表
L→elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
If(!
L→elem)exit(OVERFLOW);//存储分配失败
L→length=0;//空表长度为0
L→listsize=LIST_INIT_SIZE;//初始存储容量
Returnok;
}
intListLength(List*L)
{//求表L的长度
returnL→length;
}
voidGetElem(ListL,inti,ElemType*e)
{
*e=L.elem[i];
}
intEqualList(ElemType*e1,ElemType*e2)
{//以元素e1,e2中的姓名项是否相等作为判定e1,e2是否相等的标准
if(strcmp(e1→name,e2→name)==0)
return1;
else
return0;
}
intLess_EqualList(ElemType*e1,ElemType*e2)
{//以姓名(字符串)的≤作为判定e1≤e2的标准
if(strcmp(e1→name,e2→name)<=0)
return1;
else
return0;
}
intLocateElem(List*La,ElemTypee,inttype)
{//判断La中是否有与e符合关系type的元素
inti;
suitch(type)
{
caseEQUAL;
for(i=0;i if(EqualList(&La→elem[i],&e)) return1; break; default;break; } return0; } voidMergeList(List*La,List*Lb,List*Lc) {//合并表La,Lb,用Lc存储。 已知La,Lb元素值按非递减排列,Lc中值也按非递减排列 ElemType*pa,*pb,*pc,*pa_last,*pb_last; pa=La→elem;pb=Lb→elem; Lc→listsize=Lc→length=La→length+Lb→length; Pc=Lc→elem=(ElemType*)malloc(Lc→listsize*sizeof(ElemType)); if(! Lc→elem)exit(OVERFLOW);//存储分配失败 pa_last=La→elem+La→length-1; pb_last=Lb→elem+Lb→length-1; while(pa<=pa_last&&pb<=pb_last) {//合并,Lc元素按非递减排列 if(Less_EqualList(pa,pb))*pc++=*pa++; else*pc++=*pb++; } while(pa<=pa_last)*pc++=*pa++//插入La的剩余元素 while(pb<=pb_last)*pc++=*pb++//插入Lb的剩余元素 } voidUnionList(List*La,List*Lb) {//将所有在Lb中而不在La中的元素插入到La中 intLa_len,Lb_len; inti; ElemTypee; La_len=Listlength(La);Lb_len=Listlength(Lb);//求线性表长度 for(i=0;i { GetElem(*Lb,I,&e); If(! LocateElem(La,e,EQUAL)) ListInsert(La,++La_len,e); } } intprintlist(ListL) {//输入表L inti; printf("namestunoagescore\n"); for(i=0;i printf("%-cos%s\t%d\t%d\n",L.elem[i].name,L.elem[i].stuno,L.elem[i].age,L.elem[i].score); printf("\n"); } intListInsert(List*L,inti,structSTUe) {//在表L中第i位上插入e structSTU*p,*q; if(*i<1||i>L→length+1)returnERROR;//i值不合法 q=&(L→elem[i-1]); for(p=&L→elem[L→length-1];p>=q;--p) *(p+1)=*p; *q=e; ++L→length; returnok; } main { structSTUe;//定义结构体变量e ListLa,Lb,Lc;//定义结构体变量,即表La,Lb,Lc Clrscr(); Printf("\n\n--------ListDemoisrunning----------\n\n"); Printf("FirstisInsertListfunction.\n"); init(&La);//创建一个新表La strcpy(e.name,"stu1"); strcpy(e.stuno,"100001"); e.age=80; e.score=1000; ListInsert(&La,1,e);//在La的第1位上插入stu1的数据元素 strcpy(e.name,"stu3"); strcpy(e.stuno,"100002"); e.age=80; e.score=1000; ListInsert(&La,2,e);//在La的第2位上插入stu3的数据元素 Printlist(La);//输出La Printf("ListAlengthnowis%d.\n\n",La.length); Getch(); strcpy(e.name,"stu5"); strcpy(e.stuno,"100003"); e.age=80; e.score=1000; ListInsert(&La,3,e);//在表La的第3位上插入stu5的数据表 printlist(La);//输出表La printf("ListAlengthnowis%d.\n\n",La.length); getch(); init(&Lb);//创建一张新表Lb strcpy(e.name,"stu2"); strcpy(e.stuno,"100001"); e.age=80; e.score=1000; ListInsert(&Lb,1,e);//在表Lb的第1位上插入stu2的数据 strcpy(e.name,"stu4"); strcpy(e.stuno,"100002"); e.age=80; e.score=1000; ListInsert(&Lb,2,e);//在表Lb的第2位上插入stu4的数据 strcpy(e.name,"stu6"); strcpy(e.stuno,"100001"); e.age=80; e.score=1000; ListInsert(&Lb,3,e);//在表Lb的第3位上插入stu6的数据 printlist(Lb);//输出表Lb printf("ListBlengthnowis%d.\n\n",Lb.length); getch(); MergeList(&La,&Lb,&Lc);//合并表La,Lb,用表Lc存储(非递减有序) Printlist(Lc);//输出表Lc getch(); printf("SecondisUnionListfunction.\n"); printf("NowUnionListAandListB---\n"); UnionLIst(&La,&Lb);//合并La,Lb,并删除值相同的元素,用La存储 Printlist(La);//输出La Printf("ListAlengthnowis%d.\n\n",La.length); getch(); } 题二: 设计并实现以下算法: 有两张非递增有序的线性表A和B,采用顺序存储结构,将这两张表合并成C表,要求C表仍然是非递增有序的,然后删除C表中值相同的多余元素。 实验二线性表的链式存储结构(2学时) 实验目的: 掌握线性表在链式存储结构上的基本操作。 实验要求: 掌握线性表的链式存储结构;能够利用线性表的链式存储结构实现两个多项式的相加操作。 实验内容: 题一: 阅读所给的源程序,上机输入该程序,并调试、运行,在实验报告中由学生写出该题目)。 程序如下: #include #include #include #defineok1 #defineerror0 #defineoverflow-1 #defineLIST_INIT_STZE100 #defineLISTINCREMENT10 structSTU{ charname[20]; charstuno[10]j; intage; intscore; }stu[50]; typedefstucestuelemtype; structLNODE { ELEMtypedata; structLNODE*next; } typedefstructLNODELNODE typedefstructLNODE*linklist; intinit(linklist*l){ *l=(LNODE*)malloc(sizeof(LNODE)); if(! L)exit(error); (*L)->next=null; returnok; } intlistlength(linklistL){ intj=0; while(l->next; j++; } returnj; } intgetelem(linklistL,inti,elemtype*e){ linklistp;intj; p=L->next;j=1; while(p&&j p=L->next;++j; } if(! p//j>1) returnerror; *e=p->data; returnok; } intequalllist(elemtype*e1,elemtype*e2) { if(strcmp(e2->name,e2->name)==0) return1; else return0 } intless_equallist(elemtype*e1,elemtype*e2) if(strcmp(e2->name,e2->name)<=0) return1; else return0 } intlocateelem(linklistla,elemtypee,inttype) { inti; linklistp; p=la; switch(type) { caseEQUAL; while(p->next) { p=p->next; if(Equallist(&p->data,&e)) return1; } return0; break; dafault: break; } return0; voidMergeList(linklistla,linklistlb,linklist*lc) {linklistpa,linklistpb,linklistpc; pa=la->next;pb=lb->next; *lc=pc=la; while(pa&&pb) {if(less_equallist(&pa->data,&pb->data)) {pc->next=pa;pc=pa;pa=pa->next; } else {pa->next=pb;pc=pb;pb=pb->next; } } pc->next=pa? pa: pb; free(lb); } intprintlist(linklistL) { inti; linklistpl p=l; printf("namestunoagescore\n"); while(p->next) { p=p->next; printf("%-10s%s\t%d\t%d\n",p->data.name,p->data.stuno,p->data.age,p->data.score); printf("\n"); } intlistinsert(link,listl,inti,elemtyjpee) { linklistp,s; intj; p=l; j=0; while(pa&&j { p=p->next; ++j; } if(! jp//j>i-1)returnerror; s=(linklist)malloc(sizeof(lnode)); s->data=e; s->next=p->next; p->next=s; } main() { structSTUe; linklistla,lb,lc; clrscr(); printf(\n\n..................ListDemoisrunning.........................\n\n"); printf("FirstisInsertlistfunction.\n"); init(&la); strcpy(e.name,"stu1"); strcpy(e.stuno,"100001"); e.age=80; e.score=1000; listinsert(la,1,e); strcpy(e.name,"stu3"); strcpy(e.stuno,"100002"); e.age=80; e.score=1000; listinsert(la,2,e); printlist(la); getch(); strcpy(e.name,"stu5"); strcpy(e.stuno,"100003"); e.age=80; e.score=1000; listinsert(la,2,e); strcpy(e.name,"stu6"); strcpy(e.stuno,"100001"); e.age=80; e.score=1000; listinsert(la,3,e); printlist(lb); getch(); Mergelist(la,lb.&lc); printlist(lc); getch(); } 题二: 设计并实现以下算法: 给出用单链表存储多项式的结构,利用后接法生成多项式的单链表结构,实现两个多项式相加的运算,并就地逆置加相后的多项式链式。 实验三栈的应用(2学时) 实验目的: 掌握栈的基本操作,求解复杂问题。 实验要求: 掌握栈的顺序存储结构;能够利用栈的顺序存储结构实现逆波兰表达式求值;能够利用栈的顺序存储结构求解背包问题。 实验内容: 题一: 设计并实现以下算法: 将一个中缀表达式转换成逆波兰式,然后对此逆波兰表达式求值。 题二: 求解“背包问题”。 “背包问题”的基本描述是: 有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,...,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。 (可用递归或非递归求解) 实验四队列的应用(2学时) 实验目的: 掌握队列的基本操作,实现复杂问题的求解。 实验要求: 掌握带头结点的循环链表存储结构;利用栈和队列的存储结构求解迷宫问题。 实验内容: 题一: 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意: 不设头指针),试编写相应的队列初始化、入队列和出队列算法。 题二: 求解迷宫的一条最短路径,要求: 用栈和队列实现,不允许使用递归算法。 问题描述见教材第50页“3.2.4迷宫求解”。 实验五稀疏矩阵的存储和快速转置(2学时) 实验目的: 掌握稀疏矩阵的压缩存储结构,实现快速转置和矩阵相乘 实验要求: 掌握矩阵的压缩存储结构;利用矩阵的三元组顺序表存储结构实现稀疏矩阵的快速转置;利用矩阵的行逻辑链接顺序表存储结构实现稀疏矩阵的相乘。 实验内容: 题一: 实现稀疏矩阵快速转置算法(教材算法5.2)。 要求: 输入一个矩阵,由程序将其转换成三元组表存储;转置后的三元组表,由程序将其转换成矩阵形式后输出。 题二: 实现两个稀疏矩阵相乘算法(教材算法5.3)。 实验六二叉树的递归遍历及其应用(2学时) 实验目的: 掌握二叉树的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)