大学数据结构课程设计校园景点游览实习报告.docx
- 文档编号:23843635
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:10
- 大小:134.95KB
大学数据结构课程设计校园景点游览实习报告.docx
《大学数据结构课程设计校园景点游览实习报告.docx》由会员分享,可在线阅读,更多相关《大学数据结构课程设计校园景点游览实习报告.docx(10页珍藏版)》请在冰豆网上搜索。
大学数据结构课程设计校园景点游览实习报告
20XX年复习资料
大
学
复
习
资
料
专业:
班级:
科目老师:
日期:
《数据结构》
课程设计报告
课程名称:
《数据结构》课程设计
课程设计题目:
校园导游咨询
姓名:
何唯
院系:
计算机学院
专业:
计算机科学与技术
年级:
20XXXX级
学号:
20XXXX20XXXX20XXXX20XXXX
指导教师:
赵葆华
20XX11年5月27日
一、需求设计
该次实习要求是设计一张地图,里面有n个景点,告诉我们景点之间的连接信息,要设计一个校园导游程序,为来访的游客提供各种信息的查询服务。
主要为两个服务。
(1)为来访游客提供图中任意景点相关额信息查询。
(2)为游客提供图中任意两景点间的最短路径的长度,并输出该条路径
为实现这两个服务我们需要用一个数据结构存储这个地图的情况,还有就是用dijkstra算法去求两点间的最短路,并需要一个数组去记录该最短路径。
二、概要设计
1.地图和风景点的数据结构
1).typedefstructArcCell{
intadj;//相连接的两个风景间的距离
}ArcCell,AdjMatrix[20XXXX0][20XXXX0];//记录每两个景点间的距离的数组
2)typedefstruct{
charscename[30];//风景名称
intscenum;//风景代号
charsceintro[20XX0];//风景简介
}Scenery;//景点的数据结构
3)typedefstruct{
Sceneryvexs[20XXXX0];//景点数组,每个景点对应一个该数组下标
AdjMatrixarcs;
intvexnum,arcnum;//地图中点的景点的个数和路的条数
}MGraph;//地图的用图的数组表示法记录
2.一些用到的比较重要的变量
intPath[20XXXX0];//记录最短路径
intD[20XXXX0];//记录节点到起始节点的记录
boolfinal[20XXXX0];//标记该节点是否在路径上
3.CreatMGraph(MGraph&G)
初始条件:
地图G所需的空间已存在
操作结果:
初始化地图,输入景点的个数,输入每个风景点的信息,输入图中路的条数,和每条路的起始景点和终止景点及该路的长度。
4.GetSce(charscename[],MGraphG)
初始条件:
地图G已存在,和已知的一个景点名
操作结果:
由风景名称返回该风景在G.vex[]风景数组中的下标
5.ShortestPath_DIJ(MGraphG,intsn,inten)
初始条件:
图G存在,已经初始化,已知起点sn,终点en
操作结果:
用dijkstra算法求两个景点间的最短距离,并记录下该路径
6.ShortestPath_DIJ(MGraphG,intsn,inten)
初始条件:
图G存在,已经初始化,已知起点sn,终点en,保存路径的数组Path[]已存了最短路径
操作结果:
若起始景点和终止景点间存在最短路,输出这条最短路,及最短路上风景的信息。
三、详细设计
1.初始化地图
voidCreatMGraph(MGraph&G){
inti,j;
intdis,n1,n2;
charname1[30],name2[30];
printf("请输入景点的个数:
");
scanf("%d",&G.vexnum);
printf("请输入地图上路的条数");
scanf("%d",&G.arcnum);
printf("\n请输入每个景点的信息(风景名称,代号,简介).\n");
for(i=1;i<=G.vexnum;i++){
printf("第%d个景点(风景名称,代号,简介):
",i);
scanf("%s",G.vexs[i].scename);
scanf("%d",&G.vexs[i].scenum);
scanf("%s",G.vexs[i].sceintro);
}
printf("\n请输入景点之间的路且路的长度:
\n");
for(i=1;i<=G.vexnum;i++){
for(j=1;j<=G.vexnum;j++){
G.arcs[i][j].adj=MAX;
}
}
for(i=1;i<=G.arcnum;i++){
printf("请输入起始某条路的起始和终止景点的名称,及该条路的长度:
");
scanf("%s",name1);
scanf("%s",name2);
n1=GetSce(name1,G);
n2=GetSce(name2,G);
scanf("%d",&dis);
G.arcs[n1][n2].adj=dis;
G.arcs[n2][n1].adj=dis;
}
printf("\n");
}
2.intGetSce(charscename[],MGraphG){
inti;
for(i=1;i<=G.vexnum;i++)
if(strcmp(scename,G.vexs[i].scename)==0)returni;
return-1;
}
返回景点名在图G的风景数组vex[]中的下标,如果没找到则返回-1表示地图中不存在该节点输入错误
3.主要算法,用dijkstra算法求两个景点间的最短距离,并记录下该路径
voidShortestPath_DIJ(MGraphG,intsn,inten){
inti;
intv,min;
for(i=1;i<=G.vexnum;i++){
final[i]=false;//用于记录景点是否在最短路径的景点的集合中
D[i]=G.arcs[sn][i].adj;//初始化每个景点到起始景点的距离
if(D[i]!
=MAX)Path[i]=sn;//初始化Path[],与起始景点有路的点i则在Path[i]记下起始点位置s
elsePath[i]=0;
}
D[sn]=0;
final[sn]=true;
Path[sn]=sn;
boolfind=false;
while
(1){
min=MAX;
v=-1;
for(i=1;i<=G.vexnum;i++){//找到不在最短路风景集合中的点与起始点最近的那个景点,把该景点放入最短路景点集合中。
if(final[i]==false&&D[i] v=i; min=D[i]; } } if(v==-1){ find=false; break; } final[v]=true; for(i=1;i<=G.vexnum;i++){/*修改每个未在最短路景点集合中的点到起点的最短路径,如果某个景点i通过v使得i到起始点的距离变小了,则修改D[i],并在Path[i]中记录i的前驱v,因为i当前与起始景点的最短路是通过v修改过来的*/ if(final[i]==false&&(min+G.arcs[v][i].adj D[i]=min+G.arcs[v][i].adj; Path[i]=v; } } if(v==en){ find=true; break; } } OutPutPath(G,find,sn,en); } 在写这个部分的时候,我自己觉得最难的就是如何去记录最短路径,在这个地方想了很久,但最后通过努力还是想到了一个很好的方法,就是每次修改景点与起始点的最短距离时,把该修改的景点的前驱景点记录在路径数组上,具体的写法看代码中该部分的注释。 这样处理的话在找到景点的最短路径的长度算出来的同时也将路径记录在Path[]数组中了,而且这样的处理并没有增加该算法的时间复杂度,想出来之后感觉很巧妙,然后转化成代码也是很容易的。 4.路径的输出: voidOutPutPath(MGraphG,boolfind,intsn,inten){ inti; intpath[20XXXX0];//用来把Path[]中记录的前驱形式的路径转化为顺序形式的 if(! find){ printf(“景点%s到景点%s没有路”,G.vexs[sn].scename,G.vexs[en].scename); return; } else{ printf(“景点%s到景点%s的最短路径的长度为: %d\n\n", G.vexs[sn].scename,G.vexs[en].scename,D[en]); printf("景点%s到景点%s的最短路径中的风景点依次为: \n", G.vexs[sn].scename,G.vexs[en].scename); path[0]=en; intk=1,x=Path[en]; while(x! =sn){//把Path[]中的前驱式路径转化成顺序存储的 path[k++]=x; x=Path[x]; } path[k]=sn; for(i=k;i>=0;i--){ printf("该最短路径上第%d个景点为(名称,代号,简介)\n", k-i+1,G.vexs[path[i]].scename,G.vexs[path[i]].scenum, G.vexs[path[i]].sceintro); } printf("\n"); } } 这个函数是输出路径用的,路径在Path[]数组中是以前驱的形式记录的,即Path[i]的下标为地图中的第i个风景的前一个景点记录记录在Path[]中,所以通过从终点开始找每个点的前驱,记录在path[]数组中,直到起始节点,就找到了那条最短路径。 四、测试结果 五、总结 一、这次课程设计的心得体会通过实践我的收获如下: 1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。 2、培养了我选用参考书,查阅手册及文献资料的能力。 培养独立思考,深入研究,分析问题、解决问题的能力。 3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。 4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。 二、根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点: 1、认真上好专业实验课,多在实践中锻炼自己。 2、写程序的过程中要考虑周到,严密。 3、在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。 5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。 六、参考文献 [1]严蔚敏,吴伟民编著.数据结构(C语言版)——北京: 清华大学出版社,20XXXX. [2]数据结构实用教程(c++版)——电子工业出版社 [3]王红梅,胡明,王涛,数据结构(c++版)——北京: 清华大学出版社,20XXXX [4]网上搜索相关程序作为参考
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 数据结构 课程设计 校园 景点 游览 实习 报告