数据结构旅游区导航图课程设计.docx
《数据结构旅游区导航图课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构旅游区导航图课程设计.docx(57页珍藏版)》请在课桌文档上搜索。
1、数据结构旅游区导航图课程设计题目旅游区导游图专业计算机科学与技术班级(2)班学生向13旅游区导游图题目内容问题描述:设某个旅游区共有n个旅游景点(n10),每个旅游景点都与相邻的m个旅游景点(mN2,mvexnum=O;G-arcnum=O;/*初始化顶点数、边数*/return(G);ALGraph*Init_ALGraph()/*图的初始化*/ALGraph*G;G=(ALGraph)malIoc(sizeof(ALGraph);G-vexnum=O;G-arcnum=O;/*初始化顶点数*/return(G);图中顶点定位的函数,推断顶点是否重复输入了intLocateVex(MGrap
2、h*G,charvp)*图中顶点的定位,若图中有顶点vp,返回其在顶点数组的下标值*/for(k=0;kvexnum;if (G-vexsk=vp)return(k);往图中增加顶点的函数voidAddVertex(MGraph*G,charvp)结束/*往图的顶点数组中增加顶点*/intif(G-vexn三=MAXVEX)Printf(图中顶点数已达到最多!n);else(if(LocateVex(G,vp)=-1)(k=G-vexnum;G-vexsG-vexnum+=vp;for(j=0;jvexnum;j+)(G-adjjk=infinity;G-adjkj=infinity;*是带权
3、的有向图或者无向图*/往图的邻接矩阵中添加边(弧)voidAddArc(MGraph*G,ArcType*arc)/*往图的邻接矩阵中添加边(弧)/(intk=0,j=0;R=LocateVex(G,arc-vexl);J=LocateVex(G,arc-vex2);if(k=-lIIj=-l)Printf(边或者弧的顶点不存在,错误!n);elseG-arcnum+;G-adjkj=arc-ArcVal;G-adjjk=arc-ArcVal;/是无向图或者带权的无向图,需对称赋值/输出图的顶点矩阵与邻接矩阵voidoutput_graphic(MGraph*G)*输出图的顶点矩阵与邻接矩阵*
4、/(intk,j;Printf(图的顶点如下:);for(k=0;kvexnum;k+)printf(%4c”,G-vexsk);printfCnn*);Printf(图的邻接矩阵如下:n*);for(k=0;kvexnum;k+)for(j=0;jvexnum;j+)if(G-adjkj=INFINITY)以邻接矩阵作为图的存储结构建立图MGraph*create_graph()/*以邻接矩阵作为图的存储结构建立图*/(charinchar100,enchar100,fvex,Ivex;intcount=0;intweightMGraph*G;ArcType*arc;Printfc首先进行图
5、的初始化!nn);G=(MGraph*)malloc(sizeof(MGraph);G=Init_MGraph()arc=(ArcType*)malloc(sizeof(ArcType);printf(*n请以(顶点,顶点,权值)的形式输入图的边(或者弧),第一个顶点是?表示结束:n*);while(l)(scanf(*%s*,inchar);fvex=inchar0;/*输入第一个顶点,?结束*/if(fvex=三,?)break;elseAddVertex(G,fvex);scanf(*%s*,enchar);lvex=encharO;AddVertex(G,lvex);scanf(*%d
6、*,&weight);*输入第二个顶点与权值*/arc-vexl=fvexarc-vex2=lvex;arc-ArcVal=weight;AddArc(G,arc);printf(*n请继续输入下一条边(或者弧)!n);)return(G);将邻接矩阵g转换成邻接表GALGraph+MGraphToALGraph(MGraph*g,ALGraph*G)(inti,j,n=g-vexnum;11为顶点数ArcNode*p;G=(ALGraph*)malloc(sizeof(ALGraph);G-arcnum=g-arcnum;G-vexnum=g-vexnum;for(i=0;ivexnum;i
7、+)G-AdjListi.firstarc=NULL;for(i=O;i=0;j)if(g-adjij!=INFINITY)邻接矩阵的当前元素不为(P=(ArcNode*)malloc(sIzeof(ArcNode);创建一个结点*pG-AdjListj.data=g-vexsj;p-adjvex=g-vexsj;p-info=g-adjij;p-nextarc=G-AdjListi.firstarc;将*p链到链表后G-AdjListi.firstarc=p;returnG;邻接链表的输出voidoutput_graphic_c(MGraph*g,ALGraph*G)(inti;ArcNod
8、e*p;for(i=0;ivexnum;i+)(printf(%c”,G-AdjListi.data);p=G-AdjListi.firstarc;whiIe(p!=NULL)(printf(%s,-;printf(%c,%d)”,p-adjvex,p-info);p=p-nextarc;printfCnn*);相邻景点查询并输出voidoutput_Find_ALGraph(ALGraph*G)/*相邻景点查询并输出*/i11tj;ArcNode*p;PrintfC请输入你要查询的景点(下标值):n);scanf(*%d*,&j);p=G-AdjListj.firstarc;while(p)
9、(Printf(景点%c到景点%c的距离是%d(该两个景点之间有直接的道路相通)n”,G-AdjListj.data,p-adjvex,p-info);p=p-nextarc;景点路线查询:假设关于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。voidDijkstra_One(ALGraph*G,MGraph*g,intv,intdistance,intpre)/带权图G从顶点v到其他定点的最短距离distance与最短路径前驱结点的下标preintw;intS30,i,j,k,p,min;Printf(你所要开始查询的景点是:cn”,G-AdjLis
10、tvO.data);for(i=0;ivexnum;i+)(distancei=g-adjvi;Si=0;if(distanceiINFINITY)prei=v;elseprei=-l;SvO=l;顶点v已加入到集合S中for(i=0;ivexnum;i+)(min=INFINITY;for(j=0;jvexnum;j+)(if(!Sj&distancejmin)min=distancej;k=j;Sk=l;/将找到的顶点加入到集合S中for(w=0;wvexnum;w+)/修改集合T中顶点的距离值if(!Sw&distancewdistancek+g-adjkw)distancew=dist
11、ancek+g-adjkw;prew=k;Printf(查询结果:n);for(j=0;jvexnum;j+)输出结果if(prej!=-l)(Printf(从景点c到景点c”,G-AdjListvO.data,g-vexsj);p=prej;Printf(的最短距离是:%d*,distancej);PrintfC途中通过的景点有:);while(p!=-l)(printf(%c*,g-vexsp);p=prep;printf(*n*);elseif(j!=v)Printf(n%c到c:nopath*,g-vexsj,g-vexsv);景点路线综合查询:关于该旅游区的任意两个景点,找出它们之间
12、的最短简单路径及距离。voidDijkstra_Two(ALGraph*G,MGraph*g,intv,intdistance,intpre)/带权图G从顶点v到其他定点的最短距离distance与最短路径前驱结点的下标preintw;intS30,i,j,k,p,min,d;Printf(“你所要开始查询的开始景点是:cnn,G-AdjListv.data);for(i=0;ivexnum;i+)(distancei=g-adjvi;Si=0;if(distanceiINFINITY)prei=v;elseprei=-l;SvO=l;顶点v已加入到集合S中for(i=0;ivexnum;i+
13、)Diin=INFINITY;for(j=0;jvexnum;j+)if(!SjAAdistancejmin)(min=distancej;k=j;Sk=l;/将找到的顶点加入到集合S中for(w=0;wvexnum;w+)/修改集合T中顶点的距离值if(!SwAAdistancewdistancek+g-adjkw)(distancew=distancek+g-adjkw;prew=k;Printf(输入你要查询的另外一个景点(下标值):);scanf(*%d*,&d);Printf(你要查询的另外一个景点是:cn”,g-vexsd);PrintfCn查询结果:n);输出结果if(pred!
14、=-l)(Printf(从景点c到景点c,G-AdjListvO.data,g-vexsd);p=pred;Printf(的最短距离是:%d*,distanced);PrintfC途中通过的景点有:);while(p!=-l)printf(%c*,g-vexsp);p=prep;最小的路径长度distancew是否大于distancew+边adjkw的值从VO出发到W的最短距离distancew=从VO出发到W的最短距离distancek+边adjkw的权值最佳旅游路线确定:假设该旅游区的入口也是出口,请确定一条最佳的旅游线路,该线路务必通过所有的旅游景点(有些景点能够重复通过)且走的路最短。
15、voiddfs_path(ALGraph*g,intsrc,intcur,intvis,GPath*cur_path,GPath*min_path)(if(vissrc)(if(cur-path-count=g-vexnum)(if(cur_path-valuevalue)(memcpy(min_path,cur_path,sizeof(GPath);/*由CUr_Path所指内存区域复制SiZeOf(GPath)个字节到min,path所指内存区域*/return;return;ArcNode*node=g-AdjListcur.firstare;for(;node!=NULL;node=n
16、ode-nextarc)/起始条件为node=g-AdjListcur.firstarc*/charadj=node-adjvex;intIndex=LocateVex(g,adj);if(visindex=0)cur_path-vertexcur_path-count+=index;cur_path-value+=node-info;visindex=l;dfs_path(g,src,index,vis,cur_path,min_path);cur_path-count;cur-path-value-=node-info; visindex=O;voidbest_path(ALGraph*g
17、,intsrc)(intvisMAXVEX;memset(vis,0,sizeof(vis);GPathcur_path,min_path;memset(&cur_path,0,SiZeOf(GPath);/*将cur_path所指向的某一块内存中的每个字节的内容全部设置为O指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向CUr_Path的指针。*/memset(&min_path,O,SiZeof(GPath);/*将min_path所指向的某一块内存中的每个字节的内容全部设置为O指定的ASCII值,块的大小由第三个参数指定,这个函数通常为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 旅游区 导航 课程设计

链接地址:https://www.desk33.com/p-1027637.html