下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、题号:第七题题目:校园导航问题1, 需求分析:设计你的学校的平面图,至少包括10个以上的景点(场所),每两个景点间可以有不同的路,且路长也可能不同,找岀从任意景点到达另一景点的最佳路径(最短路径)。要求:(1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等 有关信息。(2) 为来访客人提供图中任意景点相关信息的查询。(3) 为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。(4) 修改景点信息。实现提示:一般情况下,校园的道路是双向通行的,可设计校园平面图是一个无向网。顶点和边均含有相关信息。选做内容:(1) 提供图的编辑功能:
2、增、删景点;增、删道路;修改已有信息等。(2) 校园导游图的仿真界面。2, 设计:2.1设计思想:<1>,数据结构设计:(i)图。采用邻接矩阵存储,其中图所用到的结构体为:typedef structSeqList vertices;/表示图中的顶点int EdgeMaxVerticesMaxVertices;/ 表示图中的边int numOfEdge;/表示图中边的数目AdjMGraph;(2)景点。用顺序表存储。所用到的结构体为:typedef struct/顶点名称顶点代号/顶点信息简介char n ame20;int code;char in troducti on 50;
3、DataType;(3) 景点之间的连接描述,所用到的结构体为:typedef struct int row;int col;int weight;RowColWeight;用图来存放所提供的所有景点,然后用线性表来存放每一个景点的信息,其中包括景点的名称,代号,信息简介,以及其它的一些信息。这样就将对景点的操作,变成对图中各顶点的操作<2>,算法设计:关于本课题的算法,很大部分来源于这学期数据结构课程的学习,其中包括:图的创建,线性表的一些操作。对于具体的问题实现,都有不同的算法,在下面的分析中,我将详细说明2.2设计表示:<1>,函数调用关系及函数说明:首先,mai
4、n()函数调用Creat()函数,用来创建图,然后调用menu()函数来选择用户所要进行的操作。其中对menu()函数就是一个菜单供使用者来选择他所要进行的相关操作,比如信息的查询,最短路径查询之类。,存放景点名称、代号、简介等信 息;以边表示路径,存放路径长度等有关信息。图的创建设计流程图为:Creaa(n函数原型为1 Creat()void Creat(AdjMGraph *G, DataType v, RowColWeight E, i nt n,i nt e)其中,G为所创建的图结构体对象,v为所有顶点的集合,它是DataType型,这个类型前面已经介绍过;E存放着各顶点之间的连接关系
5、,它是RowColWeight型,前面也介绍过;n表示顶点的个数;e表示边数。Creat()函数的功能就是实现图的创建,将已知的景点的一些信息,转换成图的信息,并进行存储。In formati on()对于要求2:为来访客人提供图中任意景点相关信息的查询。流程图为:menu()函数的 原型为:Information1()void men u()他就是一个菜单,供用户选择他们所要进行的操作。Information")函数原型为:voidIn formatio n1()它的功能就是输入查询景点的信息,并调用In formatio n()Information。函数原型为:void In
6、formatio n(AdjMGraph G, char seen ery)G 依然是所创建的图的结构体对象,后面所有的G都是表示这个意思;seenery是在Information1()中输入的景点的名称。此函数的功能就是根据输入的景点的名称来查询其相关的信息。对于要求3:为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条 最短路径。流程图为:PathieT函数原型为:Path1()Path()F|oyd()void Path1()它的功能就是输入查询景点的名称,并调用Path()Path ()函数原型为:v oid Path(AdjMGraph G,ehar see neryn
7、ame, char see neryn ame1)其中seeneryname, seeneryname1就是在 Path1()函数中所输入的景点的名称,这个函数的功能就是通过这两个景点的名称找到它们在线性表中的位置,然后调用Floyd()函数,查找出它们的最短路径,并输出所要的信息。Floyd()函数原型为:void Floyd (int eost MaxVertiees,int n,int weightMaxVertices,int pathMaxVertices) 其中参数eost MaxVertiees即是图中边的邻接存储矩阵,weightMaxVertiees用来存放经此算法后的各顶点
8、间的最短路径的值,pathMaxVertiees就是每两个顶点之间最短路径中到达目的顶点的前一个顶点的位置。Path()函数中的输岀信息就是据此而来。对于要求4:修改景点信息。流程图为:void Modify()它不带任何参数,功能是通过手动输入景点名称,然后找到景点的存储空间,然后在修改相应的信息。对于选做要求:增加景点。其工作流程图为:AdavnuiCo 函数原型为:AddVertic()ListI nsert()void AddVertic()他不带任何参数,该函数的功能是在这个函数里面输入景点的信息,然后调用ListInsert()函数,将所要增加的顶点信息插入到线性表中。Listln
9、sert()函数原型为:void ListInsert(SeqList *L, int i, DataType x) 参数L表示顶点存储的线性表,i表示要插入的位置,x表示要插入的景点的信息。同时我在插入顶点时也将他与其他顶点之间的距离设置为MaxWeight,这样做主要是为了方便在Floyd函数里面求最短路径对于选做要求:删除景点。其工作流程图为DeleteVertic()函数原型为:void DeleteVertic()他不带任何参数,该函数的功能就是在函数体里面输入要删除的景点的名称,然后根据名称找到该景点在线性表中的存储位置,然后调用线性表中的ListDelete ()函数进行相应顶点
10、的删除。ListDelete ()函数原型为:ListDelete(SeqList *L, int i, DataType *x) 其中参数L为存放顶点信息的线性表,i表示要删除顶点在线性表中的存放位置,,x就是要删除的那一个景点。它的功能就是从线性表中删除指定的顶点。对于选做要求:增、删道路,流程图为:void AddRoad()和void DeleteRoad()。这两个函数都不带参数,它们的功能就是在这两个函数里面输入要 删除要增加或者的边连接的两个景点的名称,然后在线性表中找到这两个景点的相对存储空间,最后调用InsertEdge ()或者 DeleteEdge ()函数。Insert
11、Edge ()和 DeleteEdge ()两函数原型为:void InsertEdge(AdjMGraph *G, int v1, int v2, int weight)void DeleteEdge(AdjMGraph *G, i nt v1, i nt v2)这两个函数中同名参数所代表的意义是相同的,其中v1, v2是所输入景点在线性表中的相对位置;weight就是增加的边的权值<2>函数接口说明我所设计整个程序就是一些子函数的集合,每个功能都对应一个或者几个子函数,他们之间可以没有任何限制,只要能保证程序正确运行就可以调用,特别是AdjMGraph.h,AdjMGraph.
12、h和SeqList.h头文件之中的函数,他们被很多函数调用过。这其中都没有任何特殊类型的函数2.3详细设计:根据题目分析,对于信息查询与修改功能,设计如下:1, 输入景点名称2, 从线性表头扫描到表尾,if(找到该景点)输出景点结构体信息else输出提示信息找不到该顶点实现查找最短路径,设计如下:1, 景点名称2,根据输入的信息找到它们所在的线性表中的位置3, 调用Floyd算法找岀最短路径4, 输岀信息实现增删景点功能,设计如下:1, 增加或者删除景点的名称2, if(输入景点),将景点信息保存在相应的结构体中,并插入到线性表尾;if(删除景点),找到景点在线性表中所在的位置,然后将景点信息
13、从线性表中删除 实现增删道路功能,设计如下:1, 入增加或删除道路连接的两个景点的名称;2, 找到它们的相对位置;3, if(删除道路),将连接它们的边置为MaxWeight ;if(增加道路),将输入的边值赋给相应的邻接矩阵表;3,调试分析:1,调试过程中遇到的问题与解决方案:1,关于最短路径的输岀问题。在进行最短路径输岀时,我刚开始时只能正序输岀,具体的描述为:比如,我要查寻从东区到东湖的最短路径,那么它能正确输岀结果,他的形式为:东区一一 主楼一一 西体育馆 一一 隧道 一一 北大门 一一 东湖。但是,当我逆向输岀时,得到的结果却有点问题,经过分析调试后, 找到了错误的所在。在找最短路径
14、的时候我用的是Floyd算法,在这个算法中有三重循环,形式均为:for(k=0;k n;k+),它们都是从零开始的,所以在顺序输岀时没问题,但是逆序的时候就需要进行一个判断, 正序与逆序循环输岀是相反的。2,关于新增加景点后再找最短路径问题。比如我再新增一个景点,如北区食堂,并输入相关信息,然后插入到线性表尾,当我再找从东区到东湖的最短距离时,输岀的最短路径将变为:东区一一食堂一一东湖。经过分析调试后,其原因也是岀在Floyd 算法那,在Floyd 算法中,有这么一个判断 if(weightijweightik+weightkj),由于我在输入新景点信息时并没有建立它与其它景点之间的连接信息,
15、所以在图中,该新景点与其它景点之间的边得连接信息是空的,也就是说在邻接矩阵中,它的边得信息是空的,那么在进行if(weightijweightik+weightkj)判断时weight新增景点序号其它景点序号的值将是一个很大的负数,所以最短路径将会岀错。解决这个问题的方法就是在增加新景点时就将它与其它景点之间的边(距离)设置为MaxWeight,这时如果再用 Floyd函数进行最短路径的求解时就不会再岀现问题了。另外,在做这个题时也还岀现过一些其他的小问题,不过都比较容易解决,这里我就不再列岀了2,算法的时空复杂度分析对应题目的要求,我总共提供了八个选项操作对于每一个操作的分析如下:1,相关信
16、息的查询。在这个操作中允许使用者输入一个景点名称,然后再根据景点名称来或取其相关的信息,这个操作要扫描线性表,其时间复杂度为o(n),空间复杂度为 o(n);2, 最短路径查询。实现这个功能用到了Floyd算法,他用到了一个三重的for()循环,故其时间复杂度为o(n人3),空间复杂度为 o(1);3, 修改景点信息。要修改信息,必须首先找到景点所在的存储位置,那么就需要扫描线性表,其时间复杂 度为o(n),空间复杂度为 o(1);4, 增加景点。增加景点信息时,直接将此景点结构体信息插入到线性表表尾,而不需要进行遍历,其时间复杂度与空间复杂度均为o(1);5, 删除景点。删除景点时必须找到所
17、要删除景点所在的位置,这样就必须遍历线性表,除此之外,删除后线性表还要进行移动操作,其时间复杂度为o(n),空间复杂度为 o(n1);6, 增加道路。增加道路也要扫描线性表,找到要增加路的两景点的存储位置,然后再根据找到的存储位置去改变邻接矩阵的边的值,改变邻接矩阵的时间复杂度为o(1),其总时间消耗在线性表的扫描上,故最终其时间复杂度为o(n),空间复杂度为 0(1);7, 删除道路。删除道路和增加道路类似,都是先找到存储位置,然后再改变邻接矩阵,它的时空复杂度分 别为 o(n) ,0(1);8, 浏览所有景点。浏览所有景点的实质就是从头到尾遍历线性表,然后输岀遍历到的节点的信息,其时间 复
18、杂度为o(n),空间复杂度为 0(1)。4,用户手册:DOS环境里面将看到一个选项菜单,菜单里面 18之间的数 当然,一般而言先应该10个景点的名使用说明:当用户将程序经过编译,连接后,点击运行,在提供了 8种操作,同时输岀了一行提示信息:请选择您想进行的操作。然后用户可以输入一个 字进行选择性的操作,例如,您想进行信息的查询操作,您可以从键盘输入数字1进行“浏览所有景点名称”操作。如果您选择了浏览所有景点名称操作,在屏幕上将会显示岀 称,这些景点是事先加进去的,用户可以对这些景点进行任何程序所提供的操作。下面,我将详细介绍本程序的使用方法:在浏览景点后,菜单将会继续显示岀来,为您提供操作选择
19、。如果您想进行“相关信息的查询”操作,输入数字1',然后程序将会提醒您输入查询景点的名称,在您输入景点名称后回车即可如果您想进行“最短路径查询”操作,首先输入数字2',然后程序将会提醒您输入查询的景点的名称,您输入按要求输入所提供的两个景点名称即可,要注意的是景点名称间以空格隔开,最后程序就会告诉您最短 的路径,以及最短路的长度。如果您想修改景点的信息,同样先输入数字3',然后程序就会提醒您输入所要修改景点的名称,您可以根据要求输入一个景点的名称,然后回车,之后屏幕上就会显示您所输入的景点的所有信息,同时会有三个修 改选项供用户选择,然后您可以输入13之间的一个数字进行
20、选择性的修改。比如,您可以输入T对景点名称进行修改,修改完后又会返回到菜单项继续选择。如果您想进行“增加景点”操作,可以输入数字4',然后程序就会提示您输入新增加的景点的名称,代号,信息简介,各种输入之间以空格隔开。当输入完毕后回车,景点也就成功加入了,然后用户可以再次选择 第八项操作浏览所有景点名称,检测新输入的景点是否已经成功添加。如果您想进行“删除景点”操作,可以输入数字5',回车后系统将会提示您输入要删除的景点的名称,您可以输入您想要删除的景点的名称,然后回车,这样删除景点的操作就已经完成,您同样可以选择第八项操 作,检测是否成功删除了景点。如果您想进行“增加道路”操作
21、,您可以输入数字6',然后回车,系统将会提示您输入增加道路所连接的两个景点的名称,输入两景点名称后回车,然后系统又会提示输入增加道路的长度,输入后回车,这时增加 道路操作也就完了。用户如果想要检查道路是否增加成功可以进行“最短路径查询”操作。如果您想进行“删除道路”操作,您可以输入数字7',然后系统就会提示您输入删除道路所连接的两景点的名称,输入名称后回车即可,当然,如果您想检测删除是否成功您可以选择“最短路径查询”操作。备注:经过测试,本程序的所有操作都能正常执行,您可以选择性的对他进行操作,同时也可以混合着操 作,混合操作是检测错误的最好的一个方法。5,测试数据及测试结果:
22、菜单显示为:*菜*1, 相关信息查询2, 最短路径查询3, 修改景点信息4, 增加景点5, 删除景点6, 增加道路7, 删除道路8, 浏览所有景点名称*请选择您想进行的操作:8东区 博物馆主楼 图书馆西体育馆 北大门东湖请选择您想进行的操作:1请输入您所想要查询的景点的名称:博物馆您输入的景点的名称是:博物馆您输入的景点的代码为:11您输入的景点的相关信息有:有各种化石请选择您想进行的操作:2请输入你要查询的两景点的名称:东区东湖隧道 北综北体育馆最短路径为:108从东区点到东湖景点的最短路径为:东区一一 主楼一一 西体育馆一一 隧道一一 北大门一一 东湖请选择您想进行的操作:3您想修改的景点
23、的名称为:隧道您输入的景点的名称是:隧道您输入的景点的代码为:15您输入的景点的相关信息有:自主修建您想修改什么信息?1,名称;2,代号;3,信息简介:1请输入要修改的的景点的新名称:地大隧道请选择您想进行的操作:8东区 博物馆 主楼 图书馆 西体育馆地大隧道东湖请选择您想进行的操作:4请输入增加节点的 名称,代号,信息简介: 北一楼34教师办公室请选择您想进行的操作:1请输入您所想要查询的景点的名称:北一楼您输入的景点的名称是:北一楼您输入的景点的代码为:34您输入的景点的相关信息有:教师办公室请选择您想进行的操作:5请输入您要删除景点的名称:北一楼请选择您想进行的操作:8东区 博物馆 主楼
24、 图书馆 西体育馆地大隧道北综北体育馆北综北体育馆北大门北大门东湖请选择您想进行的操作:6输入您要增加的道路链接的两个景点名称:东区北综输入您要增加的道路的长度:50请选择您想进行的操作:2请输入你要查询的两景点的名称:东区北综最短路径为:50从东区点到北综景点的最短路径为:东区 北综请选择您想进行的操作:7输入您要删除的道路链接的两个景点名称:东区北综请选择您想进行的操作:2请输入你要查询的两景点的名称:东区北综最短路径为:103从东区点到北综景点的最短路径为:东区> 主楼>西体育馆> 地大隧道> 北大门> 北综6,源程序清单:school.cpp程序源文件Ad
25、jMGraph.h/图的相关操作头文件AdjMGraphCreat.h/创建图的头文件SeqList.h线性表操作头文件Floyd.h/Floyd算法头文件Operati on.h/自己所定义的一些操作的头文件In quiry.h/查询信息包含的头文件/详细school.cpp程序源文件#i nclude <stdio.h>#in clude <stri ng.h>#i nclude <malloc.h>#defi ne MaxSize 20/线性表的最大数组空间#defi ne MaxVertices 20景点个数所允许的最大值#defi ne MaxWe
26、ight 1000/无穷边权值#i nclude "Floyd.h"#i nclude "AdjMGraphCreat.h"#i nclude "In quiry.h"AdjMGraph G;#i nclude "Operatio n.h"void mai n()初始景点信息DataType a="东区",10,"研究生院","博物馆",11,"有各种化石","主楼",12,"学校的标志建筑" ,
27、"图 书馆",13,"藏书50万册","西体育馆",14,"主要供西区学生使用","隧道",15,"自主修建","北综",16,"北区标志楼","北体育馆",17,"主要供北区学生使用 ","北大门",18,"外岀通道","东湖",19," 武汉最美的湖";邻接矩阵的表示RowColWeightrcw=0,1,20,0
28、,2,30,0,3,35,1,0,20,1,3,20,2,0,30,2,3,15,2,4,30,3,0,35,3,1,2 0,3,2,15,3,4,30,4,2,30,4,3,30,4,5,10,5,4,10,5,6,35,5,8,8,6,5,35,6,7,20,6,8,25,6,9,5,7,6,20,7,8,10,8,5,8,8,6,25,8,7,10,9,6,5;int n=10,e=28;景点数与边数Creat(&G,a,rcw, n,e);/ 构造图men u();/详细Floyd.h头文件void Floyd( int costMaxVertices,i nt n,i nt
29、weightMaxVertices,i nt pathMaxVertices)初始化int i,j,k;for(i=0;i< n;i+)for(j=0;j< n;j+)weightij=costij;pathij=-1;n次递推for(k=0;k <n ;k+)for(i=0;i <n ;i+)for(j=0;j< n;j+)if(weightij>weightik+weightkj)weightij=weightik+weightkj;pathij=k;/详细Inquiry.h 头文件void In formatio n(AdjMGraph G, char
30、 sce nery)int i;break;printf("您所查询的景点不在我们所提供的范围内!nn");void Path(AdjMGraph G,char sce neryn ame, char sce neryn ame1)int i,j,k ,n, m,cou nt=O;int weightMaxVerticesMaxVertices,pathMaxVerticesMaxVertices;int valueMaxVertices;j=i;k=i;Floyd(G.Edge ,n, weight,path);m=pathjk;printf(“ 最短路径为:%dn&qu
31、ot;,weightjk);if(m=-1)printf("从 s 点到 s 景点的最短路径为:n",sceneryname,scenerynamel);prin tf("%s>%sn",sce neryn ame,sce neryn ame1);elsewhile(m!=-1)valuecou nt=m;if(j<k) k=m;else j=m;m=pathjk;cou nt+;printf("从 %s 点到 %s 景点的最短路径为:n",sceneryname,sceneryname1);pri ntf("%
32、s>",sce neryn ame);if(jvk)for(i=cou nt-1;i>=O;i-)prin tf("%sn",sce neryn ame1);elsefor(i=0;i<cou nt;i+)prin tf("%sn",sce neryn ame1);/详细Operation.h头文件void men u();/查询景点信息的函数void In formati on 1()char sce neryn ame20;printf(“请输入您所想要查询的景点的名称:“);sca nf("%s",s
33、ce neryn ame);In formati on(G ,sce neryn ame);men u();/查询最短路径的函数void Path1()char sce neryn ame20,sce neryn ame120;printf("请输入你要查询的两景点的名称:“);sca nf("%s%s",sce neryn ame,sce neryn ame1);Path(G,sce neryn ame,sce neryn ame1);men u();pri ntf("n");/修改景点信息的函数void Modify()char sce n
34、eryn ame20;int i,x;printf(“您想修改的景点的名称为:");sca nf("%s",sce neryn ame);In formati on( G,sce neryn ame);printf("您想修改什么信息? 1,名称;2,代号;3,信息简介:");sca nf("%d", &x);if(x=1)pri ntf("请输入要修改的的景点的新名称:“);break;if(x=2)pri ntf("请输入要修改的的景点的新代号:“);break;if(x=3)printf(&
35、quot;请输入要修改的的景点的新信息简介:“);break;men u();/增加景点的函数void AddVertic()int i,k;DataType ver;printf("请输入增加节点的名称,代号,信息简介:n");sea nf("%s%d%s",ver .n ame,&(ver.code),ver.i ntroducti on);if(k!=i)G.Edgeki=MaxWeight;G.Edgeik=MaxWeight;else G.Edgeki=0;men u();void DeleteVertic()DataType x;char n ame20;int i,k;printf("请输入您要删除景点的名称:“);sca nf("%s", name);k=i;ListDelete(&(G.vertices),k, &x);if(k!=i)G.Edgeki=MaxWeight;G.Edgeik=MaxWeight;else G.Edgeki=0;men
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版特许经营权授予协议
- 买卖协议书汇编六篇
- 2024年度砸墙工程设计与施工监理合同3篇
- 2024年生产协作合同3篇
- 2024年版食堂厨房管理服务合同3篇
- 活动计划模板集锦五篇
- 大学生学习计划15篇
- 收购合同汇编10篇
- 对甲氧基苯甲醛项目商业计划书
- 学校后勤干事岗位职责总结
- 人教版(2024)八年级上册物理期末测试卷(含答案)
- 灯具行业采购工作总结
- 大学写作智慧树知到期末考试答案章节答案2024年丽水学院
- NB-T31022-2012风力发电工程达标投产验收规程
- 苏教版六年级上册科学期末测试卷带答案
- 中式婚宴主题宴会设计方案策划(2篇)
- 媒介与性别文化传播智慧树知到期末考试答案章节答案2024年浙江工业大学
- 我会举手来发言(教案)2023-2024学年心理健康一年级
- 形势与政策中国式现代化论文1500字
- 应急预案监理实施细则
- 基于英语学习活动观的高中英语课堂教学实践
评论
0/150
提交评论