数据结构课程设计报告(校园导游系统)附有源代码
校园导游程序-数据结构与算法课程设计报告
合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程数据结构与算法课程设计名称校园导游程序学生姓名张传乐学号0804012011专业班级计算机科学与技术08级(2)班指导教师王昆仑张贯虹2010年6月题目:用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
要求:(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
选作内容:求多个景点的最佳(最短)游览路径。
一:问题分析和任务定义此程序需完成如下要求:用无向网表示所在学校的校园景点平面图,要做到可以查询各景点的相关信息,查询任意两个景点间的最短路径,查询图中任意两个景点间的所有路径。
实现本程序需要解决的几个问题:1,校园无线网应采用什么存储方式来存储 2,对大量信息的输入怎样处理。
3,Dirjstra 最短路径算法实现过程 4,所有路径的算法实现下图为合肥学院南区平面图:图1:校园拓扑图灯光球场南门五三 一栋主楼六四 二栋 转盘东门礼堂 操场欲求任意两点之间的最短路径,要将Dirjstra算法稍加改变一下,因为Dirjstra算法是求任意一点到其他所有点的最短路径,而本题只要求求任意两点之间的最短路径,故在找到要到的另一点后就可停止算法,跳出循环了。
在求任意两点间所有路径的函数中,在邻接表存储图中,要采用递归的思想求解两点间所用路径,从一点出发,在找到要找的另一点后,输出走过的路径path,并通过return跳出本次递归函数,继续寻找,知道所有的情况都被寻找过为止。
二、概要设计和数据结构选择对合肥学院校园平面图用邻接表存储,由于校园的景点之间的路较少,故如用邻接矩阵存储的话,该矩阵就是一个稀疏矩阵,这样就会造成存储空间的极度浪费。
故采用邻接矩阵存储对存储空间上就会不会造成太大的浪费了。
数据结构(C语言版)实验报告 (校园导游咨询)
《数据结构与算法》实验报告一、需求分析【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。
【测试数据】由读者根据实际情况指定。
【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。
顶点和边均含有相关信息。
【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
二、概要设计1)抽象数据类型定义描述#include<iostream>using namespace std;const int MaxSize=18;const int INFINITY=65535;//最大值无穷class direction;template <class T> class MGraph;template <class T>class VertexNode//定义景点结点,存储景点信息{friend class MGraph<T>;public:int vex;//景点名称T vexname;//景点名称T vexinf;//景点信息direction dir;//存放景点方位信息的direction类的dir。
};class direction{public:int ln;//存放在方向图中的横坐标,表示东西int col;//存放在方向图中的纵坐标,表示南北};template <class T>class MGraph//定义无向图的邻接矩阵{public:MGraph();//构造函数,初始化具有n个顶点的图void printvexname();//显示所有景点及景点代号void printvexinf(int i);//显示代号为i景点的名称及信息void printroad(int i,int j);//显示景点i~j的最短路径方案信息void printdir(int i,int j);//显示景点i到j的方向信息,如“向东100m,向南200m”VertexNode<T> adjlist[MaxSize]; //存放景点全部信息的景点类数组int vertexNum,arcNum; //图的顶点数和边数void Root(int p,int q);//递归寻找pq间的最短路径int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度int Line[MaxSize];//Line存放路径int kkk;//在floyed算法中,做Line[]数组的标记private:T vertex[MaxSize]; //存放图中顶点的数组int arc[MaxSize][MaxSize];//存放图中边的数组};2)功能模块设计(如主程序模块设计)int funcchoice()//系统功能选择页面{int choice;cout<<"=============================================================="<<endl;cout<<" 欢迎进入校园导游咨询平台"<<endl;cout<<" 1--显示校园所有景点信息"<<endl;cout<<" 2--查询校园景点信息"<<endl;cout<<" 3--问路查询系统"<<endl;cout<<" 4--退出导游资讯平台"<<endl;cout<<"=============================================================="<<endl;cout<<"请输入要选择的功能号:";cin>>choice;return choice;}3)模块层次调用关系图三、详细设计//程序的头文件#include<iostream>#include<iomanip>#include"guide.h"using namespace std;template <class T>MGraph<T>::MGraph()//a[]为景点代号,b[]为景点名称,c[]为景点信息,d[]为景点方位信息的横坐标,e[]为景点方位信息的纵坐标,s[]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组arc[][]{i nt s[]={0,1,0,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,4,2,0,0,0,0,0,2,3,0,0,0,0,0,2,3,1,0,0,0,2,0,2,0,0,2,0,4,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};i nt a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};c har* b[]={"南门","实验楼","南图","大活","睿思楼","大礼堂","南4教","知行楼","国交楼","南3教","南2教","南1教","北图","北3教","北4教","北2教","北1教","北门"};c har* c[]={"南校区正门","物理实验楼","南校区图书馆","大学生活动中心","教师办公楼、医务室及留学生公寓","大礼堂,用于举办各种文艺演出","南校区第4教学楼","实习基地,计算机房等","国际交流中心,教职工餐厅","南校区第3教学楼","南校区第2教学楼","南校区第1教学楼","北校区图书馆","北校区第3教学楼","北校区第4教学楼","北校区第2教学楼","北校区第1教学楼","北校区正门"};i nt d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8};i nt e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};i nt i,j;v ertexNum=18;a rcNum=30;f or(i=0;i<vertexNum;i++){adjlist[i].vex=a[i];adjlist[i].vexname=b[i];adjlist[i].vexinf=c[i];adjlist[i].dir.ln=d[i];adjlist[i].dir.col=e[i];}f or (i=0; i<vertexNum; i++)//初始化邻接矩阵for (j=0; j<vertexNum; j++)arc[i][j]=arc[j][i]=s[(i*(i+1))/2+j]; //根据s[]的对称性,将一维数组中的数据赋给二维数组arc[][]}template<class T>void MGraph<T>::printvexname(){i nt i;f or(i=0;i<vertexNum;i++)cout<<adjlist[i].vex<<" "<<adjlist[i].vexname<<endl;;}template<class T>void MGraph<T>::printvexinf(int i){c out<<i<<" "<<adjlist[i].vexname<<":"<<adjlist[i].vexinf<<endl;}template<class T>void MGraph<T>::printdir(int i,int j){i nt dx,nb;//临时存放i与j之间的南北东西关系 j在i的哪边??d x=adjlist[j].dir.col-adjlist[i].dir.col;n b=adjlist[j].dir.ln-adjlist[i].dir.ln;i f(dx>0)//即j在i的东边cout<<"向东"<<dx*100<<"m,";e lsecout<<"向西"<<dx*(0-100)<<"m,";i f(nb>0)//即j在i的南边cout<<"向南"<<nb*100<<"m";e lsecout<<"向北"<<nb*(0-100)<<"m";}template<class T>void MGraph<T>::Root(int p,int q){i f (Path[p][q]>0){Root(p,Path[p][q]);Root(Path[p][q],q);}e lse{Line[kkk]=q;kkk++;}}template<class T>void MGraph<T>::printroad(int i,int j){i nt p,q,m,k,item1,item2;f or(p=0;p<vertexNum;p++)for(q=0;q<vertexNum;q++)Dist[p][q]=arc[p][q];//邻接矩阵赋值f or(k=0;k<vertexNum;k++)for(p=0;p<vertexNum;p++)if (Dist[p][k]>0)for(q=0;q<vertexNum;q++)if (Dist[k][q]>0)if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q)){Dist[p][q]=Dist[p][k]+Dist[k][q];Path[p][q]=k;}c out<<"\n=====================================================\n";c out<<"从"<<adjlist[i].vexname<<"到"<<adjlist[j].vexname<<"的最短路径为:"<<endl;c out<<adjlist[i].vexname;k kk=2;R oot(i,j);i tem2=Line[2];c out<<"-->";p rintdir(i,item2);c out<<"-->"<<adjlist[item2].vexname;f or(m=3;m<=kkk-1;m++){item1=Line[m];cout<<"-->";printdir(item1-1,item1);cout<<"-->"<<adjlist[item1].vexname;}c out<<endl;c out<<"\n=====================================================\n";}========================以下为main.cpp文件中主函数的实现========================== #include<iostream>#include"guide.cpp"using namespace std;int funcchoice()//系统功能选择页面{i nt choice;c out<<"=============================================================="<<endl;c out<<" 欢迎进入校园导游咨询平台"<<endl;c out<<" 1--显示校园所有景点信息"<<endl;c out<<" 2--查询校园景点信息"<<endl;c out<<" 3--问路查询系统"<<endl;c out<<" 4--退出导游资讯平台"<<endl;c out<<"=============================================================="<<endl;c out<<"请输入要选择的功能号:";c in>>choice;r eturn choice;}void main(){M Graph<char*> mg;i nt funcchoice();i nt fc;w hile(1){fc=funcchoice();if(fc==1){int i;for(i=0;i<mg.vertexNum;i++)mg.printvexinf(i);}else if(fc==2){int i;mg.printvexname();cout<<endl<<"请输入所要查询景点代号:";cin>>i;mg.printvexinf(i);}else if(fc==3){int i,j;mg.printvexname();cout<<"请输入两景点代号(我们将把最短路线反馈予您):";cin>>i>>j;mg.printroad(i,j);}else if(fc==4)break;elsecout<<"输入有误,请重新输入!"<<endl;}}if调试分析遇到的问题及解决的办法:在调试过程中,最常见到的问题有以下几种:1、忘记调用函数类模块template<class T>,有些类中或者函数中涉及函数类模块的调用,但忘记标注会导致编译错误。
西安邮电大学-(数据结构)校园导游系统课程设计报告
void findweight(adjlist *G,int m,int n);
seqstacki w,*s=&w; seqstackpath z; int vnum=13; main() { adjlist q,*G=&q; initstack(s); initstack1(&z); readnet(G);//读出文件 Map(); //printf("%d\n",G->vertex[4].firstarc->nextarc->nextarc->weight); menu(G); } void menu(adjlist *G) { int choice; Map(); printf("\n ┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳ \n"); printf("\n ┣┃ ●① ◣查看景点信息 ┃┫"); printf("\n ┣┃ ●② ◣查寻两景点之间的路径 ┃┫"); printf("\n ┣┃ ︻┳═一 ●③ ◣退出系统 ┃┫"); printf("\n ┻┻┻┻┻┻┻┻︷︷︷︷︷︷︷︷︷︷︷︷︷︷︷┻┻┻┻┻┻┻ \n"); printf("\n\t\t你想选择?请选择(1-3):" ); scanf("%d",&choice); while(choice<1||
①:学校简易的俯视图。 ②:各个景点的简单介绍。 ③:任意两景点之间的所有路径。 ④:任意两景点之间的最少中转景点路径。 ⑤:任意两景点之间的带权路径长度。
三、需求分析
Calculate() Main(); Init(); Menu(); Intro Finallpath(); Byebye(); Search(); Finfallway Shortestway() Niceway() Init();初始化两个顺序栈 Menu();进行选择的模块函数; Intro();景点介绍函数; Search();判断是否有此编号的景点; Findallpath();找路径函数; Findallway();找任意两个景点之间的所有路径;(存在栈里 面)
数据结构校园导航系统课程设计报告
《校园导航系统》课程设计报告姓名:蒋小文学号:110236100123 班级:1班专业:网络工程指导教师:唐轶媛蒋荣萍时间:2012年7月5日信息科学与工程学院目录摘要 (1)1.目的 (2)2.要求 (2)3.题目 (2)4.任务 (2)1).需求分析 (3)2).概要设计 (4)3).详细设计 (5)4).调试分析 (8)5.课设总结 (18)6.附录源代码 (19)1.目的数据结构是计算机专业的核心课程,是一门实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C (C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。
2.要求2.1 课程设计时间为2周;2.2 设计语言C(C++)不限;2.3 课余时间完成源程序和课程设计报告等文档书写工作,上机时间只能做调试工作。
上机时带上源程序、数据结构教材、C语言教材。
2.4 上机任务(1)选择并定义合适的数据结构;(2)根据程序所要完成的基本要求,设计出完整的算法;(3)设计出主程序(main函数),使其成为完整的程序。
2.5 上机时间:上午8:30--11:30,下午3:00--5:303.题目题目:校园导航系统设计一个校园导游程序,后台操作:3.1、操作员信息管理如修改密码等3.2、能根据学校的规模进行添加景点信息、修改景点信息等功能,3.3、若临时有交通管制,能进行交通管制的设置和撤销(如某某时间段那条路进行那个方向的交通管制等)3.4、前台为来访的客人提供各种信息查询服务:3.4.1、设计学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
3.4.2、为来访客人提供图中任意景点相关信息的查询。
3.4.3、提供途中任意景点问路查询,即求任意两个景点间的一条最短的简单路径。
数据结构-校园导游系统
数据结构-校园导游系统课程设计论文(附有代码!)题目:校园导游咨询学院:计算机科学与工程学院专业:计算机科学与技术姓名:学号:指导教师:2014年9月22日摘要桂林众山环绕,风景优美,加之近年来校园环境也得到不断地改善,来访校园的游客逐渐增加,为了方便众多游客对校园景点的参观,需要给来访人士提供校园导游咨询服务,利用计算机建立一个便利的咨询系统可以很好地解决这个问题。
在本设计实验中,我所采用的是邻接矩阵作为数据的存储结构,用不同的功能模块对两地距离和校园道路信息进行编辑。
当游客来访时,系统能根据用户输入的景点代号查询景点信息,提供任意两个景点间的最短路径查询,并能查询校园内的交通信息,方便游客访问。
工作人员还可以为校园更新景点以及路径信息。
本文将简单介绍该系统的开发背景,详细介绍系统的主要设计思路,函数的建立和使用过程,该系统功能的实现方式和实现结果,以及对所遇到问题的分析解决,最后对该系统进行总结描述。
关键词:校园导游咨询;C++;数据结构;最短路径;查询;目录引言 (1)1系统概述 (1)2需求分析 (1)2.1系统需求 (1)2.2开发环境 (2)3详细设计 (3)3.1系统结构 (3)3.2数据结构设计以及数据的初始化 (4)3.2.1 图结构设计 (4)3.2.2 数据的初始化 (4)3.3查询模块的详细设计 (5)3.3.1 查询模块功能子函数设计 (5)3.4更新功能模块详细设计 (7)3.4.1 更新模块功能子函数设计 (8)4所遇到的问题和分析解决 (10)5系统特色及关键 (11)6结论 (12)参考文献 (13)引言随着计算机科学技术的不断提高,计算机依靠其强大的功能已经成为人们生活中不可缺少的一部分,计算机能解决人类生活中的大部分问题,为人类文明和社会进步做出了巨大贡献。
桂林是一个全世界著名的旅游城市,近几年来旅游业得到了飞速的发展,来自各个国家各个城市的游客给城市带来了巨大的经济效益。
(完整word版)数据结构课程设计校园导游咨询
9、校园导游咨询问题描述:设计一个校园导游程序,为来访的客人提供各种信息查询服务。
基本要求:⑴设计华东交通大学的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,⑵存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
⑶为来访客人提供图中任意景点相关信息的查询。
⑷为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
#include <stdio.h>#define MAXV 100 //最大顶点个数#define INF 32767 //用32767表示∞#include <stdlib.h> //调用函数system改变字体颜色的头文件typedef int InfoType;#define MAXV 100 //最大顶点个数//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号InfoType info; //顶点其他信息} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵int vexnum,arcnum; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph;void ecjtumap()//建立华东交通大学地图{ printf("\t|-------------------------------------------------------------|\n");printf("\t| |\n");printf("\t| |\n");printf("\t| ---------- |\n");printf("\t| ==============================| 国防生宿舍| |\n");printf("\t| 。
校园导游咨询系统源代码
#include<stdlib.h>//standard library标准库头文件#include<stdio.h>//标注输入输出函数头文件#include<string.h>//字符函数头文件#define MAX 10000 //定义路程最远距离符号常量无穷大#define MAX_VERTEX_NUM 10//定义的景点/顶点数量符号常量最大顶点数10个typedef struct //定义一个结构体用于表示路径{int adj; //路径长度权值}Ar,Ad[10][10];//起点和终点变量名typedef struct //定义一个结构体用于存放景点信息{char name[30];//景点名int num;//景点编号char introduction[100];//景点介绍景点信息变量名}infotype;//typedef struct//用来定义一个图{infotype vexs[10];Ad arcs;int vexnum,arcnum;}MGraph;MGraph b;MGraph InitGraph()//初始化图形{MGraph G;int i;int j;G.vexnum=10;G.arcnum=10;for(i=0;i<G.vexnum;i++)G.vexs[i].num=i;//用字符串复制把各个景点的信息传递给指针瑳捲祰?瘮硥孳崰渮浡?老校区宿舍);瑳捲祰?瘮硥孳崰椮瑮潲畤瑣潩?这里有夺命坡,冬天来这里一定要小心脚下);瑳捲祰?瘮硥孳崱渮浡?二教);瑳捲祰?瘮硥孳崱椮瑮潲畤瑣潩?同学们日常上课大多数都在这);瑳捲祰?瘮硥孳崲渮浡?石头楼);瑳捲祰?瘮硥孳崲椮瑮潲畤瑣潩?石头楼是我国著名建筑大师梁思成在美国宾西法尼亚大学建筑系毕业回国之后设计的第一件作品);瑳捲祰?瘮硥孳崳渮浡?主教);瑳捲祰?瘮硥孳崳椮瑮潲畤瑣潩?一座集实验教学于一体的教学楼,但是我没在里面上过课);瑳捲祰?瘮硥孳崴渮浡?媒体楼);瑳捲祰?瘮硥孳崴椮瑮潲畤瑣潩?信息院有一部分的上机课是在这里上的,在这里你还有可能艳遇到媒体系的美女呦);瑳捲祰?瘮硥孳崵渮浡?图书馆);瑳捲祰?瘮硥孳崵椮瑮潲畤瑣潩?自从新校区图书馆建成后这里就变成了纯粹的自习室,不过这里冬天真的很暖);瑳捲祰?瘮硥孳崶渮浡?专家招待所);瑳捲祰?瘮硥孳崶椮瑮潲畤瑣潩?这里是招待一些贵宾的地方,有些留学生也住在这儿);瑳捲祰?瘮硥孳崷渮浡?学术交流中心);瑳捲祰?瘮硥孳崷椮瑮潲畤瑣潩?这里经常会开很多高大上的会议,还会有外国友人出现在这);瑳捲祰?瘮硥孳崸渮浡?东街教学楼);瑳捲祰?瘮硥孳崸椮瑮潲畤瑣潩?这里也是一个日常上课比较多的地方,没课的时候来这里上自习也是不错的选择););校医院瑳捲祰?瘮硥孳崹渮浡?瑳捲祰?瘮硥孳崹椮瑮潲畤瑣潩?新生的体检,打疫苗都在这,而且来这里买药真的很便宜);//运用双重循环给每条边赋权值for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j].adj=MAX;G.arcs[0][1].adj=600;G.arcs[0][2].adj=600;G.arcs[0][3].adj=700;G.arcs[1][2].adj=50;G.arcs[1][4].adj=100;G.arcs[2][5].adj=150;G.arcs[2][3].adj=50;G.arcs[3][5].adj=250;G.arcs[4][5].adj=100;G.arcs[4][8].adj=450;G.arcs[5][6].adj=150;G.arcs[5][8].adj=200;G.arcs[6][7].adj=50;G.arcs[6][8].adj=100;G.arcs[6][9].adj=250;G.arcs[7][8].adj=100;G.arcs[7][9].adj=80;G.arcs[8][9].adj=50;for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj; return G;}菜单//void Menu(){欢迎来到东北电力大学printf(\*****************************************************\n); printf(\n);祝你:旅途愉快printf(\n);printf(\n);printf( 1.浏览校园全景\n);查看所有游览路线2.printf(\n);选择出发点和目的地3.printf(\n);printf( 查看各景点信息4.\n);退出系统5.printf(\n);printf(\n);printf( 回.输入编号(请选择-诚心为你服务);车结束):}查看各景点信息函数//void Browser(MGraph *G){int v;printf(\);\n);牰湩晴尨景点名称.编号.简介for(v=0;v<G->vexnum;v++) {printf(%-4d%-16s%-56s\n,G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction);}printf(\);printf(§·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽§\n);printf(§——>东\n); §printf(§\n);§————4.——————printf(§ 1.二教—————媒体楼\n); §————————┃┃┃printf(§\n); ┃§┃┃┃printf(§┃\n); §printf(§0.老校区宿舍———2.石头楼————5.图书馆————————————┃§\n);┃┃┃printf(§\n);§┃┃┃————6.专家printf(§┃\n);东街§8.招待所—————————3.主教———————┃printf(§\n);—__________/┃§┃printf(§\n);—┃§/printf(§7.学术交流\n);§校医院9.————中心.printf(§§\n);printf(§·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·∽·§\n);牰湩晴尨请按任意键继续!);printf(\);getch();}//查看所有浏览路线void ShortestPath_DIJ(MGraph * G){int v,w,i,min,t=0,x,flag=1,v0;int final[20], D[20], p[20][20];while(flag){0-9:);请输入一个起始景点编号牰湩晴尨scanf(%d,&v0);if(v0<0||v0>G->vexnum){牰湩晴尨景点编号不存在!请重新输入景点编号0-9:); scanf(%d,&v0);}if(v0>=0&&v0<G->vexnum)flag=0;}for(v=0;v<G->vexnum;v++){final[v]=0;D[v]=G->arcs[v0][v].adj;for(w=0;w<G->vexnum;w++)p[v][w]=0;if(D[v]<MAX){p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;for(i=1;i<G->vexnum;i++){min=MAX;for(w=0;w<G->vexnum;w++)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<G->vexnum;w++)if(!final[w]&&(min+G->arcs[v][w].adj<D[w])){D[w]=min+G->arcs[v][w].adj;for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}for(v=0;v<G->vexnum;v++){if(v0!=v) printf(%s,G->vexs[v0].name);for(w=0;w<G->vexnum;w++){if(p[v][w]&&w!=v0)printf(-->%s,G->vexs[w].name); t++;}晩琨??敶湸浵??ぶ??牰湩晴尨总路线长%dm\n\n,D[v]); }}//弗洛伊德算法用于求最短路void Floyd(MGraph *G){int v,u,i,w,k,j,flag=1,p[10][10],D[10][10];for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w]=0;if(D[v][w]<MAX){p[v][w]=1;p[v][w]=1;}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;i<G->vexnum;i++)p[v][w]=p[v][u]||p[u][w];}while(flag){牰湩晴尨请输入出发点和目的地的编号0-9如(* *):);scanf(%d%d,&k,&j);if(k<0||k>G->vexnum||j<0||j>G->vexnum){牰湩晴尨景点编号不存在!请重新输入出发点和目的地的编号:); scanf(%d%d,&k,&j);}if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum)flag=0;printf(%s,G->vexs[k].name);for(u=0;u<G->vexnum;u++)if(p[k][j]&&k!=u&&j!=u)printf(-->%s,G->vexs[u].name);printf(-->%s,G->vexs[j].name);牰湩晴尨总路线长%dm\n,D[k][j]);}//查询单个景点信息void Search(MGraph *G){int k,flag=1;while(flag){牰湩晴尨请输入要查询的景点编号0-9:);scanf(%d,&k);if(k<0||k>G->vexnum){牰湩晴尨景点编号不存在!请重新输入景点编号0-9:); scanf(%d,&k);}if(k>=0&&k<G->vexnum)flag=0;}printf(\);牰湩晴尨编号.景点名称.简介\n);printf(%-4d%-16s%-56s\n,G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction);printf(\);}int LocateVex(MGraph *G,char* v)/*初始条件:图G存在,v和G中顶点有相同特征*//*操作结果:若G中存在顶点v,则返回该顶点在图中位置;否则返回-1 */ {int c=-1,i;for(i=0;i<G->vexnum;i++)if(strcmp(v,G->vexs[i].name)==0){c=i;}return c;}void print(MGraph *G)//输出景点间距离{int v,w,t=0;for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){if(G->arcs[v][w].adj==MAX)printf(∞);//没有路输出无穷else printf(%-7d,G->arcs[v][w].adj);//有路输出权值和t++;if(t%G->vexnum==0)printf(\);}}//主函数void main(){ int i;b=InitGraph();//调用初始化地图函数Menu();//调用菜单函数scanf(%d,&i);while(i!=5){switch(i){case 1:system(cls);Browser(&b);Menu();break;case 2:system(cls);ShortestPath_DIJ(&b);Menu();break; case 3:system(cls);Floyd(&b);Menu();break;case 4:system(cls);Search(&b);Menu();break; default:exit(1);}scanf(%d,&i);}}。
数据结构-校园导游程序(附源码)
数据结构-校园导游程序(附源码)简介本文档旨在介绍一个校园导游程序的设计与实现。
该程序使用数据结构来管理校园地点信息,并提供导游功能,供用户查找并导航到目标地点。
文档将依次介绍相关的背景知识、程序设计原理、算法实现以及使用方法。
目录1.背景知识1.校园导游需求2.数据结构概述2.程序设计原理1.数据结构设计2.地点信息管理3.导航算法设计3.算法实现1.数据结构定义2.地点信息管理算法3.导航算法4.使用方法1.程序安装2.数据录入3.导游功能使用5.附录1.附件1:源码文件2.附件2:数据样例1.背景知识1.1 校园导游需求校园导游程序是为了帮助使用者在校园中快速找到目标地点,并提供导航功能,方便出行和参观。
该程序需要管理校园地点的信息,包括名称、位置和介绍等。
使用者可以通过程序查找地点、导航到目标地点。
1.2 数据结构概述数据结构是计算机中用来组织和存储数据的方式。
在校园导游程序中,我们需要选择适合的数据结构来存储和管理地点信息。
常用的数据结构有数组、链表、树、图等。
根据需求分析,我们可以使用图这一数据结构来表示校园地点之间的关系,方便进行导航。
2.程序设计原理2.1 数据结构设计在校园导游程序中,我们使用图这一数据结构来表示校园地点之间的关系。
每个地点可以看作图的一个节点,节点之间的边表示地点之间的连接关系。
通过构建图数据结构,我们可以方便地管理地点信息并进行导航。
2.2 地点信息管理地点信息管理是校园导游程序的核心功能之一。
我们需要设计适合的数据结构来存储地点的信息,包括名称、位置和介绍等。
通过合理的数据结构设计,可以快速地查找和修改地点信息。
2.3 导航算法设计导航算法是实现导游功能的关键。
我们需要设计算法来计算出从起点到目标地点的最短路径,并提供导航指引。
常用的导航算法有Dijkstra算法、A算法等,我们根据需求选择合适的算法进行实现。
3.算法实现3.1 数据结构定义我们使用图这一数据结构来表示校园地点之间的连接关系。
大数据结构课程设计报告材料(校园导游系统)附有源代码
课程论文(设计)2011-2012 学年第2学期课程名称:数据结构课程设计课程性质:实践课专业班级:考核方式:考查学生:学号:学时:1周教师:目录1. 作业容 (1)2. 基本思路 (1)2.1 本校10个景点 (1)2.2 图的初始化 (2)2.3 图的遍历 (2)2.4 求最短路径 (3)3.系统流程 (4)3.1 系统的简单说明 (4)3.2 系统流程图 (5)4. 系统运行效果图 (5)4.1 校园导游界面 (5)4.2 华农校园地图 (6)4.3 景点的相关信息查询 (6)4.4 任意两个景点间的最短路径 (7)4.5 退出校园导游系统 (8)5.总结 (9)6.参考文献 (10)1. 作业容设计一个校园导游程序,为来访客人提供各种信息查询任务。
基本要求:(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校各景点,存放景点名称、代号、简介信息,以边表示路权,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2. 基本思路要完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。
有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。
(4).依照景点的相关信息创建校园图。
(5).把纸质上的容,利用C++编程语言编写查找景点相关信息的程序。
(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。
(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。
为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。
数据结构课程设计报告-校园导游程序
课程设计说明书课程名称数据结构课程设计设计课题校园导游程序专业计算机科学与技术班级学号姓名完成日期课程设计任务书设计题目:校园导游程序设计容与要求:[问题描述]用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
[基本要求](1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
(4)增加、删除、更新有关景点和道路的信息。
指导教师:2016年12月20日课程设计评语成绩:指导教师:_______________年月日目录一、问题描述1二、基本要求1三、测试数据2四、算法思想3五、模块划分45.1应用函数45.2.1主函数65.2.2查询景点信息函数75.2.3查询两景点之间最短路径函数85.2.4查询两景点之间所有路径函数85.2.6删除已有的顶点和路径95.2.7修改已有的顶点和路径11六、数据结构13七、测试14八、心得26九、源程序28一、问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
二、基本要求(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
(4)增加、删除、更新有关景点和道路的信息。
三、测试数据菜单函数:依次输入:1,2,3,4,5,6,0分别对应景点信息查询,最短路径查询,所有路径查询,添加景点及路径信息,删除景点及路径信息,修改景点及路径信息,退出。
查询景点信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入编号:1按景点名称查询:输入名称:大明桥最短路径查询:输入起始景点和终点景点编号:1,7所有路径查询:输入起始景点和终点景点编号:2,8添加景点及路径信息:输入新景点序号:9输入新景点名称:南门输入新景点相关信息:充满古韵的门,适合拍照输入到其余各景点的距离:50,100,20…删除景点及路径信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入需要删除的景点编号:8修改景点及路径信息:输入:1,2分别对应修改景点信息,修改道路信息修改景点信息:输入1,2分别对应修改景点名称,修改景点描述修改景点信息:输入修改序号:1输入修改后的名称:图书馆123四、算法思想先利用CreateUDN 创建初始无向网,通过main主函数调用显示,操作功能的选择通过Menu函数输出,根据游客需求选择景点信息查询、景点之间最短路径查询、景点之间所有路径查询、添加景点信息、删除景点信息或者修改信息。
C++数据结构课程设计-校园导游咨询系统
数据结构(C++)课程设计题目: 校园导游咨询*姓名:学号:院系:专业年级:2014年7月8日目录一、设计题目 (2)二、需求分析 (2)三、概要设计 (6)四、详细设计 (11)五、调试分析 (14)六、测试结果 (14)七、附录:程序设计源代码 (21)一、设计题目校园导游咨询*二、需求分析1)运行环境(软、硬件环境)电脑型号X64 兼容台式电脑处理器英特尔第二代酷睿***************四核主板华硕P8H61-M LX (英特尔H61 芯片组)内存8 GB ( 威刚DDR3 1333MHz )主硬盘西数WDC WD10EALX-009BA0 ( 1 TB / 7200 转/分)显卡ATI Radeon HD 6700 Series ( 512 MB / ATI )显示器SGW5600 PL2208HD ( 21.7 英寸)光驱华硕DRW-24D1ST a DVD刻录机声卡瑞昱ALC887 @ 英特尔 6 Series Chipset 高保真音频网卡瑞昱RTL8168E PCI-E Gigabit Ethernet NIC / 华硕操作系统:Windows 7 Ultimate (x86) sp1编程环境:Microsoft Visual Studio 20122)输入的形式和输入值的范围内容形式范围景点代号int 自然数景点名称string 所有字符景点简介string 所有字符X坐标int 正整数Y坐标int 正整数3)输出的形式描述内容形式范围景点代号int 自然数景点名称string 所有字符景点简介string 所有字符X坐标int 正整数Y坐标int 正整数最短路径图像jpg4)功能描述以我校南汇校区部分景点、进行抽象化,生成了具有15个顶点、18条边的图,以邻接表与邻接矩阵复合形式储存在内存中,主要有以下功能:a.查询景点的信息,包括基本信息和拓展的周围节点信息;b.景点导航,给出起点、终点,规划出最短路径和风景最佳路径;c.修改景点,道路信息,包括添加景点、添加道路、修改景点功能;d.开发人员工具,包括邻接表、邻接矩阵的查看DFS深度优先遍历、BFS广度优先遍历e.显示地图,打开预制的地图文件查看5)测试数据初始地图信息:景点景点名称景点介绍X坐标Y坐标编号0 北校门学校的北入口 2 141 北图书馆学校北侧图书馆12 142 崇德楼经管学院楼26 143 奋进楼公共机房12 2826 284 北运动场具有足球场、篮球场、健身房等12 325 行政楼计算机学院楼及其他行政办公12 396 教师活动中心又称H楼,具有桌球、乒乓球、会议室、舞厅等7 雕塑校园雕塑26 398 南校门学校南入口 2 509 至诚楼办理学生事务处12 5026 5010 大礼堂学校大型文艺演出、讲座场所11 南图书馆学校南侧的图书馆12 52团委、学生会、社联所在处12 1212 大学生文化活动中心13 风帆广场绿地广场,景色优美26 5812 7014 南运动场具有足球场、篮球场、羽毛球场等距离邻接矩阵:三、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验)Site类Data:编号Code景点名称SiteName景点介绍Introduction景点X坐标景点Y坐标Operation:构造函数输入:编号,名称,介绍,X坐标,Y坐标前置条件:无动作:初始化Site类元素输出:无后置条件:无SetSite输入:编号,名称,介绍,X坐标,Y坐标前置条件:无动作:赋值Site类元素输出:无后置条件:无ArcNode类Data :邻接点下标值Adjvx指向下一个边结点的指针*nextarc;风景等级sceneLevel;距离distance;Operation:构造函数输入:Adjvx, *nextarc, sceneLevel;前置条件:无动作:初始化ArcNode类输出:无后置条件:无VertexNode类Data :节点内容vex节点首指针*firstarcOperation:无Road类Data :Site型节点1,节点2距离Distance风景等级Bool型是否是机动车道carAviliable;Operation:SetRoad构造函数输入:节点1,节点2,风景等级前置条件:存在Site对象动作:初始化Road类输出:无后置条件:无BGraph 类Data :邻接表adjlist[]Int 距离矩阵Int 风景值矩阵Operation:构造函数输入:前置条件:动作:输出:后置条件:无addSite函数输入:景点名称,景点信息,景点X坐标,景点Y坐标前置条件:顶点表已建立动作:添加邻接表顶点、修改邻接矩阵输出:无后置条件:无addRoad函数输入:景点1名称,景点2名称,风景等级前置条件:顶点表已建立动作:添加邻接表的边表,修改邻接矩阵输出:无后置条件:无ShowInfo函数输入:无前置条件:函数已初始化动作:输出当前图信息输出:顶点数、边数后置条件:无pGraph函数输入:无前置条件:函数已初始化动作:输出邻接表输出:邻接表后置条件:无pMatrix输入:无前置条件:函数已初始化动作:输出邻接矩阵输出:邻接矩阵后置条件:无searchByName输入:景点名称前置条件:图已初始化动作:搜索符合名称的节点输出:节点site型后置条件:无DFSTraverse函数输入:无前置条件:图已初始化动作:深度优先遍历输出:遍历路径后置条件:无BFSTraverse函数输入:无前置条件:图已初始化动作:广度优先遍历输出:遍历路径后置条件:无FindPath函数输入:节点1,节点2前置条件:图已初始化动作:计算最短路径输出:路径经过点、路径产长度、每一步的方向后置条件:无2)功能模块设计(如主程序模块设计)1.主程序模块:连接各种功能子模块,使用循环等待用户操作,完成程序的基本操作实现功能。
数据结构课程设计报告(校园导游系统)附有源代码(20191123003227)
图 4.3.1 景点 2 红满堂信息查询
图 4.3.2 景点 7 竹园信息查询 4.4 任意两个景点间地最短路径
根据用户地需求 , 在用户输入了起点和终点后计算出最短路径是哪一条路径 . 以下举两个例子 . 第一个例子地起点是 5 东区运动场 , 终点是 1 校史馆 . 第二个例 子地起点是 2 红满堂 , 终点是 10 黑山运动场 . 运行结果如图 4.4.1 和图 4.4.2 所 示 . 83lcPA59W9
图 4.1 校园导游节目图 4.2 华农校园地图
校园地图地查看是通过抽象化 10 个景点来用 printf( > 输入选择 1 之后弹出地界面 , 运行结果如图 4.2. HbmVN777sL
函数输出地图 , 在
图 4.2 抽象化地华南农业大学校园导游地图 4.3 景点地相关信息查询
景点地相关信息查询是通过 information( > 函数来调用输出地 , 在主菜单 那输入 2 之后 , 拿第 2 个景点红满堂和第 7 个景点竹园来当例子 , 第运行结果如 图 4.3.1 和图 4.3.2. V7l4jRB8Hs
2.2 输出 dist[j] 和 path[j] ;
2.3 修改数组 dist 和 path 。
2.4 将顶点 vk 添加到数组 s 中;
3. 系统流程
3.1 系统地简单说明 1. 创建校园图: <1)先手工画好华农地 10 个景点地草图 , 再用 C++语言输出抽象化地校园
地图 . <2)再用 C++语言定义节点个数 N,编写函数 name( >为景点赋值各类信息
为空串 . 1nowfTG4KI
数组 s[n] :存放源点和已经生成地终点 <即集合 S), 初态为只有一个源点 v.
校园导游系统课程设计报告
南京航空航天大学《数据结构》课程设计报告校园导游系统目录一、需求分析 (2)二、程序的主要功能 (2)三、程序运行平台 (2)四、数据结构 (2)五、算法设计思想及时间复杂度 (2)六、测试用例及结果 (5)七、存在的不足与对策及编程体会 (6)八、程序源代码 (6)一、需求分析南航学生家长及入学新生很需要一个导游程序,来引领他们参观和了解南航。
二、程序的主要功能1、查询各景点的相关信息2、查询任意两景点间的所有路径3、查询任意两景点间的最短路径 1、增加景点4、推荐参观路线 2、删除景点5、更新导游信息(操作需管理员密码) 3、更新道路信息6、对景点联通性的浏览(2阶矩阵表示)4、更新景点信息7、学校全景一览 5、修改管理员密码三、程序运行平台Microsoft Visual C++ 6.0四、数据结构图的邻接矩阵存储表示,栈的顺序存储表示五、算法设计思想及时间复杂度主要函数介绍:1、求两点间的所有路径:a)相关函数:void dfs(MGraph G,SqStack path,int *used,int u,int w);//深度优先遍历b)主要算法思想:栈的相关操作+深度优先搜索创建一个空栈保存路径,一个空数组保存已标记节点,首先让起点进栈,并标记为已访问,然后调用深度优先搜索,如果该顶点的相邻顶点(即与其有直接通路的顶点)未被访问过就标记为已访问,进栈,然后对它调用深度优先搜索,依次类推,直到获得所有到指定终点的路径。
c)时间复杂度:O(VE),其中V为图的顶点数目,E为图中边的数目。
2、求两点间的最短路径:a)相关函数:void ShortestPath(MGraph G,int v0,int P[][Nmax],int *D);//查询任意两景点间的最短路径void PrintShortest(MGraph G,int v1,int v2,int P[][Nmax],int *D); //输出最短路径b)主要算法思想:迪杰斯特拉算法假设起点为v0,S为已找到的从v0出发的最短路径的终点的集合,其初始状态为空集。
数据结构课程设计报告 (附有完整可运行出来的代码)
课程设计报告设计题目:公园导游图一、流程图二、程序代码#include<iostream>using namespace std;#include<stdio.h>typedef struct //定义图结构{int n; /* 图的顶点个数*/char v[100]; /* 顶点信息*/int e[100][100]; /* 边信息*/int shor; /* 最短路径信息*/}park;park *luru(park *x){int j,k;cout<<"请输入公园景点个数"<<endl;cin>>x->n;if(x->n<=0){cout<<"个数输入错误,请重新输入"<<endl;cin>>x->n;}cout<<"请输入景点名称,每个名称只允许一个字符代替"<<endl;for(j=0;j<x->n;j++)cin>>x->v[j];cout<<"请输入景点之间的路径长度,只允许整数型数值,无路径长度的输入0"<<endl;for(j=0;j<x->n;j++)for(k=0;k<x->n;k++){cout<<"请输入第"<<j+1<<"行"<<"第"<<k+1<<"列的路径长度"<<endl;cin>>x->e[j][k];}return x;}int search(park *x){char start,end,temp;int i=0,j=0,temp_1,temp1=10000;cout<<"请输入要查找的起始景点名称"<<endl;cin>>start;while(i<x->n && start!=x->v[i])i++;if(i==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}cout<<"请输入要查找的终点景点名称"<<endl;cin>>end;while(j<x->n && end!=x->v[j]){j++;if(j==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}x->shor=x->e[i][j];temp_1=x->e[i][j];for (int k=0;k<x->n;k++)//两个顶点最小权值判断{if (x->e[i][k]==0||x->e[k][j]==0 )continue;if(x->shor > x->e[i][k] + x->e[k][j]){x->shor = x->e[i][k] + x->e[k][j];temp=x->v[k];}}if(x->shor==0){cout<<"这两个节点中没有连通路,按任意键返回"<<endl;return 0;}if(x->shor==temp_1){cout<<"最短路径信息: "<<start<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;if(x->shor<temp_1 && x->shor<=temp1){cout<<"最短路径信息: "<<start<<"->"<<temp<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;}cout<<"查找失败,按任意键返回"<<endl;getchar();return 0;}int main(){park x;int i=1;luru(&x);do{search(&x);cout<<"是否继续?"<<endl<<"1.继续"<<endl<<"0.退出"<<endl;cin>>i;}while(i!=0);return 0;}三、运行结果。
校园导航系统源代码
数据结构-校园导航系统简介:本系统采用C语言编写,运行环境为Dev-C++;内容以西安电子科技大学南校区为例;主要功能有:1.查询景点信息;2.查询两景点间最短距离;3.查询两景点间所有路线;4.查询西电校园地图;5.修改景点和路径信息.注意事项:在进行修改景点和路径信息操作前,请在可执行文件目录下用记事本创建”super User.CODE”文件来存放用户名与密码(中间以空格隔开),否则无法进入.源代码:#include <string.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <ctype.h>#define Max 20000typedef struct ArcCell{int adj; //两个景点间的距离}ArcCell;typedef struct VertexType{int number; //景点编号char sight[100]; //景点名称char description[1000]; //景点简介char particular1[1000];char particular2[1000];char particular3[1000]; //景点详情}VertexType;typedef struct{VertexType vex[20]; //最多存放20个景点信息ArcCell arcs[20][20]; //两个景点间的距离int vexnum,arcnum;}MGraph;MGraph G;char nameofschool[100]; //学校名称int NUM=9;int P[20][20];int p[20];int visited[20];int a=0;long int D[20];int x[20]={0};//函数声明void CreateUDN(int v,int a);void narrate();void ShortestPath(int num);void output(int sight1,int sight2);char Menu();void search();char SearchMenu();void HaMiTonian(int);void Searchpath1(MGraph g);void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k);void NextValue(int);void display();int Addnewsight(int n);int Deletesight(int n);void Changesight();char Changemenu();char Sightmenu();int Maintain(void);int VerificatianIdentity(void);void map();//主函数int main(){int v0,v1;int MaintainFlag;char ck;system("color 0F");CreateUDN(NUM,11);do{ck=Menu();switch(ck){case '1':search();break;case '2':system("cls");narrate();printf("\n\n\t\t\t请选择起点景点(0~%d):",NUM-1);scanf("%d",&v0);printf("\t\t\t请选择终点景点(0~%d):",NUM-1);scanf("%d",&v1);ShortestPath(v0);output(v0,v1);printf("\n\n\t\t\t\t请按任意键继续...\n");getchar();getchar();break;case'3':system("cls");narrate();x[0]=1;Searchpath1(G);printf("\n\n\t\t\t\t请按任意键继续...\n");getchar();getchar();break;case'4':system("cls");map();printf("\n\n\t\t\t\t\t请按任意键继续...\n");getchar();getchar();break;case'5':system("cls");narrate();MaintainFlag = Maintain();switch(MaintainFlag){case'1':system("cls");narrate();NUM=Addnewsight(NUM);system("cls");narrate();break;case'2':NUM=Deletesight(NUM);break;case'3':Changesight();break;}break;};}while(ck!='e');return 0;}//主菜单char Menu(){char c;int flag;do{flag=1;system("cls");narrate();printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 1、查询景点信息┃\n");printf("\t\t\t┃ 2、查询两景点间最短路径┃\n");printf("\t\t\t┃ 3、查询两景点间所有路线┃\n");printf("\t\t\t┃ 4、查看西电校园地图┃\n");printf("\t\t\t┃ 5、修改景点和路径信息┃\n");printf("\t\t\t┃ e、退出┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");printf("\t\t\t\t请输入您的选择:");scanf("%c",&c);if(c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='e')flag=0;}while(flag);return c;}//查询菜单char SearchMenu(){char c;int flag;do{flag=1;system("cls");narrate();printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┃ 1、按照景点编号查询┃\n");printf("\t\t\t┃ 2、按照景点名称查询┃\n");printf("\t\t\t┃ e、返回┃\n");printf("\t\t\t┃ ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");printf("\t\t\t\t请输入您的选择:");scanf("%c",&c);if(c=='1'||c=='2'||c=='e')flag=0;}while(flag);return c;}//查询信息void search(){int num;int i;char c;char name[20];do{system("cls");c=SearchMenu();switch (c){case '1':system("cls");narrate();printf("\n\n\t\t请输入您要查找的景点编号:");scanf("%d",&num);for(i=0;i<NUM;i++){if(num==G.vex[i].number){printf("\n\t\t您要查找景点信息如下:");printf("\n\t\t(%d)%-5s:%-25s\n\n",i,G.vex[i].sight,G.vex[i].description);printf("\t\t\t\t\t详情介绍:\n\t\t%-s\n",G.vex[i].particular1);printf("\t\t%-s\n",G.vex[i].particular2);printf("\t\t%-s\n",G.vex[i].particular3);printf("\n\t\t按任意键返回...");getchar();getchar();break;}}if(i==NUM){printf("\n\n\t\t\t没有找到!");printf("\n\n\t\t\t按任意键返回...");getchar();getchar();}break;case '2':system("cls");narrate();printf("\n\n\t\t请输入您要查找的景点名称:");scanf("%s",name);for(i=0;i<NUM;i++){if(!strcmp(name,G.vex[i].sight)){printf("\n\t\t您要查找景点信息如下:");printf("\n\t\t(%d)%-5s:%-25s\n\n",i,G.vex[i].sight,G.vex[i].description);printf("\t\t\t\t\t详情介绍:\n\t\t%-s\n",G.vex[i].particular1);printf("\t\t%-s\n",G.vex[i].particular2);printf("\t\t%-s\n",G.vex[i].particular3);printf("\n\t\t按任意键返回...");getchar();getchar();break;}}if(i==NUM){printf("\n\n\t\t\t没有找到!");printf("\n\n\t\t\t按任意键返回...");getchar();getchar();}break;}}while(c!='e');}//构造图形void CreateUDN(int v,int a) {int i,j;strcpy(nameofschool,"西安电子科技大学");G.vexnum=v;G.arcnum=a;for(i=0;i<20;++i) G.vex[i].number=i;strcpy(G.vex[0].sight,"东门");strcpy(G.vex[0].description,"学校正门,可乘坐公交车,出租车等交通工具. ");strcpy(G.vex[0].particular1," 作为学校的正门,门外的交通系统非常发达,常年有出租车"); strcpy(G.vex[0].particular2,"经过,还有916路,173路等众多公交车线路在此设立站牌,所以"); strcpy(G.vex[0].particular3,"完全没必要担心坐不到车,出行非常方便!");strcpy(G.vex[1].sight,"图书馆");strcpy(G.vex[1].description,"馆藏文纸质献约270万余册,种类丰富,环境优美. ");strcpy(G.vex[1].particular1," 南校区图书馆2005年7月1日奠基,主要服务于新校区2万余"); strcpy(G.vex[1].particular2,"名本科生.地上建筑面积4万平方米,总框架五层,地下一层,地面"); strcpy(G.vex[1].particular3,"四层.拥有先进的设施、优雅温馨的阅读环境.");strcpy(G.vex[2].sight,"北门");strcpy(G.vex[2].description,"西电南校区的另外一个出入口,备有一个停车场. ");strcpy(G.vex[2].particular1," 北门日常的人流量不亚于东门,在这里有一个停车场,而且"); strcpy(G.vex[2].particular2,"这里还是西电的快递接收点,可以供广大师生在此寄取快递,非"); strcpy(G.vex[2].particular3,"常方便.而且临近综合楼,较为繁华.");strcpy(G.vex[3].sight,"海棠区");strcpy(G.vex[3].description,"2017级大一萌新即将入住的宿舍区. >o< ");strcpy(G.vex[3].particular1," 海棠宿舍位于学校西北面,所以距离北操,新综,北门较近,"); strcpy(G.vex[3].particular2,"准大一的学弟学妹们将会主要居住在5.6号楼(还有一部分会在"); strcpy(G.vex[3].particular3,"9.10号楼).海棠宿舍为两室一厅,每室各四人.");strcpy(G.vex[4].sight,"大活");strcpy(G.vex[4].description,"大学生活动中心的简称,小剧场就在这里. ");strcpy(G.vex[4].particular1," 大活建设在学校人工湖旁边,里面有实验室、舞蹈室等专用"); strcpy(G.vex[4].particular2,"教室,也是学校举办室内大型活动的常用地点,曾经陈一冰,周鸿"); strcpy(G.vex[4].particular3,"祎,黄晓明等人在此与同学们见面.");strcpy(G.vex[5].sight,"北操");strcpy(G.vex[5].description,"跑步踢球狼人杀...等等有趣的活动,超热闹. ");strcpy(G.vex[5].particular1," 北操基础设施齐全,有足球场跑道观众台羽毛球场等,是"); strcpy(G.vex[5].particular2,"学校举行大型体育赛事的场地,例如:运动会足球赛等.每天晚上"); strcpy(G.vex[5].particular3,"也会有许多同学在此运动玩耍,非常有趣.");strcpy(G.vex[6].sight,"观光塔");strcpy(G.vex[6].description,"南校区最显眼的建筑物,可以俯视整个校园. ");strcpy(G.vex[6].particular1," 观光塔是西电南校区最负盛名的建筑物,位处南校区最为中"); strcpy(G.vex[6].particular2,"间的位置,走在校园里,总是能够看到观光塔,到了晚上塔上的时"); strcpy(G.vex[6].particular3,"钟会亮起,很远都能看到,在月光下特别的漂亮.");strcpy(G.vex[7].sight,"体育馆");strcpy(G.vex[7].description,"今年刚刚建成,外观融合了\"天圆地方\"的思想. ");strcpy(G.vex[7].particular1," 考虑到学校的所在地西安是十三朝古都,亦应融入中国传统"); strcpy(G.vex[7].particular2,"文化的理念,以及体育馆主馆和训练馆的功能需求,最终决定以中"); strcpy(G.vex[7].particular3,"国传统文化的\"天圆地方\"为设计思路.美观大气.");strcpy(G.vex[8].sight,"行政楼");strcpy(G.vex[8].description,"可以进行盖章,补办一卡通等众多操作. ");strcpy(G.vex[8].particular1," 从东门进入学校,左手边的那栋楼就是行政楼,往后稍小一点"); strcpy(G.vex[8].particular2,"的就是行政辅楼.教务处、学工处、电院办公室在行政楼,一卡通"); strcpy(G.vex[8].particular3,"中心、户籍管理、财务处、一些学院的办公室在行政辅楼.");for(i=0;i<20;++i)for(j=0;j<20;++j)G.arcs[i][j].adj=Max;G.arcs[0][8].adj=G.arcs[8][0].adj=150;G.arcs[0][1].adj=G.arcs[1][0].adj=600;G.arcs[1][7].adj=G.arcs[7][1].adj=800;G.arcs[1][6].adj=G.arcs[6][1].adj=50;G.arcs[1][4].adj=G.arcs[4][1].adj=600;G.arcs[3][2].adj=G.arcs[2][3].adj=300;G.arcs[6][2].adj=G.arcs[2][6].adj=350;G.arcs[3][5].adj=G.arcs[5][3].adj=300;G.arcs[4][5].adj=G.arcs[5][4].adj=400;G.arcs[8][7].adj=G.arcs[7][8].adj=250;}//导图模块void narrate(){int i,k=0;printf("\n\t******************欢迎使用%s校园导游程序*****************\n\n",nameofschool);printf("\t━━━━━━━━━━|━━━━━━━━━━━━━━━━━━━━━━━━\n");printf("\t* 景点名称|\t\t\t景点描述\t\t *\n");printf("\t━━━━━━━━━━|━━━━━━━━━━━━━━━━━━━━━━━━\n");for(i=0;i<NUM;i++){printf("\t* (%d)%-15s|\t%-43s *\n",i,G.vex[i].sight,G.vex[i].description);k=k+1;}printf("\t━━━━━━━━━━|━━━━━━━━━━━━━━━━━━━━━━━━\n"); }//迪杰斯特拉算法void ShortestPath(int num){int v,w,i,t;int final[20];int min;for(v=0;v<NUM;v++){final[v]=0;D[v]=G.arcs[num][v].adj;for(w=0;w<NUM;w++)P[v][w]=0;if(D[v]<20000){P[v][num]=1;P[v][v]=1;}}D[num]=0;final[num]=1;for(i=0;i<NUM;++i){min=Max;for(w=0;w<NUM;++w)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<NUM;++w)if(!final[w]&&((min+G.arcs[v][w].adj)<D[w])){D[w]=min+G.arcs[v][w].adj;for(t=0;t<NUM;t++)P[w][t]=P[v][t];P[w][w]=1;}}}//输出函数void output(int sight1,int sight2){int a,b,c,d,q=0;a=sight2;if(a!=sight1){printf("\n\t\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);printf("(最短距离为%dm.)\n\n\t",D[a]);printf("\t\t%s",G.vex[sight1].sight);d=sight1;for(c=0;c<NUM;++c){gate:;P[a][sight1]=0;for(b=0;b<NUM;b++){if(G.arcs[d][b].adj<20000&&P[a][b]){printf("-->%s",G.vex[b].sight);q=q+1;P[a][b]=0;d=b;if(q%8==0) printf("\n");goto gate;}}。
数据结构-导游系统
该程序共有5个函数。
分别是Introduce,shortestdistance,floyed,display 及main。
其功能分别是:Introduce:地点介绍函数。
Shortestdistance:计算两地的最短距离。
Floyed:floyed算法求两地的最短距离。
Display:打印两个地点的路径及最短距离至屏幕。
Main:总体控制各函数并提供原始数据。
简单的导游程序-----------------------------------------以下是程序源码-------------------------------------------#include<stdio.h>#include<process.h>/*定义符号常量*/#define INT_MAX 10000#define n 12/*---------------------------------------------------------------------*//*定义全局变量*/int cost[n][n];/* 边的值*/int shortest[n][n];/* 两点间的最短距离*/int path[n][n];/* 经过的地点*//*---------------------------------------------------------------------*//*自定义函数原型说明*/void introduce();int shortestdistance();void floyed();void display(int i,int j);/*---------------------------------------------------------------------*/void main(){/*主函数*/int i,j;char k;for(i=0;i<=n;i++)for(j=0;j<=n;j++)cost[i][j]=INT_MAX;cost[1][2]=cost[2][1]=339;cost[1][3]=cost[3][1]=28;cost[1][4]=cost[4][1]=69;cost[1][5]=cost[5][1]=127;cost[1][7]=cost[7][1]=342;cost[1][10]=cost[10][1]=107;cost[2][7]=cost[7][2]=283;cost[3][6]=cost[6][3]=165;cost[7][11]=cost[11][7]=218;cost[8][12]=cost[12][8]=313;cost[8][10]=cost[10][8]=90;cost[12][9]=cost[9][12]=211;cost[1][1]=cost[2][2]=cost[3][3]=cost[4][4]=cost[5][5]=0;cost[6][6]=cost[7][7]=cost[8][8]=cost[9][9]=cost[10][10]=0;while(1){clrscr();printf("-----------Welcome to the trunk highway system in Shaanxi Province!-----------\n");printf("1.Location Information\n");printf("2.The shortest path query\n");printf("0.exit\n");printf("locations:\n");printf("1:Xi'an");printf("2:AnKang");printf("3:XianYang");printf("4:WeiNan");printf("5:ShangLuo");printf("6:BaoJi\n");printf("7:HanZhong");printf("8:YanAn");printf("9:YuLin");printf("10:TongChuan");printf("11:GuangYuan");printf("12:SuiDe\n");printf("------------------------------------------------------------------------------\n");printf("Please select the services you need:");scanf("\n%c",&k);switch(k){case '1':printf("Into the place of information:\n");introduce();break;case '2':printf("Inquiries into the shortest path:");shortestdistance();break;case '0':exit(0);default:printf("Error!\nPlease input1,2or0.\n");break;}}}/*main*//*---------------------------------------------------------------------*/void introduce(){/*地点介绍*/int a;printf("Inquiries as to which site you would like moreinformation?\nPlease enter the location code:");scanf("%d",&a);printf("\n");switch(a){case 1:printf("1:Xi'an\n\n Shaanxi Province's political center.\n\n");break; case 2:printf("2:AnKang \n\n Is located in Xi'an, Wuhan, Chongqing Economic Area, the three geometric center.");break;case 3:printf("3:XianYang\n\n International Airport.\n\n");break;case 4:printf("4:WeiNan\n\n Is next to the Huashan.\n\n");break;case 5:printf("5:ShangLuo\n\n There are a result of mountain, named after Waterinfo.\n\n");break;case 6:printf("6:BaoJi\n\n Another Gu Cheng, China is the ancestor of Yan Emperor's hometown.\n\n");break;case 7:printf("7:HanZhong\n\n is a beautiful and richly endowed in the central Hanzhong Basi.n\n\n");break;case 8:printf("8:YanAn\n\n The old revolutionary base areas.\n\n");break; case 9:printf("9: YuLin\n\n Shaanxi Province is now the focus of development.\n\n"); break;case 10:printf("10: TongChuan\n\n Leading to the tomb and the humanities Chuzu revolutionary Yan'an of the Holy Land must pass through to.\n\n");break; case 11:printf("11:GuangYuan\n\n Earthquake hit\n\n\n");break;case 12:printf("12: SuiDe\n\n My hometown!\n\n");break;default:printf("Error!Please input1->10!\n\n"); break;}getch();}/*introduce*//*---------------------------------------------------------------------*/int shortestdistance(){/*要查找的两地点的最短距离*/int i,j;printf("Please input two location code (1->12 devided by ','):"); scanf("%d,%d",&i,&j);if(i>n||i<=0||j>n||j<0){printf("Error!\n\n");printf(" Please input two location code (1->12 devided by ','):\n"); scanf("%d,%d",&i,&j);}else{floyed();display(i,j);}return 1;}/*shortestdistance*//*---------------------------------------------------------------------*/void floyed(){/*用floyed算法求两个地点的最短路径*/int i,j,k;for(i=1;i<=n;i++)for(j=1;j<=n;j++){shortest[i][j]=cost[i][j];path[i][j]=0;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(shortest[i][j]>(shortest[i][k]+shortest[k][j])){/*用path[][]记录从i到j的最短路径上点j的前驱地点的序号*/shortest[i][j]=shortest[i][k]+shortest[k][j];path[i][j]=k;path[j][i]=k;}}/*floyed*//*---------------------------------------------------------------------*/void display(int i,int j){/* 打印两个地点的路径及最短距离 */int a,b;a=i;b=j;printf("Which is theshortest path between two locations do you required:\n\n");if(shortest[i][j]!=INT_MAX){if(i<j){printf("%d",b);while(path[i][j]!=0){/* 把i到j的路径上所有经过的地点按逆序打印出来*/printf("<-%d",path[i][j]);if(i<j)j=path[i][j];elsei=path[j][i];}printf("<-%d",a);printf("\n\n");printf("(%d->%d)The shorest path is:%dkm\n\n",a,b,shortest[a][b]); }else{printf("%d",a);while(path[i][j]!=0){/* 把i到j的路径上所有经过的地点按顺序打印出来*/printf("->%d",path[i][j]);if(i<j)j=path[i][j];elsei=path[j][i];}printf("->%d",b);printf("\n\n");printf("(%d->%d)The shorest path is:%dkm\n\n",a,b,shortest[a][b]); }}elseprintf("Error!This path is not exsist!\n\n");printf("\n");getch();}/*display*/。
数据结构课程设计报告,校园导游图
淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 选题名称: 姓 名: 专业班级: 系 (院): 设计时间: 设计地点:数据结构课程设计 校园导游图 学 号:计算机工程学院 2011.12.19~2011.12.30 软件工程实验室、教室指导教师评语:成绩:签名:年月日数据结构课程设计报告第 1 页,共 页1.课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程 中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:任务 根据教材《数据结构-C 语言描述》(耿国华主编)和参考书《数据结构题集(C 语言版)》(严蔚敏、吴伟民主编)选 择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方 面加深对课程基本内容的理解和综合运用。
设计题目从任务书所列选题表中选取,每班每题不得超过 2 人。
学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构 课程所学的知识。
学生自选课题需在 18 周前报课程设计指导教师批准方可生效。
要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、 编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机 调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300 行以上代码),并具有一定的深度和难度。
数据结构课程设计报告有代码
西安邮电学院数据结构课程设计报告题目:校园导航系统院系名称:计算机学院专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:设计起止时间:2011年12月11日~2011年12月15日一. 设计目的1.通过本次课程设计巩固《数据结构》中所学的内容;2.提高自己上机编程以及调试能力。
二. 设计内容1.设计所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
2.为来访客人提供图中任意景点相关信息的查询。
3.为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
三.概要设计1.功能模块图;2.各个模块详细的功能描述。
1. 可以手动创建一个校园图。
2. 可以直接从文件读取校园各个景点的信息。
3. 可选择从任意个景点作为起点进行遍历。
4. 输入景点序号查询该景点相关信息。
5. 输入两个景点查询两个景点的最短,最佳及其所有的路径。
6. 将校园图信息保存入文件。
主程序 景点信息介绍输入各个景点的遍历校园平面图显示图的建立与修改景点信息路径查询文件的读取与保存密码退出程序四.详细设计1.功能函数的调用关系图2.各功能函数的数据流程图1. Adjmatrix *g 即结构体对象在main()中被创建在其他子函数中进行参数传递。
判断密码显示menu调用相应函数 返回主菜单密码3次错误密码正确输入密码具体分函数退出程序开始管理系统程序是否退出?执行函数相应的操作arcnumfile() vernumfile() readvernum() floyd() creatdn() shortload() search() locatevertex() findvernum() depthfirstsearch() creatvisited() readarcnum() main()2. 全局变量visited数组visited数组在creatvisited()中被初始化,然后再在depthfirstsearch()中用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程论文(设计)2011-2012学年第2学期课程名称:数据结构课程设计课程性质:实践课专业班级:考核方式:考查学生姓名:学号:学时:1周教师姓名:目录1. 作业内容 (1)2. 基本思路 (1)2.1 本校10个景点 (1)2.2 图的初始化 (2)2.3 图的遍历 (2)2.4 求最短路径 (3)3.系统流程 (4)3.1 系统的简单说明 (4)3.2 系统流程图 (5)4. 系统运行效果图 (5)4.1 校园导游界面 (5)4.2 华农校园地图 (6)4.3 景点的相关信息查询 (6)4.4 任意两个景点间的最短路径 (7)4.5 退出校园导游系统 (8)5.总结 (9)6.参考文献 (10)1. 作业内容设计一个校园导游程序,为来访客人提供各种信息查询任务。
基本要求:(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介信息,以边表示路权,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2. 基本思路要完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。
有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。
(4).依照景点的相关信息创建校园图。
(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。
(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。
(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。
为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。
2.1 选出本校10个景点结合华南农业大学实际情况,我选出以下10个景点,从1到10编号:楼6树木园7竹园8新校门5东区运动场9老校门10黑山运动场2.2 图的初始化由于邻接矩阵特殊的存储方式,它非常便于快速的查找两个顶点之间的边上的权值。
所以,图采用带权的邻接矩阵存储。
决定了图的存储方式后,以华南农业大学10个景点的游览地图作为蓝本,把校园地图抽象化成顶点与边构成的图形式,如图2.2所示,途中数字代表线的权值。
2.3 图的遍历图的遍历是图中最基本的操作。
图的遍历是指从图中某一顶点出发,对图中所有顶点访问一次且仅访问一次。
导游图需要把每条路径的信息都向游客展示,就需要读取每两个顶点间的路径信息。
由于采用了带权的邻接矩阵存储结构进行存储,所以需要针对这一存储结构对路线进行遍历操作。
其遍历算法如图2.3所示。
图2.3 遍历算法示意图2.4 求最短路径基于本程序中图的存储是邻接矩阵结构存储的图结构,因而采用适合该存储结构的迪杰斯特拉算法用于解决求最短路径的问题。
迪杰斯特拉提出了一个按路径长度递增的持续产生最短路径的算法,其基本思想是:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对于v i ∈V-S,假设从源点v到v i的有向边为最短路径。
以后每求得一条最短路径v,…,v k,就将v k加入集合S中,并将路径v,…,v k,v i,与原来的假设相比较,取路径长度较小者为最短路径。
重复上述过程,直到集合V中全部顶点加入到集合S中。
如图2.4所示。
图2.4 图的遍历算法执行效果示意图辅助数组dist[n]:元素dist[i]表示当前找到的从源点到终点v i的最短路径的长度。
初态为:若从v到v i有弧,则dist[i]为弧上的权值;否则置dist[i]为∞。
若当前求得的终点为v k,则根据下式进行迭代:dist[i]=min{dist[i],dist[k]+arc[k][i]} 1≦i≦n辅助数组path[n]:元素path[i]是一个串,表示当前所找到的从源点到终点v i 的最短路径。
初态为:若从v到v i有弧,则path[i]为“vv k”,否则置path[i]为空串。
数组s[n]:存放源点和已经生成的终点(即集合S),初态为只有一个源点v。
算法的伪代码描述是:1.初始化数组dist、path和s;2.while(s中的元素个数<n)2.1 在dist[n]中求最小值,其下标为k(则v k为正在生成的终点);2.2 输出dist[j]和path[j];2.3 修改数组dist和path;2.4 将顶点v k添加到数组s中;3.系统流程3.1 系统的简单说明1.创建校园图:(1)先手工画好华农的10个景点的草图,再用C++语言输出抽象化的校园地图。
(2)再用C++语言定义节点个数N,编写函数name( )为景点赋值各类信息项,函数information( ),输入各个景点的简介。
(3)读入道路的起始点,为邻接矩阵的边赋相应的值。
2.利用函数travgraph来查找景点信息。
3.创建一个校园图creat(Matrix_Graph *G),然后为相应的边赋上现实意义上的权值。
4.用path( )函数来求任意两景点之间的最短路径。
5.如果不查询则调用exit( )函数退出。
5.用main函数来输出导游界面。
3.2 系统流程图4.系统运行效果图4.1 校园导游界面程序运行,后台对图结构进行初始化,运行结果如图4.1。
图4.1 校园导游节目图4.2 华农校园地图校园地图的查看是通过抽象化10个景点来用printf( )函数输出地图,在输入选择1之后弹出的界面,运行结果如图4.2。
开始Main 函数界面菜单输出华农地图调用查询景点函数travgraph( )是否再次查询?调用查询最短距离函数path( )YESNO是否再次查询?YESNO输入1输入2输入3调用函数exit( )输入4结束返回界面菜单图4.2 抽象化的华南农业大学校园导游地图4.3 景点的相关信息查询景点的相关信息查询是通过information( )函数来调用输出的,在主菜单那输入2之后,拿第2个景点红满堂和第7个景点竹园来当例子,第运行结果如图4.3.1和图4.3.2。
图4.3.1 景点2红满堂信息查询图4.3.2 景点7竹园信息查询4.4 任意两个景点间的最短路径根据用户的需求,在用户输入了起点和终点后计算出最短路径是哪一条路径。
以下举两个例子。
第一个例子的起点是5东区运动场,终点是1校史馆。
第二个例子的起点是2红满堂,终点是10黑山运动场。
运行结果如图4.4.1和图4.4.2所示。
图4.4.1 从东区运动场到校史馆的最短路径图4.4.2 从红满堂到黑山运动场的最短路径根据截图可知,在现实生活中的最短路径也是如此。
证明了程序的正确性。
4.5 退出校园导游系统用户满足了需求之后,只要在界面菜单处输入4便可退出此次校园导游系统。
运行结果如图4.5。
图4.5 退出校园导游系统5.总结由于设计者水平有限,本导游图系统的功能还比较简单,还有一些好的设想没有实现:比如添加管理模式,使得公园管理人员能够同样方便的更改导游图,因此更改这一导游图还必须在程序员的帮助下进行。
另外,本导游图系统还有一定的局限性,如果存在只有一条通路的景点,导游图将无法求得最佳旅游路径。
公园的导游图系统的这些不足请老师多多谅解。
通过这次的课程设计左右,让我对数据结构中定义无向图和创建无向图的理解更加深刻,不断提升认识,提高编程技巧,借以不断地提高程序设计水平,了解数据结构在编写比较复杂的程序的重要作用;理解了迪杰斯特拉算法的原理,但对于其算法的程序编写还是不太明白;学会了在编写几百行程序时如何查找错误,如何改错误等等。
总而言之,这次的课程设计很好地锻炼自己实际操作能力!参考文献[1]严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社.1997.[2]李春葆,尹为民,李蓉蓉.数据结构教程(第3版)上机实验指导.清华大学出版社.2009.[3]滕国文.数据结构课程设计.清华大学出版社.2010.218-223.[4]蒋盛益.数据结构学习指导与训练.中国水利水电出版社.2003.//程序名称:校园导游系统//程序员://编写时间:2012年6月#define N 10#define MAX 25#define MAXedg 30#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>void clrscr(){system("cls");}typedef int AdjMatrix[MAX][MAX];typedef struct{int vexs[MAX];AdjMatrix arcs;}Matrix_Graph;typedef struct{char name[10];char information[100];struct edgenode *link; }vexnode;typedef struct edgenode{int adjvex;int length;char info[10];char info2[100];struct edgenode *next;}edgenode, *Node ;typedef struct Edge{int lengh;int ivex, jvex;struct Edge *next;} EdgeType;typedef struct{int num;char name[10];} vertex;typedef struct{vertex vexs[MAX];int edges[MAX][MAX];}adjmax;void Name(int i){switch(i){case 1:printf("1:校史馆\n\n");break;case 2:printf("2:红满堂 \n\n");break;case 3:printf("3:行政楼\n\n");break;case 4:printf("4:西园\n\n");break;case 5:printf("5:东区运动场\n\n");break;case 6:printf("6:树木园\n\n");break;case 7:printf("7:竹园\n\n");break;case 8:printf("8:新校门\n\n");break;case 9:printf("9:老校门\n\n");break;case 10:printf("10:黑山运动场\n\n");break;default:printf("景点编号输入错误!请输入1-10的数字编号!\n\n"); break; }}void Information(int i)/*景点介绍*/{switch(i){case 1:printf("校史馆:华农校史档案保存的地方。