《应用数据结构》实验指导书.docx
- 文档编号:24450026
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:56
- 大小:43.07KB
《应用数据结构》实验指导书.docx
《《应用数据结构》实验指导书.docx》由会员分享,可在线阅读,更多相关《《应用数据结构》实验指导书.docx(56页珍藏版)》请在冰豆网上搜索。
《应用数据结构》实验指导书
《应用数据结构》实验指导书
课程编号:
4170159110
课程名称:
应用数据结构/AppliedDataStructure
实验学时:
16
适应专业:
工科类
承担实验室:
管理学院实验中心
一、实验目的和任务
1.实验教学的目的
本课程的教学要求之一是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,其重要程度绝不亚于知识传授。
实验的作用在于帮助学生深入理解教材内容,巩固基本概念,促使学生在动手过程中进一步体会C语言中数据结构的运用技巧,并锻炼学生在调试过程中分析和发现问题的能力。
2.实验教学的要求
学生应掌握C语言基本编程能力并运用数据结构的原理和方法解决具体问题。
除按时上机外,学生应具备构造算法并用程序实现的能力;在程序调试过程中,学生应能正确解读程序的错误提示并找到有效的解决办法。
此外,规范书写算法也是一个值得高度重视的问题,教师有责任在教学过程中提醒学生,避免形成一系列难以纠正且贻害无穷的程序设计坏习惯。
此外,本门课程设计的算法比较多,要求教师熟练掌握C语言和数据结构各类算法,并能准确理解和回答学生提出的编程问题。
二、实验项目及学时分配
序号
实验项目名称
实验学时
实验类型
开出要求
1
线性数据结构算法验证
4
验证及演示
必做
2
非线性数据结构算法验证
4
验证及演示
必做
3
查找及排序
4
验证及演示
必做
4
综合算法设计
4
综合
必做
三、参考资料
李业丽、郑良斌编著,数据结构(C)实验教程,北京理工大学出版社,2005年12月出版
严蔚敏,吴伟民编著,数据结构习题集(C语言版),清华大学出版社,1999年2月出版。
四、单项实验的内容和要求(包括实验所用的主要仪器设备,实验所需主要耗材)
实验一线性数据结构算法验证
1.实验目的与意义
1)熟悉C语言的上机环境,进一步掌握C语言的结构特点
2)掌握线性表的顺序存储结构的定义及C语言实现
3)掌握线性表的链式存储结构——单链表的定义及C语言实现
4)掌握线性表在顺序存储结构——即顺序表中的各种基本操作
5)掌握线性表在链式存储结构——单链表中的各种基本操作
6)掌握栈的顺序表示和实现
7)掌握栈的链式表示和实现
8)掌握队列顺序表示和实现
9)掌握队列链式表示和实现
2.基本原理和方法
本实验涉及各类线性数据结构——线性表、栈和队列等。
单链表的各种操作,包括单链表的建立,结点的查找、插入、删除等基本运算。
链表中插入结点的指针变化和删除p所指结点的指针变化参见讲义。
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为p->top==MAXNUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。
通常栈空作为一种控制转移的条件。
注意:
1顺序栈中元素用向量存放。
2栈底位置是固定不变的,可设置在向量两端的任意一个端点。
3栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置。
队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。
入队时,将新元素插入rear所指的位置,然后将rear加1,出队时,删去front所指的元素,然后将front加1并返回被删除元素。
顺序队列中的溢出现象:
1“下溢”现象。
当队列为空时,做出队运算产生的溢出现象。
“下溢”是正常现象,常用作程序控制转移的条件。
2“真上溢”现象。
当队列满时,做进找运算产生空间溢出的现象。
“真上溢”是一种出错状态,应设法避免。
3“假上溢”现象。
由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。
当队列中实际的元素个数远远小于向量空闻的规模时,也可能由于尾指针己超越向量空间的上界而不能做入队操作。
该现象称为“假上溢”现象。
3.主要仪器设备及耗材
安装有TurboC++3.0或VisualStudio2012运行环境的电脑,无耗材要求。
4.实验方案或技术路线
本实验含有三部分内容——线性表、栈和队列。
A.线性表部分
采取建立学生成绩表的方法实现。
即建立学生成绩单链表,链表中每个结点由4个域组成,分别为:
学号、姓名、成绩、存放下一个结点地址的next域、要求完成的四项功能可写成四个函数,登记学生成绩对应建立学生单链表的功能,后三个功能分别对应单链表的查询、插入与删除三大基本操作。
该系统中的数据采用线性表中的链式存储结构即单链表来存储,用结构体类型定义每个学生记录,故该单链表中每个结点的结构可描述为:
#defineMAXLEN100
typedefstructnode
{intnum;//学号
charname[MAXLEN];//姓名
floatscore;//成绩
structnode*next;}linklist;
B.栈部分
此部分的算法独立性较强,因此可直接采用教材或讲义上的算法实现,但教材或讲义上的算法并非可执行的算法,故学生须自行进行算法上的转换。
C.队列部分
本实验主要由教师课堂演示,以一个具体的实例——机场事件模拟来实现。
5.实验内容及步骤
A.线性表部分——学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本实验是对学生的成绩管理作一个简单的模拟,用菜单选择操作方式完成下列功能:
1登记学生成绩
2查询学生成绩
3插入学生成绩
4删除学生成绩
【参考程序】
/*头文件hh.h的内容*/
#include
#include
#include
#defineMAXLEN100
typedefstructnode
{intnum;
charname[MAXLEN];
intscore;
structnode*next;}list;
/*头文件creat.h的内容*/
#include"hh.h"
list*create()
{list*head,*p,*r;
inti,n;
head=(list*)malloc(sizeof(list));
head->next=NULL;
r=head;
printf("请输入学生人数:
\n");
scanf("%d",&n);
for(i=l;i<=n;i++)
{p=(list*)malloc(sizeof(list));
printf("输入学生的学号:
\n");
scanf("%d",&p->num);
printf("输入学生的姓名:
\n");
scanf("%s",p->name);
printf("输人李生的成绩:
\n");
scanf("%d",&p->score);
p->next=NULL;
r->next=p;
r=r->next;}
return(head);
}
/*以下是头文件insert.h的内容*/
list*insert(list*h)
{list*p,*q,*r,*head;
head=r=h;
p=h->next;
q=(list*)malloc(sizeof(list));
printf("输入待插入学生的学号:
\n");
scanf("%d",&q->num);
printf("输入姓名:
\n);
scanf("%s",q->name);
printf("输入成绩:
\n");
scanf("%d,&q->score);
q->next=NULL;
while(p)
{r=p;
p=p->next;}
r->next=q;
r=r->next;
return(head);
}
/*以下是头文件find.h的内容*/
voidfind(list*h)
{intk;
list*p;
p=h->next;
printf("输入要查找学生的学号:
\n");
scanf("%d",&k);
while(p&&p->num!
=k)p=p->next;
if(p){printf("学号\t姓名\t成绩\n");
printf("%d\t%s\t%d\n",p->num,p->name,p->score);}
elseprintf("没找到!
\n");
}
/*以下是头文件del.h的内容*/
list*del(list*h)
{intk;
list*p,*q;
q=h;
p=h->next;
printf("请输入待删除学生的学号:
\n");
scanf("%d",&k);
while(p&&p->num!
=k)
{q=p;
p=p->next;}
if(p){q->next=p->next;
free(p);}
elseprintf("没有这个学生成绩,无法删除!
\n");
return(h);
}
/*以下是头文件output.h的内容*/
voidoutput(list*h)
{list*p;
p=h->next;
while(p!
=NULL)
{printf("学号\t姓名\t成绩\t\n");
printf("%d\t%s\t%d\n",p->num,p->name,p->score);
p=p->next;}
}
/*以下是主程序*/
#include"creat.h"
#include"find.h"
#include"insert.h"
#include"output.h"
#include"del.h"
main()
{list*p;
intk;/*控制循环的标志*/
while
(1)
{printf("----------------------------------\n");
printf("|学生成绩管理|\n");
printf("|________________|\n");
printf("|1.登记成绩|\n");
printf("|2.查询成绩|\n");
printf("|3:
插入成绩|\n");
printf("|4.删除成绩|\n");
printf("|5.输出所有学生成绩|\n");
printf("|0.退出程序|\n");
printf("----------------------------------\n");
printf("请输入你的选择\n");
scanf("%d",&k);
switch(k)
{case1:
p=create();break;
case2:
find(p);break;
case3:
p=insert(p);break;
case4:
p=del(p);break;
case5:
output(p);break;
case0:
exit(0);
default:
printf("选择错误,重新开始!
\n");}
}
}
B.栈部分——编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
1初始化顺序栈
2插入元素
3删除栈顶元素
4取栈顶元
5遍历顺序栈
6置空顺序栈
【参考程序】
#include
#include
#defineMAXNUM20
#defineElemTypeint
/*定义顺序栈的存储结构*/
typedefstruct
{ElemTypestack[MAXNUM];
inttop;}SqStack;
/*初始化顺序栈*/
voidInitStack(SqStack*p)
{if(!
p)printf("Error");
p->top=-l;
}
/*入栈*/
voidPush(SqStack*p,ElemTypex)
{if(p->top
elseprintf("Overflow!
\n");
}
/*出栈*/
ElemTypePop(SqStack*p)
{ElemTypex;
if(p->top!
=O){x=p->stack[p->top];
printf("栈顶元%d已经被删除!
\n",p->stack[p->top]);
p->top=--;
return(x);}
else{printf("Underflow!
\n");
return(0);}
}
/*获取栈顶元素*/
ElemTypeGetTop(SqStack*p)
{if(p->top!
=0)return(p->stack[p->top]);
else{printf("Underflow!
\n");
return(0);}
}
/*遍历顺序栈*/
voidOutStack(SqStack*p)
{inti;
printf("\n");
if(p->top<0)printf("这是一个空栈!
\n");
for(i=p->top;i>=O;i--)printf("第%d个数据是:
%6d\n",i,p->stack[i]);
}
/*置空顺序栈*/
voidsetEmpty(SqStack*p)
{p->top=-1;
}
/*主函数*/
main()
{SqStack*q;
inty,cord;
ElemTypea;
do{printf("\n第一次使用必须初始化!
\n");
printf("\n");
printf("\n主菜单\n");
printf("\n1初始化顺序栈\n");
printf("\n2插入一个元素\n");
printf("\n3删除栈顶元素\n");
printf("\n4取栈顶元素\n");
printf("\n5置空顺序栈\n");
printf("\n6结束程序运行\n");
printf("\n-------------------------\n");
printf("请输入您的选择(1,2,3,4,5,6):
");
scanf("%d",&cord);
printf("\n");
switch(cord)
{case1:
{q=(SqStack*)malloc(sizeof(SqStack));
InitStack(q);
OutStack(q);
}break;
case2:
{printf("请输入要插入的数据元素:
a=");
scanf("%d",&a);
Push(q,a);
OutStack(q);
}break;
case3:
{Pop(q);
OutStack(q);
}break;
case4:
{y=GetTop(q);
printf("\n栈顶元素为:
%d\n",y);
OutStack(q);
}break;
case5:
{setEmpty(q);
printf("\n顺序栈被置空!
\n");
OutStack(q);
}break;
case6:
exit(0);
}
}while(cord<=6);
}
C.队列部分——熟悉讲义中队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
1模拟一个机场飞机起降的过程
2机场仅有一条跑道,要求起飞与降落不能同时进行
3进场飞机若暂时没有跑道可用须在空中盘旋等候
4离场飞机若暂时没有跑道可用须在地面排队等候
5仅当空中无飞机等待降落时地面飞机方可起飞
6飞机的申请进场、降落、申请离场和起飞分别视为独立事件
7每个事件的发生占用一个时间单位。
除降落和起飞外,各事件可以同时发生
【参考程序】
#defineMAXQUEUE5/*useasmallvaluefortesting*/
#include
#include
#include
#include
#include
#include
#include
typedefenumboolean{False,True}Boolean;
typedefenumaction{ARRIVE,DEPART}Action;
typedefstructplane
{intid;/*identificationnumberofairplane*/
inttm;}Plane;/*timeofarrivalinqueue*/
typedefPlaneQueueEntry;
typedefstructqueue
{intcount;/*numberofairplanesinthequeue*/
intfront,rear;/*frontandrearofthequeue*/
QueueEntryentry[MAXQUEUE];}Queue;
/*CreateQueue:
createthequeue.
Pre:
None.
Post:
Thequeueqhasbeeninitializedtobeempty.*/
voidCreateQueue(Queue*q)
{q->count=q->front=0;
q->rear=-1;
}
/*Error:
displayanerrormessage.
Pre:
messageistheerrormessagetodisplay.
Post:
Theerrormessagehasbeenprintedtostderrandtheprogramterminates.*/
voidError(char*message)
{fprintf(stderr,"Error:
%s\n",message);
exit
(1);
}
/*UserSaysYes:
Trueiftheuserwantstocontinueexecution.
Pre:
None.
Post:
ReturnsTrueiftheuser'sanswerbeginswitheitheryorY,FalseiftheuserrespondswithanyresponsebeginningwitheithernorN.*/
BooleanUserSaysYes(void)
{intc;
printf("(y/n)?
");
do{while((c=getchar())=='\n');/*Ignorenewlinecharacter.*/
if(c=='y'||c=='Y'||c=='n'||c=='N')return(c=='y'||c=='Y');
printf("Pleaserespondbytypingoneofthelettersyorn\n");
}while
(1);
}
/*Randomize:
setstaringpointforpseudorandomintegers.*/
voidRandomize(void)
{srand((unsignedint)(time(NULL)%10000));
}
/*Start:
printmessagesandinitializetheparameters.
Pre:
None.
Post:
Asksuserforresponsesandinitializesallvariablesspecifiedasparameters.
Uses:
UserSaysYes.*/
voidStart(int*endtime,double*expectarrive,double*expectdepart)
{Booleanok;
printf("Thisprogramsimulatesanairportwithonlyonerunway.\nOneplanecanlandordepartineachunitoftime.\nUpto%dplanescanbewaitingtolandortakeoffatanytime.\n",MAXQUEUE);
printf("Howmanyunitsoftimewillthesimulationrun?
");
scanf("%d",endtime);
Randomize();/*Initializerandomnumbergeneration.*/
do
{printf("Expectednumberofarrivalsperunittime(realnumber)?
");
scanf("%lf",expectarrive);
printf("Expectednumberofdeparturesperunittime?
");
scanf("%lf",expectdepart);
if(*expectarrive<0.0||*expectdepart<0.0)
{printf("Thesenumbersmustbenonnegative.\n");
ok=False;}
elseif(*expectarrive+*expectdepart>1.0)
{printf("Theairportwillbecomesaturated.Readnewnumbers?
");
ok=!
UserSaysYes();}
elseok=True;
}while(ok==False);
printf("\n");
}
/*PoissonRandom:
generateapseudorandomintegeraccordingtothePoissondistribution.
Pre:
None.
Post:
generate
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用数据结构 应用 数据结构 实验 指导书