数据结构课程设计报告(校园导游系统)附有源代码

合集下载

校园导游程序-数据结构与算法课程设计报告

校园导游程序-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程数据结构与算法课程设计名称校园导游程序学生姓名张传乐学号0804012011专业班级计算机科学与技术08级(2)班指导教师王昆仑张贯虹2010年6月题目:用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。

要求能够回答有关景点介绍、游览路径等问题。

要求:(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。

(3)查询图中任意两个景点间的所有路径。

选作内容:求多个景点的最佳(最短)游览路径。

一:问题分析和任务定义此程序需完成如下要求:用无向网表示所在学校的校园景点平面图,要做到可以查询各景点的相关信息,查询任意两个景点间的最短路径,查询图中任意两个景点间的所有路径。

实现本程序需要解决的几个问题:1,校园无线网应采用什么存储方式来存储 2,对大量信息的输入怎样处理。

3,Dirjstra 最短路径算法实现过程 4,所有路径的算法实现下图为合肥学院南区平面图:图1:校园拓扑图灯光球场南门五三 一栋主楼六四 二栋 转盘东门礼堂 操场欲求任意两点之间的最短路径,要将Dirjstra算法稍加改变一下,因为Dirjstra算法是求任意一点到其他所有点的最短路径,而本题只要求求任意两点之间的最短路径,故在找到要到的另一点后就可停止算法,跳出循环了。

在求任意两点间所有路径的函数中,在邻接表存储图中,要采用递归的思想求解两点间所用路径,从一点出发,在找到要找的另一点后,输出走过的路径path,并通过return跳出本次递归函数,继续寻找,知道所有的情况都被寻找过为止。

二、概要设计和数据结构选择对合肥学院校园平面图用邻接表存储,由于校园的景点之间的路较少,故如用邻接矩阵存储的话,该矩阵就是一个稀疏矩阵,这样就会造成存储空间的极度浪费。

故采用邻接矩阵存储对存储空间上就会不会造成太大的浪费了。

数据结构(C语言版)实验报告 (校园导游咨询)

数据结构(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版)数据结构课程设计校园导游咨询

(完整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 数据结构定义我们使用图这一数据结构来表示校园地点之间的连接关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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("校史馆:华农校史档案保存的地方。

相关文档
最新文档