数据结构实验指导书.docx
- 文档编号:10423676
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:64
- 大小:359.52KB
数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(64页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
数据结构实验指导书
概述
一、课程目的
《数据结构》是一门实践性很强的软件基础课程,为了学好这门课,每个学生必须完成一定数量的上机作业。
通过本课程的上机作业,要求在数据结构的选择和应用、算法的设计及实现等方面加深对课程基础内容的理解,同时,实验题中的问题比平时的练习题要复杂,也更接近实际,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
本课程实验的目的是旨在使学生进一步巩固课堂上所学的理论知识;深化理解和灵活掌握教学内容;培养学生算法设计的能力和解决实际问题的程序设计的能力。
二、实验名称与学时分配
序号
实验名称
学时数
实验类型
1
线性表顺序存储结构
2
验证
2
链表应用
2
验证
3
利用栈实现递归
2
验证
4
链队列应用
2
验证
5
二叉树遍历
4
综合
6
图的遍历
4
综合
三、实验要求
⒈问题分析
充分地分析和理解问题本身,弄清要求做什么,包括功能要求、性能要求、设计要求和约束以及基本数据特性,数据间的联系等。
⒉数据结构设计
针对要求解决的问题,考虑各种可能的数据结构,并且力求从中出最佳方案(必须连同算法一起考虑),确定主要的数据结构及全程变量。
对引入的每种数据结构和全程变量要详细说明其功能、初值和操作特点。
⒊算法设计
算法设计分概要设计和详细设计,概要设计着重解决程序的模块设计问题,这包括考虑如何把被开发的问题程序自顶向下分解成若干顺序模块,并决定模块的接口,即模块间的相互关系以及模块之间的信息交换问题.详细设计则要决定每个模块内部的具体算法,包括输入、处理和输出,采用类C语言描述。
⒋测试用例设计
准备典型测试数据和测试方案,测试数据要有代表性、敏感性,测试方案包括模块测试和模块集成测试。
⒌上机调试
对程序进行编译,纠正程序中可能出现的语法错误,测试前,先运行一遍程序看看究竟将会发生什么,如果错误较多,则根据事先设计的测试方案并结合现场情况进行错误跟踪,包括打印执行路径或输出中间变量值等手段。
三、实验考核
每次实验结束后,均应上交实验报告。
数据结构课程实验成绩单独考核,占1个学分。
实验报告应包括如下内容:
1、问题描述:
简述题目要解决的问题是什么。
2、设计:
包括存储结构设计、主要算法设计等。
用类C语言或用框图描述。
3、调试报告:
调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、算法分析与改进:
算法的时间复杂度和空间复杂度分析;算法改进的设想。
5、经验和体会
附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则结果要包含这些测试数据和运行输出,当然还可以含有其它测试数据和运行输出(有时需要多组数据)。
四、实验时间
16学时。
实验一线性表顺序存储结构
一、实验目的
1、掌握使用TurboC2.0/C++/VC环境上机调试线性表的基本方法;
2、掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构上的运算。
二、实验要求
1、认真阅读和掌握本实验的程序。
2、上机运行本程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。
4、按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果
三、注意事项:
在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
四、实验内容
实验题目1:
线性表基本操作的实现
这个程序中演示了顺序表的创建、插入、删除和查找,请修改并完成。
程序如下(Turbo2.0环境下程序示例):
#include
#include
//顺序表的定义
#defineListSize100
typedefstruct
{intdata[ListSize];/*向量data用于存放表结点*/
intlength;/*当前的表长度*/
}SeqList;
voidmain()
{voidCreateList(SeqList*L,intn);
voidPrintList(SeqList*L,intn);
intLocateList(SeqList*L,intx);
voidInsertList(SeqList*L,intx,inti);
voidDeleteList(SeqList*L,inti);
SeqListL;
inti,x;
intn=10;/*THELENGTHOFLIST*/
L.length=0;
clrscr();
CreateList(&L,n);/*CREATTHELIST*/
PrintList(&L,n);/*PRINTTHELIST*/
printf("INPUTTHERESEARCHELEMENT");
scanf("%d",&x);
i=LocateList(&L,x);
printf("theresearchpositionis%d\n",i);/*顺序表查找*/
printf("inputthepositionofinsert:
\n");
scanf("%d",&i);
printf("inputthevalueofinsert\n");
scanf("%d",&x);
InsertList(&L,x,i);/*顺序表插入*/
PrintList(&L,n);/*打印顺序表*/
printf("inputthepositionofdelete\n");
scanf("%d",&i);
DeleteList(&L,i);/*顺序表删除*/
PrintList(&L,n);
getch();/*打印顺序表*/
}
/*顺序表的建立:
*/
voidCreateList(SeqList*L,intn)
{inti;
printf("pleaseinputnnumbers\n");
for(i=1;i<=n;i++)
{scanf("%d",&L->data[i]);
}
L->length=n;
}
/*顺序表的打印:
*/
voidPrintList(SeqList*L,intn)
{inti;
printf("thesqlistis\n");
for(i=1;i<=n;i++)
printf("%d",L->data[i]);
}
/*顺序表的查找:
*/
intLocateList(SeqList*L,intx)
{inti;
for(i=1;i<=10;i++)
if((L->data[i])==x)return(i);
elsereturn(0);
}
/*顺序表的插入:
*/
voidInsertList(SeqList*L,intx,inti)
{intj;
for(j=L->length;j>=i;j--)
L->data[j+1]=L->data[j];
L->data[i]=x;
L->length++;
}
/*顺序表的删除:
*/
voidDeleteList(SeqList*L,inti)
{intj;
for(j=i;j<=(L->length)-1;j++)
L->data[j]=L->data[j+1];
}
实验题目2:
集合求并
说明:
分别用两个线性表对集合进行表示,将其中一个集合并到另一个集合。
程序如下(C++/VC环境)
#defineINITSIZE10
#defineINCREASEMENT2
#defineOVERFLOW-1
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#include"iostream.h"
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
typedefintStatus;
typedefcharElemType;
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList(SqList&L){
L.elem=(ElemType*)malloc(INITSIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=INITSIZE;
returnOK;
}//InitList
StatusListInsert(SqList&L,inti,ElemTypee){
if(L.length>=L.listsize){
L.elem=(ElemType*)realloc(L.elem,(L.listsize+INCREASEMENT)*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.listsize=L.listsize+INCREASEMENT;
}
L.elem[i]=e;
L.length++;
returnOK;
}//ListInsert
StatusCreateList(SqList&L){
ElemTypee;
cin>>e;
while(e!
='!
'){
L.elem[L.length++]=e;
cin>>e;
}
returnOK;
}//CreateList
StatusGetElem(SqListL,inti,ElemType&e){
if(i<1||i>L.length)returnERROR;
e=L.elem[i-1];
returnOK;
}
Statusequal(ElemTypea,ElemTypeb){
if(a==b)returnTRUE;
elsereturnERROR;
}//equal
StatusElemLocate(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)){
inti;
for(i=1;i<=L.length;i++)
if((*compare)(e,L.elem[i-1]))returnTRUE;
returnERROR;
}//ElemLocate
voidUnion(SqListLa,SqListLb,SqList&Lc){
inti,j,k;
i=j=k=0;
ElemTypea,b;
while(i GetElem(La,i+1,a); i++; ListInsert(Lc,k++,a); } while(j GetElem(Lb,j+1,b); j++; if(! (ElemLocate(La,b,equal))) ListInsert(Lc,k++,b); } return; } voidmain(void){ SqListLa,Lb,Lc; InitList(La); InitList(Lb); InitList(Lc); cout<<"PleaseCreateListA: \n"; CreateList(La); cout<<"ShowtheendA: \n"; inti; for(i=0;i cout< cout<<'\n'; cout<<"PleaseCreateListB: \n"; CreateList(Lb); cout<<"ShowtheendB: \n"; for(i=0;i cout< cout<<"\n"; Union(La,Lb,Lc); cout<<"ShowtheendC: \n"; for(i=0;i cout< cout<<"\n"; getchar(); return; }//main 实验题目3: 报数问题 编号为1,2,···,n的n个人围坐在一圆桌旁,从第s个人开始报数,报到第m的人退席,下一个人又重新从1开始报数,依此重复,直至所有的人都退席。 例如,设s=1,m=4,n=8,则退席的人的编号依次为4,8,5,2,1,3,7,6。 1、存储结构 (1)以顺序表为存储结构 (2)以循环链表为存储结构 typedefstructlnode{ intdata; structlnode*next; }lnode; 2、算法设计 (1)voidjosephus_1(intp[],intm,intn){ inti,j,t; for(i=0;i<=n-1;i++)p[i]=i+1;//p[0]..p[n-1]: n个人 t=0;//第一次报数的位置(第一人的位置) for(i=n;i>=1;i--){ t=(t+m-1)%i;//t: 定位于第m人,i: 当前圆桌上的人数,%: 实现环(圆桌)的处理 cout< for(j=t+1;j<=i-1;j++) p[j-1]=p[j];//元素前移(第m人退席,删除第m人) } } (2)voidjosephus_2(lnode*r,intm,intn){ //r: (不带头结点的)单向循环链表的尾指针 Lnode*p=r;//p: 指向尾指针for(i=1;i<=n;++i){ for(j=1;j<=m-1;++j) p=p->next;//p后移m-1次,定位于m-1处(要退席的人之前) s=p->next;//s定位于m人(要退席的人) cout< p->next=s->next;deletes;//第m人退席,删除第m人 } } 实验二链表应用 一、实验目的 1.掌握握单链表的基本操作: 插入、删除、查找等运算。 二、实验要求 1.认真阅读和掌握本实验的程序。 2.上机运行本程序。 3.保存和打印出程序的运行结果,并结合程序进行分析。 4.按照你对单链表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 三、实验内容 实验题目1: 单链表基本操作的实现 这个程序中演示了单链表的创建、插入、删除和查找。 程序如下: #include typedefstructnode{ intdata; structnode*next; }NODE; /******************************************/ NODE*Create(){ NODE*p,*head; intx; head=(NODE*)malloc(sizeof(NODE)); head->next=NULL; printf("Inputdata,-1toEnd! \n"); scanf("%d",&x); while(x! =-1){ p=(NODE*)malloc(sizeof(NODE)); p->data=x; p->next=head->next; head->next=p; scanf("%d",&x); } return(head); } /******************************************/ voidOutput(NODE*head){ NODE*p; p=head; printf("BegintodumptheLinkList...\n"); while(p->next! =NULL){ printf("->%d",p->next->data); p=p->next; } printf("\nTheLinkListended! \n"); } /******************************************/ intListlen(NODE*head){ inti=0; NODE*p=head; while(p->next! =NULL){ i++; p=p->next; } return(i); } /******************************************/ intGet(NODE*head,inti){ intj=0; NODE*p=head; while(p->next&&j j++; p=p->next; } if(! p->next||j>i)return(0); elsereturn(p->data); } /******************************************/ voidDel(NODE*head,inti){ NODE*p=head; intj=0; while(p->next&&j j++; p=p->next; } if(! p->next||j>i-1)printf("thepositioniswrong\n"); else p->next=p->next->next; } /******************************************/ voidIns(NODE*head,inti,inte){ NODE*p=head,*q; intj=0; while(p->next&&j j++; p=p->next; } if(! p->next&&j>i-1)printf("Wrongposition\n"); else{ q=(NODE*)malloc(sizeof(NODE)); q->data=e; q->next=p->next; p->next=q; } } /******************************************/ main(){ NODE*head; intlength; inti,element; clrscr(); head=Create(); Output(head); length=Listlen(head); printf("thelengthofthelinkis%d\n",length); printf("inputtheorder: \n"); scanf("%d",&i); element=Get(head,i); printf("theelementoftheorderis%d\n",element); printf("inputthedelposition\n"); scanf("%d",&i); Del(head,i); Output(head); printf("Inputtheinsertposionandelement: \n"); scanf("%d%d",&i,&element); Ins(head,i,element); Output(head); getch(); } } 实验题目2: 线性表归并的链式表示实现(C++/VC环境) #defineOK1 #defineERROR0 #include"stdio.h" #include"stdlib.h" #include"malloc.h" #include"iostream.h" typedefintstatus; typedefintElemType; typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; statusInitList(LinkList&L){ L=(LinkList)malloc(sizeof(LNode)); if(! L)exit(-2); L->next=NULL; returnOK; }//InitList voidCreateList(LinkList&L,intn){ inti;LNode*p,*q; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; q=L; for(i=0;i p=(LinkList)malloc(sizeof(LNode)); cin>>p->data; q->next=p; q=p; } q->next=NULL; }//CreateList statusMergesort(LinkList&A,LinkList&B,LinkList&C){ LNode*Pa,*Pb; Pa=A->next;Pb=B->next; while(Pa&&Pb){ if(Pa->data Pa->next=C->next;C->next=Pa;//把*Pa逆位序加入链表C Pa=A->next;//取链表A的下一个结点 } else{B->next=Pb->next;//把Pb结点从链表B中删除 Pb->next=C->next;C->next=Pb;//把*Pb逆位序加入链表C Pb=B->next;//取链表B的下一个结点 } } while(Pa){A->next=Pa->next;//把Pa结点从链表A中删除 Pa->next=C->next;C->next=Pa;//把*Pa逆位序加入链表C Pa=A->next;//取链表A的下一个结点 } while(Pb){B->next=Pb->next;//把Pb结点从链表B中删除 Pb->next=C->next;C->next=Pb;//把*Pb逆位序加入链表C Pb=B->next;//取链表B的下一个结点 } free(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书