计专10数据结构实验指导书.docx
- 文档编号:24299604
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:64
- 大小:54.42KB
计专10数据结构实验指导书.docx
《计专10数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《计专10数据结构实验指导书.docx(64页珍藏版)》请在冰豆网上搜索。
计专10数据结构实验指导书
陕西理工学院重点课程
《数据结构》实验指导书
曹记东李征郭天印编著
计算机科学与技术系
2011年9月
目录
《数据结构》上机实验的目的和要求………………………………………….…….1
实验一线性表的插入和删除………………………...……………………………….2
实验二单链表的插入和删除…………………………………………………………5
实验三栈……………………………..…………..……………………………………9
实验四栈和队列……………………………………………………………………..12
实验五二叉树操作…………………………………………………………………..17
实验六哈夫曼树的应用……………………………………………………………..21
实验七图的遍历操作………………………………………………………………..28
实验八排序…………………………………………………………………………..35
实验九查找…………………………………………………………………………..41
实验十哈希表设计…………………………………………………………………..46
《数据结构》上机实验的目的和要求
通过上机实验加深对课程内容的理解,增加感性认识,提高软件设计、编写及调试程序的能力。
要求所编的程序能正确运行,并提交实验报告。
实验报告的基本要求为:
1、需求分析:
陈述程序设计的任务,强调程序要做什么,明确规定:
(1)输入的形式和输出值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入输出结果和错误的输入及输出结果。
2、概要设计:
说明用到的数据结构定义、主程序的流程及各程序模块之间的调用关系。
3、详细设计:
提交带注释的源程序或者用伪代码写出每个操作所涉及的算法。
4、调试分析:
(1)调试过程中所遇到的问题及解决方法;
(2)算法的时空分析;
(3)经验与体会。
5、用户使用说明:
说明如何使用你的程序,详细列出每一步操作步骤。
6、测试结果:
列出对于给定的输入所产生的输出结果。
若有可能,测试随输入规模的增长所用算法的实际运行时间的变化。
实验一顺序表的插入和删除
一、实验目的
1、掌握用TurboC上机调试线性表的基本方法;
2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。
二、实验内容
线性表基本操作(插入、删除、查找、合并)的实现
三、程序实现:
typedefNull0;
typedefintdatatype;
#definemaxsize1024;
typedefstruct
{datatypedata[maxsize];
intlast;
}sequenlist;
intinsert(L,x,i)
sequenlist*L;
inti;
{intj;
if((*L).last==maxsize-1)
{printf(“overflow”);
returnNull;
}
elseif((i<1)‖(i>(*L).last+1)
{printf(“error”);
returnNull;
}
else
{for(j=(*L).last;j>=i-1;j--)
(*L).data[j+1]=(*L).data[j];
(*L).data[i-1]=x;
(*L).last=(*L).last+1;
}
return
(1);
}
intdelete(L,i)
sequenlist*L;
inti;
{intj;
if((i<1)‖(i>(*L).last+1))
{printf(“error”);
returnNull;
}
else
{for(j=i,j<=(*L).last;j++)
(*L).data[j-1]=(*L).data[j];
(*L).data--;
}
return
(1);
}
voidcreatlist()
{sequenlist*L;
intn,i,j;
printf(“请输入n个数据\n”);
scanf(“%d”,&n);
for(i=0;i {printf(“data[%d]=”,i); scanf(“%d”,(*L).data[i]); } (*L).last=n-1; printf(“\n”); } printout(L) sequenlist*L; {inti; for(i=0;i<(*L).last;i++) {printf(“data[%d]=”,i); printf(“%d”,(*L).data[i]); } } main() {sequenlist*L; charcmd; inti,t; clscr(); printf(“i,I…..插入\n”); printf(“d,D…..删除\n”); printf(“q,Q……退出\n”); do {do { cmd=getchar(); }while((cmd! =‘d’)‖(cmd! =‘D’)‖(cmd! =‘q’)‖(cmd! =‘Q’)‖ (cmd! =‘i’)‖(cmd! =‘I’)); switch(cmd) {case‘i’,‘I’;scanf(&x); scanf(&i); insert(L,x,i); printout(L); break; case‘d’,‘D’;scanf(&i); delete(L,i); printout(L); break; } } while((cmd! =‘q’)&&(cmd! =‘Q’)); } 实验二单链表的插入和删除 一、实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、实验内容: 单链表的基本操作实现 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、程序实现: #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedefstructnode//定义结点 { chardata[10];//结点的数据域为字符串 structnode*next;//结点的指针域 }ListNode; typedefListNode*LinkList;//自定义LinkList单链表类型 LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表 ListNode*LocateNode();//函数,按值查找结点 voidDeleteList();//函数,删除指定值的结点 voidprintlist();//函数,打印链表中的所有值 voidDeleteAll();//函数,删除所有结点,释放内存 //主函数 voidmain() { char*ch,*num; LinkListhead; head=CreatListR1();//用尾插入法建立单链表,返回头指针 printlist(head);//遍历链表输出其值 printf("Deletenode(y/n): ");//输入“y”或“n”去选择是否删除结点 scanf("%s",num); if(strcmp(num,"y")==0||strcmp(num,"Y")==0){ printf("PleaseinputDelete_data: "); scanf("%s",ch);//输入要删除的字符串 DeleteList(head,ch); printlist(head); } DeleteAll(head);//删除所有结点,释放内存 } //用尾插入法建立带头结点的单链表 LinkListCreatListR1(void) { char*ch; LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点 ListNode*s,*r,*pp; r=head; r->next=NULL; printf("Input#toend");//输入“#”代表输入结束 printf("PleaseinputNode_data: "); scanf("%s",ch);//输入各结点的字符串 while(strcmp(ch,"#")! =0){ pp=LocateNode(head,ch);//按值查找结点,返回结点指针 if(pp==NULL){//没有重复的字符串,插入到链表中 s=(ListNode*)malloc(sizeof(ListNode)); strcpy(s->data,ch); r->next=s; r=s; r->next=NULL; } printf("Input#toend"); printf("PleaseinputNode_data: "); scanf("%s",ch); } returnhead;//返回头指针 } //按值查找结点,找到则返回该结点的位置,否则返回NULL= ListNode*LocateNode(LinkListhead,char*key) { ListNode*p=head->next;//从开始结点比较 while(strcmp(p->data,key)! =0&&p)//直到p为NULL或p->data为key止 p=p->next;//扫描下一个结点 returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点 } //删除带头结点的单链表中的指定结点 voidDeleteList(LinkListhead,char*key) { ListNode*p,*r,*q=head; p=LocateNode(head,key);//按key值查找结点的 if(p==NULL){//若没有找到结点,退出 printf("positionerror"); exit(0); } while(q->next! =p)//p为要删除的结点,q为p的前结点 q=q->next; r=q->next; q->next=r->next; free(r);//释放结点 } //打印链表 voidprintlist(LinkListhead) { ListNode*p=head->next;//从开始结点打印 while(p){ printf("%s,",p->data); p=p->next; } printf("\n"); } //删除所有结点,释放空间 voidDeleteAll(LinkListhead) { ListNode*p=head,*r; while(p->next){ r=p->next; free(p); p=r; } free(p); } 实验三栈 一、实验目的: 1.熟练掌握栈的结构,以及这种数据结构的特点; 2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法; 二、实验内容: 计算表达式的值 计算用运算符后缀法表示的表达式的值。 后缀表达式也称逆波兰表达式,比中缀表达式计算起来更方便简单些,中缀表达式要计算就存在着括号的匹配问题,所以在计算表达式值时一般都是先转换成后缀表达式,再用后缀法计算表达式的值。 如: 表达式(a+b*c)/d-e用后缀法表示应为abc*+d/e-。 只考虑四则算术运算,且假设输入的操作数均为1位十进制数(0—9),并且输入的后缀形式表达式不含语法错误。 三、程序实现: #include #defineadd43//运算符加号‘+’的ASCII码 #definesubs45//运算符减号‘-’的ASCII码 #definemult42//运算符乘号‘*’的ASCII码 #definediv47//运算符除号‘/’的ASCII码 #defineMAXSIZE100 typedefstruct {intstkdata[MAXSIZE];//用数组来表示栈空间,定义长度为MAXSIZE的堆栈 inttop;//栈顶 }STKzone; typedefSTKzone*STK; typedefenum{true=1,false=0}bool; typedefenum{ok,error}status; STKzoneexpSTKzone; STKexpSTK; STKinitSTK(STKzone*stack_zone){ //执行栈初始化,建栈指针 STKp; p=stack_zone; p->top=0; } statuspush(int*term,STKpstk){ //将一结构型数据送入栈中 if(pstk->top==MAXSIZE) returnerror;//栈满,进栈失败 pstk->stkdata[pstk->top]=*term; (pstk->top)++;//栈顶指针移动 returnok; }//push boolemptySTK(STKpstk){ //判断栈是否为空栈 return(pstk->top==0); } statuspop(int*pdata,STKpstk){ //从栈中取出一结构型数据 if(emptySTK(pstk)) returnerror; (pstk->top)--;//退栈 *pdata=pstk->stkdata[pstk->top]; returnok; } voidsynerror() {printf("\n表达式语法错! "); exit(); } inteval(chartag,inta1,inta2) {switch(tag) {caseadd: return(a1+a2); casesubs: return(a1-a2); casemult: return(a1*a2); casediv: return(a1/a2); } } main() {charc; intopd1,opd2,temp,c1; expSTK=initSTK(&expSTKzone); printf("\n后置表达式: "); while((c=getchar())! ='\n') {if(c=='')continue; if((c>47)&&(c<58))//判断是否是0—9的字符 {putchar(c); c1=c-48;//把输入的字符型数字转换成数字 if(push(&c1,expSTK)==error)//运算分量进栈 {printf("\n表达式太长\n"); exit();} } elseif((c==add)||(c==subs)||(c==mult)||(c==div)) {putchar(c); if(pop(&opd1,expSTK)==error)//将运算量1出栈 synerror(); if(pop(&opd2,expSTK)==error)//将运算量2出栈 synerror(); temp=eval(c,opd2,opd1);//计算得到结果 push(&temp,expSTK);//将运算结果进栈 } elsesynerror();//出现非法字符 }//while if(pop(&opd1,expSTK)==error)synerror(); if(! (emptySTK(expSTK)))synerror(); printf(“=%-3d\n”,opd1); }//main_end 实验四栈和队列 一、实验目的: 1.掌握队列和栈的顺序存储结构和链式结构,以便在实际背景下灵活运用。 2.掌握栈和队列的特点,即先进后出与先进先出的原则。 二、实验内容: 停车场管理 根据题目要求,停车场只有一个大门,因此可用一个栈来模拟;而当栈满后,继续来的车辆只能停在便道上,根据便道停车的特点,可知这可以用一个队列来模拟,安排队的车辆先离开便道,进入停车场。 由于在停车场中间的车辆可以提出离开停车场,而且要求在离开车辆到停车场大门之间的车辆都必须先离开停车场,让此车离去,然后再让这些车辆依原来的次序进入停车场,因此在一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,很显然这也应该用一个栈来模拟。 因此本题中用到两个栈和一个队列。 对于停车场和车辆规避所,有车辆进入和车辆离去两个动作,这就是栈的进栈和出栈操作,只是还允许排在中间的车辆先离开停车场,因此在栈中需要进行查找。 而对于便道,也有入队列和出队列的操作,同样允许排在中间的车辆先离去队列。 这样基本动作只需利用栈和队列的基本操作就可实现。 三、程序实现: #include"stdio.h" #defineN5//定义停车场长度 #defineM10 typedefstruct//定义栈元素的类型 {intnum; intarrtime; }elemtype; typedefstruct//定义栈 {elemtypestack[N]; inttop; }stack; typedefstructnode//定义队列节点类型 {intnum; structnode*next; }queneptr; typedefstruct//定义队列 {queneptr*front,*rear; }quene; voidinitstack(stack*s)//初始化栈 {s->top=-1;} intpush(stack*s,elemtypex)//数据元素X进入指针S所指的栈 {if(s->top==N-1) return(0); else{s->stack[++s->top]=x; return (1); } } elemtypepop(stack*s) {elemtypex; if(s->top<0) {x.num=0; x.arrtime=0; return(x);//如果栈不空,返回栈顶元素 } else{x=s->stack[s->top]; s->top--; returnx; } } voidinitquene(quene*s)//初始化队列 {s->front=(queneptr*)malloc(sizeof(queneptr));//产生一个新结点,作为头结点 s->rear=s->front; s->front->next=NULL; s->front->num=0;//头结点的NUM保存队列元素的个数 } voidenquene(quene*s,intnum)//数据入队列 {queneptr*p; p=(queneptr*)malloc(sizeof(queneptr)); p->num=num; p->next=NULL; s->rear->next=p; s->rear=p; s->front->num++; } intdelquene(quene*s) {queneptr*p; intn; if(s->front==s->rear) return(0);//如果队列空 else{p=s->front->next; s->front->next=p->next; if(p->next==NULL) s->rear=s->front; n=p->num; free(p); s->front->num--; return(n); } } voidarrive(stack*s1,quene*p,elemtypex) {intf; f=push(s1,x);//新到达的车辆入停车栈 if(f==0) {enquene(p,x.num);//如果停车场满,就进入队列 printf("the%dcarstopsthe%dseatofthequene\n",x.num,p->front->num); } elseprintf("the%dcarstopsthe%dseatofthestack\n",x.num,s1->top+1); } voidleave(stack*s1,stack*s2,quene*p,elemtypex)//处理车辆离去函数 {intn,f=0; elemtypey;queneptr*q; while((s1->top>-1)&&(! f)) {y=pop(s1); if(y.num! =x.num) n=push(s2,y); elsef=1; } if(y.num==x.num)//如果栈顶元素不是要离开的车辆,就将其放入车辆规避所 {printf("themoneyofthe%dis%dyuan\n",y.num,(x.arrtime-y.arrtime)*M); while(s2->top>-1) {y=pop(s2); f=push(s1,y); } n=delquene(p); if(n)//在停车场中找到要离开的车辆 {y.num=n; y.arrtime=x.arrtime; f=push(s1,y); printf("the%dcarstopsthe%dseatofthestak\n",y.num,s1->top+1); } } else{while(s2->top>-1)//车辆规避所不空,将其全放回停车场 {y=pop(s2);f=push(s1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 数据结构 实验 指导书