数据结构地图导游系统含源码

合集下载

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

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

课程论文(设计)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).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。

为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。

校园导游图源代码

校园导游图源代码

#include<stdio.h>#include<stdlib.h>#include<dos.h>#include<windows.h>#include<malloc.h>#define Max 100#define N 9//景点个数。

typedef int AdjMatrix[Max][Max];typedef struct{int vexs[Max];AdjMatrix arcs;}Matrix_Graph;//图的矩阵表示法。

void menu();//景点名、操作提示。

void creat(Matrix_Graph *G);//图的建立。

void path(Matrix_Graph G,int s,int e);//两景点之间最短的路径,s表示起始景点,e //最终到达景点。

#define Max 100#define N 9void menu(){printf("1---南大门\n");printf("2---老师办公室\n");printf("3---图书馆\n");printf("4---一号教学楼\n");printf("5---宿舍\n");printf("6---食堂\n");printf("7---北大门\n");printf("8---44号教学楼\n");printf("9---学校广场\n");printf("\n菜单:\n");printf("请选择位置对应数字项目:\n");printf("1----介绍\n");printf("2----路径\n");printf("0----退出\n");}void creat(Matrix_Graph *G){int i,j;for(i=1;i<=N;i++) G->vexs[i]=i;//初始化,0号位不用。

数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码 运行截图[方案]

数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码 运行截图[方案]

数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码运行截图[方案]C++题目: 校园导游咨询学生姓名: 学号: 院系: 专业年级:2011年7月1日一、设计题目校园导游咨询,1、实验目的,1,熟练掌握图的创建及遍历基本操作算法。

,2,熟练掌握最短路径算法。

,3,利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。

2、实验内容【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。

以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。

【测试数据】由读者根据实际情况指定。

【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。

顶点和边均含有相关信息。

【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。

二、小组成员分工说明略三、需求分析1,运行环境,软、硬件环境,硬件环境,windows2000、windows XP、windows7 皆可,软件环境,Microsoft (R) Developer Studio (2)2,输入的形式和输入值的范围输入形式,整形数据,景点代号、路径长度、地图上的方位信息,,字符串,景点名称及简介,,输入值范围,景点代号为,整形0~17,共18个景点,路径长度为,整形1~10,两景点间距离,以近似1,:100m比例换算,最远1km,景点名称字符串长度,整形1~15,景点名称,字符串长度为,字符数组1~50,对景点进行简要介绍,景点在地图方位图上的位置,整形0~103,输出的形式描述景点代号、景点名称、信息的关联以cout形式输出,告知来访客人,以便查询,景点信息查询结果的输出形式为cout字符串,两景点间最短路径输出形式为cout字符串符号、以及嵌套的printroad,,函数以显示路径信息及方位信息,方便客人获取最佳路线,4,功能描述(1)设计学校的校园平面图,所含景点18个。

校园导游系统数据结构图

校园导游系统数据结构图

西安郵電學院数据结构实验报告题目:校园导游系统院系名称:计算机学院专业名称:计算机科学与技术班级:1006学生姓名: ****学号(8位):*****指导教师:******设计起止时间:2011年12月12日~2011年12月16日一. 题目要求1、设计学校的校园平面图,地点(地点名称、地点介绍)不少于10个。

2、提供图中任意地点相关信息的查询。

3、提供图中任意地点的问路查询:1)任意两个地点之间的一条最短(中转最少)的简单路径;2)任意两个景点的最佳访问路线(带权)查询;3)任意两个地点之间的所有路径。

4、地点和道路的扩充以及撤销;地点基本信息的文件存储。

(附加:加分题)二.概要设计1.功能模块的调用关系图2.各个模块详细的功能描述。

1.首先,main()函数调用loge()函数,输出欢迎界面,然后调用showmenu()函数来选择用户所要进行的操作。

其中showmenu()函数就是一个菜单供使用者来选择他所要进行的相关操作,比如信息的查询,最短路径查询之类。

2.browser()函数,用于输出校园平面图,给用户提供校园的景点分布状况,方便用户选择景点参观。

3.Search()函数,用于查询用户所选的景点信息,用户需要输入要查询的景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出该景点的相关信息,包括景点名字,景点的相关介绍,否则返回重新输入。

4.SearchAllpath()函数,用于查询用户所选的任意两个景点间的所有路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的所有路径,否则返回重新输入。

函数使用深度遍历DeepFirstSeach()查找路径。

5.Wellway()函数,用于查询用户所选的任意两个景点间的最短路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的最短路径,否则返回重新输入。

某数据结构课程设计公园导游图

某数据结构课程设计公园导游图

实验四:图(内容:某公园导游图)一、问题描述:公园导游系统:给出一张某公园的导游图,游客通过终端询问可知:从某一景到另一景点的最短路径。

游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边) 。

、设计描述:1. 输入导游图的算法(存储方法) .本程序特地设计函数void initgraph() 用于实现键盘输入图的结构;2. 可访问导游图中任一景点的算法.为此设计了函数void vist(GraphMatrix graph) 用于实现访问任一景点的信息;3. 最短路径从一景点到另一景点的算法。

利用floyd 算法-实现每一对景点间的最短路径。

并利用void outgraph() 函数实现显示起始点和终点间的最短路径和其长度;三、程序清单:#include<iostream> using namespace std;#include<stdio.h>#define MAXVEX 100#define MAX 999typedef char VexType;typedef float AdjType;typedef struct {int n;VexType vexs[MAXVEX]; AdjType arcs[MAXVEX][MAXVEX]; } GraphMatrix; GraphMatrix graph;int i, j, k; fOr (i = 0; i < pgraph->n; i++) fOr (j = 0; j <pgraph->n; j++) { if (pgraph->arcs[i][j] != MAX)ppath->nextvex[i][j] = j; else ppath->nextvex[i][j] = -1; ppath->a[i][j] = pgraph->arcs[i][j];}for (k = 0; k < pgraph->n; k++)for (i = 0; i < pgraph->n; i++)for (j = 0; j < pgraph->n; j++) {if ( ppath->a[i][k] >= MAX || ppath->a[k][j] >= MAX ) continue;//定义图结构/* 图的顶点个数 *//* 顶点信息 *//* 边信息 */ //定义一个图 graphtypedef struct {AdjType a[MAXVEX][MAXVEX];int nextvex[MAXVEX][MAXVEX]; } ShortPath; ShortPath path; //定义最短路径ShOrtPath 结构/* 关系矩阵 A ,存放每对顶点间最短路径长度 *//* nextvex[i][j] 存放 vi 到 vj 最短路径上 vi 的后继顶点的下标值*/ //定义路径 pathvOid flOyd(GraphMatrix * pgraph, ShOrtPath * ppath) //flOyd 算法 -用于实现每一对景点间的最短路径if ( ppath->a[i][j] > ppath->a[i][k]+ ppath->a[k][j] ) { ppath->a[i][j] = ppath->a[i][k] + ppath->a[k][j];ppath->nextvex[i][j] = ppath->nextvex[i][k];}}}void outgraph() //out() 函数用于实现显示起始点和终点间的最短路径和其长度{int c,b,i;cout<<endl;CoUtV<"请输入想查找起始点和终点:"; Zz输入要查找起始点和终点(本程序限于编号(int型)) cout<<endl;Cin>>C;Cin>>b;i=path.a[c][b]; ZZ通过path.a[c][b]把路径长度赋给i//输出路径长度 //此处输出路径的第一个编号 //循环顺序输出路径始点和终点之间的景点编号 //再输出路径的最后一个编号 } vOid initgraph() //该函数用于实现键盘输入图的结构{ int i,m,j;printf(" 请输入公园景点的个数: ");//图结点的个数赋给 graph.n sCanf("%d",&m);graph.n=m;fOr(i=0;iVgraph.n;i++)//循环输入结点顶点信息{ Printf("请输入第%i 个景点信息:",i); Zz 为了简明起见此程序结点顶点信息限于字符型Cin>>graph.vexs[i];}Printf("请输入公园的邻接矩阵的信息\n");ZZ 循环输入图的邻接矩阵信息(也就是输入一个二维数组) fOr(i=0;iVgraPh.n;i++)for(j=0;j<graph.n;j++) {printf(" 请输入第 %d 行,第 %d 列的元素 :",i+1,j+1); cin>>graph.arcs[i][j]; }}COutV<"该路径总长为:";cout<<i<<endl;COUtVV"所得路径顺序为";COutVVC;C=path.nextvex[C][b];fOr(;C!=b;C=path.nextvex[C][b])COutVV","VVC;COutVV","VVb;COutVVendl;void vist(GraphMatrix graph) //函数用于实现访问任一景点的信息{ int i;cout<<endl;COUtV<"你想知道哪个景点的信息:";Zz注意输入的是景点的编号cin>>i;COutVVendl;COUtVV"景点信息查询结果为:";COutvVgraPh.vexs[i]; //输出景点信息COutVVendl;}int jud() //用于判断是否继续执行特定的下一步程序{int a;cout<<"还想继续查询?(1 &0)";Cin>>a;return a;}int main(){int i,j; initgraph();floyd(&graph, &path);COutV<"为了验证下面运算结果的方便,for (i = 0; i < graph.n; i++){fOr (j = 0; j V graph.n; j++)printf("%d ", path.nextvex[i][j]);putChar('\n');}COutVVendl;Outgraph(); while(jud())Outgraph(); vist(graph);COutVVendl;while(jud()) vist(graph);COutVVendl;return 0;//initgraph()函数来实现键盘输入图的结构循环输出nextvex[i][j] 数组";//为了验证下面运算结果的方便,循环输出nextvex[i][j] 数组//nextvex[i][j] 存放vi 到vj 最短路径上vi 的后继顶点的下标值//oUtgraPh()函数用于实现显示起始点和终点间的最短路径和其长度//函数用于实现访问任一景点的信息验四:图(内容:某公园导游图).①问题描述给出一张某公园的导游图,游客通过终端询问可知:(1 )从某一景点到另一景点的最短路径。

c++数据结构课程设计校园导游设计代码

c++数据结构课程设计校园导游设计代码

C++数据结构课程设计——校园导游设计代码1. 引言在现代高校教育中,数据结构课程的重要性不言而喻。

而在C++语言中,有关数据结构的课程设计更是相当重要。

本文将探讨如何利用C++语言设计校园导游系统的代码,并给出详细的设计方案和代码实现。

2.设计思路校园导游系统主要包括地图信息的输入、导游路线的规划、用户信息的管理和景点信息的展示。

我们将采用图的数据结构和Dijkstra算法来实现导游路线的规划,采用链表和栈的数据结构来实现用户信息的管理,采用数组和哈希表的数据结构来实现景点信息的展示。

3.系统架构3.1 地图信息的输入为了实现地图信息的输入,我们将采用图的数据结构来描述校园内的各个景点之间的相互关系。

每个景点将作为图的一个节点,而景点之间的路径将作为图的一条边。

我们将设计一个函数来输入景点之间的相互关系,并将其存储在图的邻接矩阵中。

3.2 导游路线的规划为了实现导游路线的规划,我们将采用Dijkstra算法来求解最短路线。

我们将设计一个函数来实现Dijkstra算法,并根据用户的起始点和终点来输出最短路线。

3.3 用户信息的管理为了实现用户信息的管理,我们将采用链表和栈的数据结构来存储用户的历史操作信息。

我们将设计一个函数来实现用户信息的录入和查询,并将其存储在链表和栈中进行管理。

3.4 景点信息的展示为了实现景点信息的展示,我们将采用数组和哈希表的数据结构来存储校园内各个景点的相关信息。

我们将设计一个函数来实现各个景点信息的录入和展示,并将其存储在数组和哈希表中进行管理。

4. 代码实现以下是校园导游系统的C++代码实现:```// TO DO```5. 结语通过以上的设计方案和代码实现,我们成功利用C++语言设计了一个校园导游系统。

该系统能够实现地图信息的输入、导游路线的规划、用户信息的管理和景点信息的展示。

希望本文能够给读者在学习C++数据结构课程设计时提供一定的帮助。

除了以上提到的功能,校园导游系统还可以增加更多的特色功能,比如语音导览、虚拟现实导览、导游路线的可视化展示等。

(完整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| 。

某数据结构课程设计公园导游图

实验四:图(内容:某公园导游图)一、问题描述:公园导游系统:给出一张某公园的导游图,游客通过终端询问可知︰从某一景到另一景点的最短路径。

游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。

二、设计描述:1.输入导游图的算法(存储方法).本程序特地设计函数void initgraph()用于实现键盘输入图的结构;2.可访问导游图中任一景点的算法.为此设计了函数void vist(GraphMatrix graph)用于实现访问任一景点的信息;3.最短路径从一景点到另一景点的算法。

利用floyd算法-实现每一对景点间的最短路径。

并利用void outgraph()函数实现显示起始点和终点间的最短路径和其长度;三、程序清单:#include<iostream>using namespace std;#include<stdio.h>#define MAXVEX 100#define MAX 999typedef char VexType;.typedef float AdjType;typedef struct //定义图结构{int n; /* 图的顶点个数*/VexType vexs[MAXVEX]; /* 顶点信息*/AdjType arcs[MAXVEX][MAXVEX]; /* 边信息*/} GraphMatrix;GraphMatrix graph; //定义一个图graphtypedef struct //定义最短路径ShortPath结构{AdjType a[MAXVEX][MAXVEX]; /* 关系矩阵A,存放每对顶点间最短路径长度*/int nextvex[MAXVEX][MAXVEX];/* nextvex[i][j]存放vi到vj最短路径上vi的后继顶点的下标值*/ } ShortPath;ShortPath path; //定义路径pathvoid floyd(GraphMatrix * pgraph, ShortPath * ppath) //floyd算法-用于实现每一对景点间的最短路径{int i, j, k;for (i = 0; i < pgraph->n; i++)for (j = 0; j < pgraph->n; j++) {if (pgraph->arcs[i][j] != MAX)ppath->nextvex[i][j] = j;.else ppath->nextvex[i][j] = -1;ppath->a[i][j] = pgraph->arcs[i][j];}for (k = 0; k < pgraph->n; k++)for (i = 0; i < pgraph->n; i++)for (j = 0; j < pgraph->n; j++) {if ( ppath->a[i][k] >= MAX || ppath->a[k][j] >= MAX )continue;if ( ppath->a[i][j] > ppath->a[i][k]+ ppath->a[k][j] ) {ppath->a[i][j] = ppath->a[i][k] + ppath->a[k][j];ppath->nextvex[i][j] = ppath->nextvex[i][k];}}}void outgraph() //out()函数用于实现显示起始点和终点间的最短路径和其长度{int c,b,i;cout<<endl;cout<<"请输入想查找起始点和终点:"; //输入要查找起始点和终点(本程序限于编号(int型))cout<<endl;cin>>c;cin>>b;i=path.a[c][b]; //通过path.a[c][b]把路径长度赋给i.cout<<"该路径总长为:";cout<<i<<endl; //输出路径长度cout<<"所得路径顺序为";cout<<c; //此处输出路径的第一个编号c=path.nextvex[c][b];for(;c!=b;c=path.nextvex[c][b]) //循环顺序输出路径始点和终点之间的景点编号cout<<","<<c;cout<<","<<b; //再输出路径的最后一个编号cout<<endl;}void initgraph() //该函数用于实现键盘输入图的结构{int i,m,j;printf("请输入公园景点的个数:"); //图结点的个数赋给graph.nscanf("%d",&m);graph.n=m;for(i=0;i<graph.n;i++) //循环输入结点顶点信息{printf("请输入第%i个景点信息:",i); //为了简明起见此程序结点顶点信息限于字符型cin>>graph.vexs[i];}printf("请输入公园的邻接矩阵的信息\n");//循环输入图的邻接矩阵信息(也就是输入一个二维数组)for(i=0;i<graph.n;i++).for(j=0;j<graph.n;j++){printf("请输入第%d行,第%d列的元素:",i+1,j+1); cin>>graph.arcs[i][j]; }}void vist(GraphMatrix graph) //函数用于实现访问任一景点的信息{ int i;cout<<endl;cout<<"你想知道哪个景点的信息:"; //注意输入的是景点的编号cin>>i;cout<<endl;cout<<"景点信息查询结果为:";cout<<graph.vexs[i]; //输出景点信息cout<<endl;}int jud() //用于判断是否继续执行特定的下一步程序{int a;cout<<"还想继续查询?(1&0)";cin>>a;return a;}int main().{int i,j;initgraph(); //initgraph()函数来实现键盘输入图的结构floyd(&graph, &path);cout<<"为了验证下面运算结果的方便,循环输出nextvex[i][j]数组";for (i = 0; i < graph.n; i++){for (j = 0; j < graph.n; j++) //为了验证下面运算结果的方便,循环输出nextvex[i][j]数组printf("%d ", path.nextvex[i][j]); //nextvex[i][j]存放vi到vj最短路径上vi的后继顶点的下标值putchar('\n');}cout<<endl;outgraph();while(jud())outgraph(); //outgraph()函数用于实现显示起始点和终点间的最短路径和其长度vist(graph); //函数用于实现访问任一景点的信息cout<<endl;while(jud())vist(graph);cout<<endl;return 0;}.验四:图(内容:某公园导游图)①.问题描述给出一张某公园的导游图,游客通过终端询问可知:(1)从某一景点到另一景点的最短路径。

数据结构-校园导游程序(附源码)

数据结构-校园导游程序(附源码)简介本文档旨在介绍一个校园导游程序的设计与实现。

该程序使用数据结构来管理校园地点信息,并提供导游功能,供用户查找并导航到目标地点。

文档将依次介绍相关的背景知识、程序设计原理、算法实现以及使用方法。

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

数据结构课程设计报告含代码

西安邮电学院数据结构课程设计报告题目:校园导航系统院系名称:计算机学院专业名称:计算机科学与技术班级:学生姓名:学号(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()中被创建在其他子函数中进行参数传递。

2. 全局变量visited数组visited数组在creatvisited()中被初始化,然后再在depthfirstsearch()中用。

3. 全局变量shorest[][],path[][]在floyd()中被赋值来分别记录v[i]-v[j]最短路径和 v[i]-v[j]所经过景点。

3.重点设计及编码两景点最短距离弗洛伊德算法void floyd(adjmatrix *g){int i,j,k;for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++)shortest[i][j]=0;for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++){shortest[i][j]=g->arcs[i][j].adj;path[i][j]=0;}for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++)for(k=0;k<g->vexnum;k++)if(shortest[i][j]>(shortest[i][k]+shortest[k][j])){shortest[i][j]=shortest[i][k]+shortest[k][j];path[i][j]=k;path[j][i]=k;}}五.测试数据及运行结果1.正常测试数据和运行结果要求提供3组正常测试数据和运行结果2(遍历功能)1(起始景点序号)1 校门呈长方形,校训:爱国、求实、奋进2 喷泉呈鸽子形状,喷射出水花3 教学楼传授知识和学习知识4 实验楼供学生进行课程实验和教师办公5 洗浴中心供学生洗澡,内设单人间和双人间6 美食广场仅一层,快餐味道不错7 图书馆共七层,存储大量书籍供学生查阅和学习8 旭日苑共三层,主要的就餐场所9 体育馆内设篮球场,羽毛球场和观看席10 宿舍休息的场所5(查询景点信息)2(景点序号)2 喷泉呈鸽子形状,喷射出水花6(查询两景点最短路径)1 9(两景点序号)1->2->7->91->9 最短距离:570米2.异常测试数据及运行结果要求提供2组异常测试数据和运行结果9无此功能模块请重新输入5(功能模块)11(景点序号)无此景点请重新输入六.调试情况,设计技巧及体会1.改进方案1. 可将景点文件,边文件及账户密码合并为一个文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构地图课程设计含源码数据结构课程设计报告题目:XXXX大学校园导游系统院系名称:计算机学院专业名称:软件工程班级:2012级01班学生姓名:XX学号(8位):XX指导教师:XX设计起止时间:2013年12月16日~2013年12月27日一.设计目的进一步的了解图的遍历的问题,图的DFS,BFS的递归和非递归算法的实现,实现图的遍历,用邻接矩阵和邻接表的存储方式存储图。

初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。

训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。

训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。

提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

二. 设计内容1、设计并显示学校的校园平面图,地点(地点名称、地点介绍),路线(公里数)均不少于10个。

(文件存储)2、提供图中任意地点相关信息的查询。

3、提供图中任意地点的问路查询:1)任意两个地点之间的一条最短的简单路径;(最短路径长度——中转次数最少)2)任意两个地点之间的一条最佳访问路线;(带权(公里数)最短路径长度)3)任意两个地点之间的所有简单路径。

4、提供图中所有地点的最佳布网方案;5、增加新地点和路线、撤销旧地点和路线。

三.概要设计1.各个模块详细的功能描述。

int Locate(AdjMatrix *G,char name[]); 根据景点名称查找景点编号int VexExit(); 判断景点是否存在int Creat(AdjMatrix *G); 创建无向图void Savefile(AdjMatrix *G); 将图保存到文件中void Readfile(AdjMatrix *G); 从指定文件中读取信息并存入图中void ShowSchool(AdjMatrix *G); 显示校园全景图void ShowRoute(AdjMatrix *G); 显示图的所有路线void ShowVex(AdjMatrix *G); 显示图中所含景点的信息void Serach(AdjMatrix *G); 查找景点void AddRoute(AdjMatrix *G); 增加新路线void DeleteRoute(AdjMatrix *G); 删除旧路线void AddVex(AdjMatrix *G); 增加新景点void DeleteVex(AdjMatrix *G); 删除旧景点void Dijkstra(AdjMatrix *G,int start,int ending,int dist[],int path[][MAXVEX]);求起点到终点的最短路线void Prim(AdjMatrix *G,int start); 采用Prim算法求得最短连通路线void MiniSpanTree(AdjMatrix *G); 查询从某个景点的最短连通路线void DFS(AdjMatrix *G,int start,int ending,int stack[],int visited[]);深度遍历查找所有路径void SimpleRoute(AdjMatrix *G); 查询两个景点间的最优路径void SearchAllRoute(AdjMatrix *G); 输出两景点之间的所有路径void menu(); 显示主菜单void menu1(); 开始菜单界面void menu2(); 退出菜单界面四.详细设计1.功能函数的调用关系图;调用2.功能模块图:2.各功能函数的数据流程图;3.重点设计及编码。

(1)文件的保存与读取:1.将图的顶点数和边数写入文件2.将图的顶点名称和介绍写入文件,用for循环控制;3.将图中路线的起点和终点以及距离写入文件;4.文件的读取与保存原理一样。

编码:void Savefile(AdjMatrix *G); 将图保存到文件中void Readfile(AdjMatrix *G); 从指定文件中读取信息并存入图中(2)深度遍历:用递归的方法,从某个节点出发,访问此节点,然后依次从出发节点的各个未被访问的邻接点出发深度优先搜索遍历;将走过的路径存入数组中,找到终点时输出路径。

该函数模块用于查找两点之间的所有路径以及最优路径,找最优路径时,定义一个数组及最小值,每次最小值更新,就将路径值数组赋值到最优路径数组中去。

编码:void DFS(AdjMatrix *G,int start,int ending,int stack[],int visited[]);(3)最小生成树prim算法从图中的某一顶点v0出发,选择与它关联的具有最小权值的边,将其顶点加入到生成树的顶点集合中,以后的每一步从在生成树中的一个顶点,而另一个顶点不在生成树顶点集合中的各条边中选择权值最小的边,再把它的顶点加入到生成树顶点集合中,直到所有顶点都加入到生成树集合中编码:void Prim(AdjMatrix *G,int start); //采用Prim算法求得最短连通路线(4) 最短路径Dijkstra算法用带权的邻接矩阵存储该带权有向图,借助一个辅助的一维数组dist[ ]记录从源点到其余各顶点的最短距离值,二维数组path[ ][ ]记录某顶点是否加入到集合S 中,如果path[i][0]=1,则表示顶点Vi加入到集合S中,并且path[i]所在的行最终记录了从源点到Vi的最短路径上的各个顶点,否则,path[i][0]=0,则表示顶点Vi 还在集合V-S中。

编码:void Dijkstra(AdjMatrix *G,int start,int ending,int dist[],int path[][MAXVEX]);//求起点到终点的最短路线五.测试数据及运行结果1.正常测试数据(3组)及运行结果;(1)查询景点时输入正确景点编号(2)校园所有景点的信息(3)查询两点之间的最优路径2.非正常测试数据(2组)及运行结果。

(1)输入错误的景点编号(2)输入不存在的景点六.调试情况,设计技巧及体会1.对自己的设计进行评价,指出合理和不足之处,提出改进方案;好的地方:(1)在文件的存储方面比较满意,先将图的顶点数目和边的数目存入文件,再将顶点信息存入,最后将路线的信息存入文件中。

达到了将整个图存入文件的目的,相对于其他存储方法较为简洁且功能完善。

(2)对于查询、增加、删除部分,都先输出已有的景点路线信息,方便用户操作。

并且在用户输入错误时会有相应的错误处理。

(3)代码的格式比较整齐,易读。

考虑到了很多细节。

不足的地方:(1)每次对图进行操作,都要先从文件中读取重建一个图,比较繁琐;(2)在查找中转路径次数最少的时候调用了查找所有路径的函数,先是找到所有路径再对次数进行比较,并且若中转次数最少的路径不止一条时,最终只能输出一条路径,有缺陷,算法不够优化;2.对设计及调试过程的心得体会。

课程设计刚开始时,思路有点混乱,只知道用文件把图存起来,每次操作时将信息读入图中,具体该怎么实现,还真不知道。

看了一下课本,决定用邻接矩阵存储图。

图的存储方式决定好后,就开始文件的存储,个人觉得在文件的存储方面想法不错,但是在文件的写入与读取格式的地方出了一点小问题,在调试的过程中对文件又熟悉了一点。

这次课程设计不像以前马马虎虎,漏掉取址符,标点符号等,只会出现逻辑错误,在整个过程中也比较顺利。

当不会一些算法的时候,我会查阅资料以及上网百度。

把所有的功能实现后就开始细化自己的代码,比如对用户错误输入的错误处理,写小函数如VexExit来让程序更加模块化,以及对界面的改进,只希望自己的代码更加完美。

七.参考文献(1)数据结构(C语言版) 严蔚敏吴伟民编著清华大学出版社 2002(2)数据结构与算法王曙燕王春梅编著人民邮电出版社 2013八.附录:源代码(电子版)#include <stdio.h>#include <stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#include<limits.h>#include<windows.h>#define MAXVEX 20#define INFINITY 32768typedef struct //顶点类型{int num; // 景点的编号char name[20]; //景点的名称char introduce[100]; // 景点的介绍}Vextype;typedef struct //邻接矩阵{int arcs[MAXVEX][MAXVEX]; //边集,存放权值Vextype vex[MAXVEX]; //顶点集int vexnum; //顶点的数目int arcnum; //边的数目}AdjMatrix;int Locate(AdjMatrix *G,char name[]); //根据景点名称查找景点编号int VexExit(); //判断景点是否存在int Creat(AdjMatrix *G); //创建无向图void Savefile(AdjMatrix *G); //将图保存到文件中void Readfile(AdjMatrix *G); //从指定文件中读取信息并存入图中void ShowSchool(AdjMatrix *G); //显示校园全景图void ShowRoute(AdjMatrix *G); //显示图的所有路线void ShowVex(AdjMatrix *G); //显示图中所含景点的信息void Serach(AdjMatrix *G); //查找景点void AddRoute(AdjMatrix *G); //增加新路线void DeleteRoute(AdjMatrix *G); //删除旧路线void AddVex(AdjMatrix *G); //增加新景点void DeleteVex(AdjMatrix *G); //删除旧景点void Dijkstra(AdjMatrix *G,int start,int ending,int dist[],int path[][MAXVEX]); //求起点到终点的最短路线void Prim(AdjMatrix *G,int start); //采用Prim算法求得最短连通路线void MiniSpanTree(AdjMatrix *G); //查询从某个景点的最短连通路线void DFS(AdjMatrix *G,int start,int ending,int stack[],int visited[]); //深度遍历查找所有路径void SimpleRoute(AdjMatrix *G); //查询两个景点间的最优路径void SearchAllRoute(AdjMatrix *G); //输出两景点之间的所有路径void menu(); //显示主菜单void menu1(); //开始菜单界面void menu2(); //退出菜单界面int Locate(AdjMatrix *G,char name[]) //根据景点名称查找景点编号{int i;for(i=1;i<=G->vexnum;i++)if(!strcmp(name,G->vex[i].name))return i;return -1;}int VexExit(AdjMatrix *G,int index) //判断景点是否存在{if(index>0 && index<=G->vexnum)return 1;else{printf("该景点不存在!\n");return 0;}}int Creat(AdjMatrix *G) //创建无向图{int i,j,k,weight;char name[20];printf("请输入校园图中的景点数目和路线数目:\n");scanf("%d%d",&G->vexnum,&G->arcnum);for(i=1;i<=G->vexnum;i++) //权值数组初始化for(j=1;j<=G->vexnum;j++)G->arcs[i][j]=INFINITY;printf("请输入校园图中%d个景点的名称及介绍:\n",G->vexnum);for(i=1;i<=G->vexnum;i++){printf("请输入第%d个景点:",i);G->vex[i].num=i;//flushall();scanf("%s%s",G->vex[i].name,G->vex[i].introduce);}printf("请输入校园图中的%d条路线:\n",G->arcnum);for(k=1;k<=G->arcnum;k++) //存入路线{printf("请输入第%d条路线:\n",k);printf("起点:");scanf("%s",name);i=Locate(G,name);printf("终点:");scanf("%s",name);j=Locate(G,name);printf("距离:");scanf("%d",&weight);G->arcs[i][j]=weight;G->arcs[j][i]=weight;}return 1;}void Savefile(AdjMatrix *G) //将图保存到文件中{FILE *fp;int i,j;fp=fopen("Graph.txt","wt");if(!fp){printf("写文件出错,按任意键退出!\n");getch();exit(1);}fprintf(fp,"%d %d\n",G->vexnum,G->arcnum); //先将图的顶点数目和边集数目存入文件,便于控制下面程序的for循环for(i=1;i<=G->vexnum;i++) //接着存放顶点的信息fprintf(fp,"%s %s\n",G->vex[i].name,G->vex[i].introduce);for(i=1;i<=G->vexnum;i++) //最后存放边的信息即路线信息for(j=1;j<=i;j++)if(G->arcs[i][j]!=INFINITY)fprintf(fp,"%s %s %d\n",G->vex[i].name,G->vex[j].name,G->arcs[i][j]);printf("\n文件已成功保存,按任意键返回!\n");getch();fclose(fp);}void Readfile(AdjMatrix *G) //从指定文件中读取信息并存入图中{FILE *fp;int i,j;int start,ending;char startpoint[20],endpoint[20];int distance;fp=fopen("Graph.txt","rt");if(!fp){printf("读文件出错,按任意键退出!\n");getch();exit(1);}fscanf(fp,"%d%d",&G->vexnum,&G->arcnum); //先读取文件中的前两个整型,存入图的顶点数目和边数目中//对图的权值数组进行初始化for(i=1;i<=G->vexnum;i++)for(j=1;j<=G->vexnum;j++)G->arcs[i][j]=INFINITY;//从文件中读取顶点信息并存入图中for(i=1;i<=G->vexnum;i++){G->vex[i].num=i;fscanf(fp,"%s%s",G->vex[i].name,G->vex[i].introduce);}//从文件中读取路线并存入图中for(j=1;j<=G->arcnum;j++){fscanf(fp,"%s%s%d",startpoint,endpoint,&distance);start=Locate(G,startpoint);ending=Locate(G,endpoint);G->arcs[start][ending]=distance;G->arcs[ending][start]=distance;}}void ShowSchool() //显示校园全景图{printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("\t\t┃xxxxxxxx大学校园平面图┃\n");printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");printf("\t\t┃┏━━━━━━━━━━┓┃\n");printf("\t\t┃┃┃10.┃┃┃\n");printf("\t\t┃┃宿舍楼2 ┃━━━━━┃宿舍楼1 ┃┃\n");printf("\t\t┃┗━━━┳━┛15┃┣━━━━━┫┃\n");printf("\t\t┃11. ┃180 ┃10┃70┃┃\n");printf("\t\t┃┏┻┓150 ┏━━┻━━━━┓┃┏┻┓┃\n");printf("\t\t┃┃体┣━━━┫旭日苑┣╝┃美┃┃\n");printf("\t\t┃8.┃育┃9.┗━━┳━━━━┛7.┃食┃┃\n");printf("\t\t┃┃馆┃┃┃广┃┃\n");printf("\t\t┃┗┳┛┃200 ┃场┃┃\n");printf("\t\t┃┃┃┗┳┛┃\n");printf("\t\t┃┃60 6. ┃┃┃\n");printf("\t\t┃┃━━┳━━━━┻━┓130┃┃\n");printf("\t\t┃┃图书馆┣╬━━━╝┃\n");printf("\t\t┃80 ┗━━┳━━━┛ 4.┏━┻━━━┓┃\n");printf("\t\t┃┣━━┓━━╝┃┃┃\n");printf("\t\t┃ 5. ┃大活┃┏┻┳┛┃\n");printf("\t\t┃┃学动┃┃实验楼┃┃\n");printf("\t\t┃┃生中┃┏┻┳┛┃\n");printf("\t\t┃┃心┃┃┃┃\n");printf("\t\t┃┗┳━┛20 ┗━┳━━━┛┃\n");printf("\t\t┃┃100 2.┏━━━┻━┓┃\n");printf("\t\t┃┃┃教学楼┃┃\n");printf("\t\t┃┏━━┻┓40 50 ┗━━┳━━┛┏━━━┓┃\n");printf("\t\t┃ 3.┃行政楼┣━━━━━━━━━━╝┃南┃┃\n");printf("\t\t┃┗━━━┛┃┃东╋西┃┃\n");printf("\t\t┃┏━┻━━━┓┃北┃┃\n");printf("\t\t┃ 1.┃北门┃┗━━━┛┃\n");printf("\t\t┗━━━━━━━━┻━━━━━┻━━━━━━━━━━━┛\n");}void ShowRoute(AdjMatrix *G) //显示图的所有路线{int i,j;printf("\n校园里一共有%d条路线.\n\n",G->arcnum);for(i=1;i<=G->vexnum;i++)for(j=1;j<=i;j++)if(G->arcs[i][j]!=INFINITY)printf("%s<--->%s \t距离为:%dm\n",G->vex[i].name,G->vex[j].name,G->arcs[i][j]);}void ShowVex(AdjMatrix *G) //显示所有景点{int i;printf("校园共有%d个景点,编号、名称及介绍如下:\n\n",G->vexnum);for(i=1;i<=G->vexnum;i++)printf("%d.%s: \t%s\n",i,G->vex[i].name,G->vex[i].introduce);}void Serach(AdjMatrix *G) //查询景点{int i,n;char name[20];printf("请选择你要查询的方式:\n");printf("1.编号 2.名称\n");scanf("%d",&n);if(n == 1){printf("请输入景点的编号(1~~%d):",G->vexnum);scanf("%d",&n);if(VexExit(G,n)){printf("该景点情况及周围景点如下:\n");printf("\n%d.%s %s\n\n",n,G->vex[n].name,G->vex[n].introduce);for(i=1;i<=G->vexnum;i++) //找出与该景点相关的路线if(G->arcs[n][i] != INFINITY)printf("%s<--->%s: %dm\n",G->vex[n].name,G->vex[i].name,G->arcs[n][i]);}}else if(n == 2){printf("该校园有以下景点,请选择:\n");for(i=1;i<=G->vexnum;i++)printf("%s\t ",G->vex[i].name);printf("\n\n请输入要查询景点的名称:");scanf("%s",name);n=Locate(G,name); //通过名称找到该景点的序号if(VexExit(G,n)){printf("\n该景点名称、介绍及可以直达的景点如下:\n");printf("\n%d.%s %s\n\n",n,G->vex[n].name,G->vex[n].introduce);for(i=1;i<=G->vexnum;i++)if(G->arcs[n][i]!=INFINITY)printf("%s<--->%s: %dm\n",G->vex[n].name,G->vex[i].name,G->arcs[n][i]);if(i>G->vexnum+1)printf("此景点为独立的点,返回!\n");}}elseprintf("输入错误,返回!\n");}void AddRoute(AdjMatrix *G) //增加新路线{char name[20];int start,ending,distance;ShowRoute(G);printf("\n请输入要增加路线的起点和终点名称:\n");printf("\n起点:");scanf("%s",name);start=Locate(G,name);printf("终点:");scanf("%s",name);ending=Locate(G,name);printf("距离:");scanf("%d",&distance);//将新路线的距离存入权值数组中G->arcs[start][ending]=distance;G->arcs[ending][start]=distance;G->arcnum++; //图的边集加1printf("添加新路线成功。

相关文档
最新文档