数据结构课程设计——校园导游图

合集下载

数据结构试验报告校园导游

数据结构试验报告校园导游

《数据结构》课程设计报告课程名称:《数据结构课程设计》;课程设计题目:校园导游查询;姓名:张晓艺;院系:计算机学院;专业:数字媒体技术;年级:大二;学号:10054220 ;指导教师:王立波;2011 年12 月17 日1 课程设计的目的 (x)2 需求分析 (x)3 课程设计报告内容 (x)1、概要设计 (x)2、详细设计 (x)3、调试分析 (x)4、用户手册 (x)5、测试结果 (x)6、程序清单 (x)4 小结5 参考文献1. 课程设计的目的:(1)熟练运用C++ 编写程序;(2 )会用Floyd 算法查找最短路径;2. 需求分析:1. 题目:【校园导游咨询】[问题描述](1 )设计你的学校的校园平面图,所含景点不少于10 个。

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

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

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

[测试数据] 由读者根据实际情况指定。

2. 任务:通过此程序可实现以下功能:(1 )用一维数组存放景点信息,二维数组存放景点间的距离,最短距离,最短路径;(2 )Floyd 算法计算最短距离和路径;(3 )根据景点序号查询景点的一系列信息,及两景点间的最短路径和最短距离。

3. 测试数据:查询类型:I (表示查询景点信息);景点编号: 3 ;查询类型: D (表示查询景点间的最短路径和最短距离);景点编号: 1 9 ;3. 课程设计报告内容:1. 概要设计:(1 )首先我画了学校主要几个景点的分布图以及自己定的一些距离,图如下:struct Date{int num; char n ame[50]; char in troduce[100]; };(3 )然后我定义了一个类,定义如下:class Travel {private:Date date[15]; int dista nce[15][15]; int Path[15][15];int ShortestDista nce[15][15]; void Floyd(); public:Travel(); ~Travel(){}void In troduce(i nt); void Sca nf();void ShortDista nce(i nt,i nt); }; (4)基本操作: void Floyd();8C2030202010⑦①④(2 )接着我定义了一个顶点结构体,定义如下:II 景点编号//景点名称 II 景点介绍IIFloyd 算法,计算最短路径和最短距离Travel 。

校园导游系统数据结构图

校园导游系统数据结构图

西安郵電學院数据结构实验报告题目:校园导游系统院系名称:计算机学院专业名称:计算机科学与技术班级: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()函数,用于查询用户所选的任意两个景点间的最短路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的最短路径,否则返回重新输入。

校园导游图系统数据结构实验报告

校园导游图系统数据结构实验报告
3.选择出发点和目的地:用户输入一个出发点和一个目的地编号,采用弗洛伊德算法求出发点到目的地的最短路径
4.查看景点信息:直接用编号进行单个景点查询。
四.详细设计
重点设计及编码
在求最短路径时采用迪杰斯特拉算法
//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点
void ShortestPath_DIJ(MGraph * G)
(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,
边上的权值表示距离.为此图选择适当的数据结构。
(2)把各种路径都显示给游客,由游客自己选择浏览路线。
(3)画出景点分布图于屏幕上。
[实现提示]
(1)构造一个无向图G并用邻接矩阵来存储。
(2)利用迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径用二维数组p[i][]来记录,
if(D[v]<INFINITY)
{p[v][v0]=1;p[v][v]=1;} //v0到v有边相连,修改p[v][v0]的值为1
}//各顶点自己到自己要连通
D[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v属于s集
for(i=1;i<G->vexnum;i++) //对其余g.vexnum-1个顶点w,依次求v到w的最短路径
}
for(v=0;v<G->vexnum;v++)
{
final[v]=0;//初始化各顶点访问标志
D[v]=G->arcs[v0][v].adj; //v0到各顶点v的权值赋值给d[v]
for(w=0;w<G->vexnum;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0

数据结构课程设计——校园导游图

数据结构课程设计——校园导游图

景德镇陶瓷学院信息工程学院班级:11计科(2)班学号:*************名:**指导老师:李娟、徐星时间:2013年6月27号题目:13*:图(校园导游图)7 :建立二叉树,层序、先序遍历14 :拓扑排序题目一:图(校园导游图)1.1、需求分析:需求:(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离。

为此图选择适当的数据结构。

(2)把各种路径都显示给游客,由游客自己选择游览路线。

(3)画出景点分布图于屏幕上。

分析:完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。

有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。

(4).依照景点的相关信息创建校园图。

(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。

(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。

(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。

1.2、设计与实现:选出本校10个景点结合景德镇陶瓷学院实际情况,我选出以下10个景点,从1到10编号:图的初始化由于邻接矩阵特殊的存储方式,它非常便于快速的查找两个顶点之间的边上的权值。

所以,图采用带权的邻接矩阵存储。

决定了图的存储方式后,以华南农业大学10个景点的游览地图作为蓝本,把校园地图抽象化成顶点与边构成的图形式,如图2.2所示,途中数字代表线的权值。

1.3、模块的划分含有四个模块:(1)陶院地图信息(2)陶院景点信息(3)查找两点间最短路径(4)退出模板功能(1)将陶院的地图显示在程序运用上;(2)输入一个景点,运用程序上能够显示该景点的信息;(3)可以给游客提供两个景点的最短路径;(4)给游客提供方便。

数据结构课程设计-校园导航

数据结构课程设计-校园导航

课程设计报告课程名称数据结构课程设计题目校园导航指导教师设计起始日期学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析本次实验设计的任务是实现一个简易的北京信息科技大学的校园导航平面图。

设计要包括下列要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。

本课题实现校园多个场所(至少10个)的最短路径求解。

(1)输入的形式和输入值的范围:本系统主要数据类型为字符型char及整形int,char型主要包括单位编号,单位名称,单位简介,功能编号;输入功能编号与单位编号进行操作。

(2 ) 输出的形式:输出则通过已有的信息数据,通过相关的操作输出相应信息。

(3) 程序所能达到的功能:本程序可供任何人使用,主要功能 1.浏览各单位及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看某一单位信息。

(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

a.首先看到的是校园导航系统的菜单:b.查看浏览路线等待输入起始景点:C.选择出发点与目的地等待输入起始景点与目的地编号:d.参看景点信息等待输入景点编号:二、概要设计本系统包含一个文件。

设计分有菜单,显示信息,弗洛伊德算法,迪杰斯特拉算法,查找景点信息等程序段。

主程序为整系统的入口处,菜单主要实现显示系统功能,显示信息主要实现显示景点信息,弗洛伊德算法主要实现求两景点之间最短路径,迪杰斯特拉算法实现求两景点之间最短路径,查找景点信息主要实现显示某一景点信息。

系统首先通过主程序调用void main( );进入系统主菜单函数,根据用户的选择可分别进入:1.浏览各景点及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看景点信息;5.退出系统。

选择“浏览各景点及简介”项,显示十个景点的有关信息,包括景点编号,景点名称,景点简介。

数据结构课程设计--校园导航图

数据结构课程设计--校园导航图
extern void Dispath(int dist[],int path[],int s[],int v,int i);
extern void Ppath(int path[],int i,int v);
void Point(MGraph p)
{
int x,y;
printf("请输入您所在的位置及目的地\n");
{8,32767,32767,8,32767,32767,6,32767,32767}};
p.n=M;p.e=N;
int i,j;
for(i=1;i<=M;i++)
for(j=1;j<=M;j++)
p.edges[i][j]=a[i][j];
for(i=1;i<=M;i++)
p.vexs[i].no=i;
typedef struct mgraph
{ int edges[MAXV][MAXV];
int n,e;//元素总个数边数
VertexType vexs[MAXV];
}MGraph;
extern void Check();
extern void Order(MGraph);
extern void Point(MGraph);
extern void Out(int x);
void Order(MGraph p)
{
int a[M+1][M+1];
a[M+1][M+1]={{0,1,2,3,4,5,6,7,8},
{1,0,5,32767,32767,32767,32767,32767,32767},
{2,5,0,10,8,32767,32767,32767,32767},

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

校园导游图

校园导游图

《数据结构》课程设计报告设计题目校园导游图学院名称信息工程学院专业班级计算机科学与技术(2)班姓名晁勉学号 1212210226一. 题目:校园导游图二. 设计目标通过设计一个校园导游图,进一步理解数据结构中有关于图的基本概念、定义术语、存储结构等,理解图在描述现实问题中的能力,明白数据结构在程序设计中的重要性等。

三. 问题描述给出学校的导游图(景点不少于10个),游客通过终端询问可知:任一景点的相关信息:从某一景点到另一景点的最短简单路径;游戏从校园大门进入,选一条最佳路线,使游客可以不重复地游览个景点,最后回到出口(出口就在入口旁边)。

四. 需求分析需求:(1)将导游图看作一张带权无向图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息;(2)可以通过菜单提示操作,浏览校园全部景点;(3)查看所有游览路线,将某个景点的所有路线展示给游客;(4)选择出发点和目的地,将最短路线展示给游客;(5)输入景点编号,查看某个景点的信息。

分析:完成对整个校园导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。

有以下设计思路:(1)结合本校的实际情况,选出10个景点;(2)为选出的10个景点赋上相关信息(景点编号、名称、简介);(3)根据选出来的10个景点用邻接矩阵存储校园图。

(4)利用C语言和数据结构编写实现校园导游图系统各功能的实现;(5)根据人为赋值的路权,设计算法计算任意两点之间的最短路径并显示;(6) 综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。

五. 概要设计程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。

六. 详细设计采用C语言定义相关的数据类型写出各模块的类C码算法图的定义typedefstructArCell{intadj; //路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedefstruct //图中顶点表示主要景点,存放景点的编号、名称、简介等信息,初始化图形MGraph * CreatUDN(MGraph *G)//接受用户输入{inti,j,k,w;char v1[20],v2[20];printf("请输入图的顶点数,弧数:");scanf("%d%d",&G->vexnum,&G->arcnum);printf("请输入景点的编号、名称、简介:\n");for(i=0;i<G->vexnum;i++){printf("景点编号:");scanf("%d",&G->vexs->num);printf("景点名称:");scanf("%s",G->vexs[i].name);printf("景点简介:");scanf("%s",G->vexs->introduction);}for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j].adj=INFINITY;printf("请输入路径长度:\n");for(k=0;k<G->arcnum;k++){printf("第%d条边:\n",k+1);printf("景点对(x,y):");scanf("%s",v1);scanf("%s",v2);printf("路径长度:");scanf("%d",&w);i=LocateVex(G,v1);j=LocateVex(G,v2);if(i>=0&&j>=0){G->arcs[i][j].adj=w;G->arcs[j][i]=G->arcs[i][j];}}return G;}主菜单void main(){printf("\n 榆林学院导游图 \n");printf("********************************************\n");printf(" * 1.浏览校园全景 *\n");printf(" * 2.查看所有游览路线 *\n");printf(" * 3.选择出发点和目的地 *\n");printf(" * 4.查看景点信息 *\n");printf(" * 5.退出系统 *\n");printf(" ********************************************\n");printf("请选择您所需要的操作:");}画出主要函数的流程图七.测试分析白盒:查看代码完整性代码完整。

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统在当今数字化的时代,信息的高效获取和处理变得至关重要。

对于一个大型校园来说,拥有一个便捷的导游咨询系统能够极大地提升访客和新生的体验。

本次数据结构课程设计的目标就是创建一个实用的校园导游咨询系统。

一、系统需求分析首先,我们需要明确这个校园导游咨询系统的主要功能和用户需求。

对于访客和新生来说,他们可能希望了解校园内各个景点的位置、简介,以及如何从当前位置到达目标景点的最优路径。

系统应该能够提供清晰准确的地图信息、景点介绍和导航指引。

从学校管理的角度出发,系统需要易于更新和维护,能够及时添加新的景点或者修改已有景点的信息。

同时,为了保证系统的稳定性和安全性,需要有一定的权限管理机制,防止未经授权的修改和访问。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理校园的相关信息。

对于校园地图的表示,可以使用图(Graph)这种数据结构。

将校园中的各个景点看作图中的节点,景点之间的道路看作边,边的权重可以表示道路的长度或者行走所需的时间。

为了存储景点的详细信息,如名称、简介等,可以使用结构体或者类。

每个景点的结构体或类成员包含景点的标识符、名称、简介等属性。

对于路径搜索和导航,我们可以选择迪杰斯特拉(Dijkstra)算法或者 A算法来计算最短路径。

三、系统功能模块设计1、地图显示模块能够以直观的方式展示校园的地图,包括各个景点的位置和连接关系。

支持缩放、平移等操作,方便用户查看不同区域的细节。

2、景点信息查询模块用户可以输入景点名称或关键词,系统能够快速检索并显示相应景点的详细信息。

3、路径规划模块根据用户输入的起始景点和目标景点,计算并显示最优的行走路径。

能够提供多种路径选择,如最短路径、最少转弯路径等。

4、周边设施查询模块用户可以查询某个景点周边的餐厅、商店、卫生间等设施的位置。

5、用户管理模块只有授权的管理员能够对校园景点信息和地图进行修改和更新。

数据结构旅游区导航图课程设计

数据结构旅游区导航图课程设计

《数据结构课程设计》报告题目旅游区导游图专业计算机科学与技术班级(2)班学生###13 旅游区导游图题目内容问题描述:设某个旅游区共有n个旅游景点(n≥10),每个旅游景点都和相邻的m个旅游景点(m≥2,m<n)有直接的道路(有对应的距离)相通,请设计一个简易的旅游区导游系统。

以(V i,V j,d)的形式从键盘输入建立该旅游区的旅游景点图,其中:V i和V j 表示两个不同的旅游景点,d表示这两个景点之间的道路距离;该旅游景点图采用邻接矩阵存储结构(数组)。

实现要求:⑴旅游景点图的输出:分别以邻接矩阵、邻接链表的方式输出该旅游景点图。

⑵相邻景点查询:假设对于每个景点,设置有简易的信息查询,要求能给出与该景点相邻的所有景点(有直接的道路相通)及对应的距离。

⑶景点路线查询:假设对于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。

⑷景点路线综合查询:对于该旅游区的任意两个景点,找出它们之间的最短简单路径及距离。

⑸最佳旅游路线确定:假设该旅游区的入口也是出口,请确定一条最佳的旅游线路,该线路必须经过所有的旅游景点(有些景点可以重复经过)且走的路最短。

⑹设计一个菜单,上述操作要求都作为菜单中的主要菜单项。

⒈本人完成的工作完成的工作:首先是用邻接矩阵的存储形式建立无向带权图,然后将邻接矩阵转换为邻接链表,最后用狄克斯特拉函数求出后面的三道有关最短路径的小题,设计主函数。

⒉所采用的数据结构邻接矩阵的数据结构,包括(弧/边的结构定义、图的结构定义)邻接链表的数据结构,包括(弧/边的结点定义、邻接表头结点定义、图的结构定义)数据结构的定义//邻接矩阵结构体typedef struct{ char vex1, vex2 ; /* 弧或边所依附的两个顶点 */int ArcVal ; /* 弧或边的权值 */}ArcType ; /* 弧或边的结构定义 */typedef struct{int vexnum, arcnum ; /* 图的当前顶点数和弧数 */char vexs[MAXVEX] ; /* 顶点向量 */int adj[MAXVEX][MAXVEX];}MGraph ; /* 图的结构定义 *///邻接链表结构体typedef struct ANode //弧的结点结构类型{ int adjvex; //该弧的终点位置int info; //该弧的相关信息,这里用于存放权值struct ANode *nextarc; //指向下一条弧的指针} ArcNode;typedef struct Vnode //邻接表头结点的类型{char data; //顶点信息ArcNode *firstarc; //指向第一条弧} VNode;typedef struct{VNode AdjList[MAXVEX];int vexnum,arcnum; //图中顶点数n和边数e} ALGraph; //图的邻接表类型⒊所设计的函数对于每个主要函数必须给出所采用的算法思想和程序框图;邻接矩阵和邻接链表初始化函数MGraph *Init_MGraph()/* 图的初始化 */{MGraph *G;G=(MGraph *)malloc(sizeof(MGraph)) ;G->vexnum=0 ; G->arcnum=0 ; /* 初始化顶点数、边数 */ return(G) ;}ALGraph *Init_ALGraph()/* 图的初始化 */{ALGraph *G;G=(ALGraph *)malloc(sizeof(ALGraph)) ;G->vexnum=0 ;G->arcnum=0; /* 初始化顶点数 */return(G) ;}图中顶点定位的函数,判断顶点是否重复输入了int LocateVex(MGraph *G, char vp)/* 图中顶点的定位,若图中有顶点vp,返回其在顶点数组的下标值 */ {int k ;for (k=0; k<=G->vexnum; k++)if (G->vexs[k]==vp) return(k) ;}{int k, j ;if (G->vexnum>=MAXVEX)printf("图中顶点数已达到最多 !\n");else{if (LocateVex(G, vp)==-1){k=G->vexnum ; G->vexs[G->vexnum++]=vp ;for (j=0 ; j<G->vexnum ; j++){G->adj[j][k]=INFINITY ;G->adj[k][j]=INFINITY ;/* 是带权的有向图或无向图 */}}}往图的邻接矩阵中添加边(弧)void AddArc(MGraph *G , ArcType *arc)/* 往图的邻接矩阵中添加边(弧) */{int k=0, j=0;k=LocateVex(G, arc->vex1) ;j=LocateVex(G, arc->vex2) ;if (k==-1||j==-1)printf("边或弧的顶点不存在,错误 !\n") ;else{G->arcnum++ ;G->adj[k][j]=arc->ArcVal ;G->adj[j][k]=arc->ArcVal ;/* 是无向图或带权的无向图,需对称赋值 */}输出图的顶点矩阵和邻接矩阵void output_graphic(MGraph *G)/* 输出图的顶点矩阵和邻接矩阵 */ {int k, j ;printf("图的顶点如下:\n") ;for (k=0; k<G->vexnum; k++)printf("%4c",G->vexs[k]) ;printf("\n\n") ;printf("图的邻接矩阵如下:\n") ; for (k=0; k<G->vexnum; k++){for (j=0; j<G->vexnum; j++)}}Y以邻接矩阵作为图的存储结构建立图MGraph *create_graph()/* 以邻接矩阵作为图的存储结构建立图 */{char inchar[100], enchar[100],fvex,lvex ;int count=0;int weight ;MGraph *G;ArcType *arc ;printf("首先进行图的初始化!!\n\n") ;G=(MGraph *)malloc(sizeof(MGraph)) ;G=Init_MGraph() ;arc=(ArcType *)malloc(sizeof(ArcType)) ;printf("\n请以(顶点,顶点,权值)的形式输入图的边(或弧),第一个顶点是?表示结束:\n") ;while(1){scanf("%s",inchar) ;fvex=inchar[0] ; /* 输入第一个顶点,?结束 */if (fvex=='?') break ;else{AddVertex(G, fvex) ;scanf("%s",enchar) ;lvex=enchar[0] ;AddVertex(G, lvex) ;scanf("%d",&weight) ; /* 输入第二个顶点和权值 */arc->vex1=fvex ; arc->vex2=lvex ;arc->ArcVal=weight ; AddArc(G, arc) ;printf("\n请继续输入下一条边(或弧)!!\n") ;}}return(G) ;}将邻接矩阵g转换成邻接表GALGraph *MGraphToALGraph(MGraph *g,ALGraph *G){int i,j,n=g->vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));G->arcnum = g->arcnum;G->vexnum = g->vexnum;for(i=0;i<G->vexnum;i++)G->AdjList[i].firstarc = NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素{for (j=n-1;j>=0;j--)if (g->adj[i][j]!=INFINITY) //邻接矩阵的当前元素不为{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pG->AdjList[j].data=g->vexs[j];p->adjvex = g->vexs[j];p->info=g->adj[i][j];p->nextarc=G->AdjList[i].firstarc; //将*p链到链表后G->AdjList[i].firstarc=p;}}return G;}邻接链表的输出void output_graphic_c(MGraph *g,ALGraph *G) {int i;ArcNode *p;for (i=0;i<g->vexnum;i++){printf("%c",G->AdjList[i].data) ;p=G->AdjList[i].firstarc;while(p!=NULL){printf("%s","->") ;printf("(%c,%d)",p->adjvex,p->info) ;p=p->nextarc ;}printf("\n\n");}}相邻景点查询并输出void output_Find_ALGraph(ALGraph *G){ /* 相邻景点查询并输出 */int j;ArcNode *p;printf("请输入你要查询的景点(下标值):\n");scanf("%d",&j);p=G->AdjList[j].firstarc;while(p){printf("景点%c到景点%c的距离是%d (该两个景点之间有直接的道路相通)\n",G->AdjList[j].data,p->adjvex,p->info);p=p->nextarc;}}景点路线查询:假设对于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统1:需求分析:(1)任务:编制一个为来访客人进行最短路径导游的程序(2)要求:从学校的平面上选取n个有代表性的景点,根据用户指定的起点和终点输出相应路径。

2:概要设计:(1)1)a)AdjMGraph.h图操作的函数所放的头文件b) AdjMGraphCreate.h图的创建函数所放的头文件c) Dijkstra.h狄克斯特拉函数设计所放的头文件d) SeqList.h存放顺序表的头文件2)SchoolGuide.c文件包括以下三个函数void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j)函数,其功能是将源点到各个结点的最短距离和最短路径的结果输出;void Sgblueprint()函数,其功能是将校园平面图输出;void main(void)函数,主函数,功能是调用测试数据值,显示主菜单,根据用户输入的i进行不同功能操作,随后根据用户输入的ch值进行不同功能操作。

(2)该程序所使用的存储结构是顺序存储;(3)流程图:图1-1主函数main()流程图图1-2 SgPrint函数流程图3:详细设计:(1)/*顺序表头文件SeqList.h*/typedef struct{DataType list[MaxSize];int size;}SeqList;void ListInitiate(SeqList *L) /*初始化顺序表L*/ {L->size=0; /*定义初始化数据元素个数*/}int ListLength(SeqList L) /*返回顺序表L的当前数据元素个数*/{return L.size;}int ListInsert(SeqList *L,int i,DataType x)/*在顺序表L的第i(0≤i≤size)个位置前插入数据元素值x*//*插入成功返回1,插入失败返回0*/{int j;if(L->size>=MaxSize){printf("顺序表已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数i不合法!\n");return 0;}else{/*为插入做准备*/for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;/*插入x*/L->size++;/*元素个数加1*/return 1;}}int ListDelete(SeqList *L,int i,DataType *x){/*删除顺序表L中位置为i(0≤i≤size-1)的数据元素并存放到x中*/ /*删除成功返回1,删除失败返回0*/int j;if(L->size<=0){printf("顺序表已空无数据元素可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法");return 0;}else{*x=L->list[i]; /*保存删除的元素到x中*//*依次前移*/for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}}int ListGet(SeqList L,int i,DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1.失败返回0*/ {if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}}(2)/*AdjMGraph.h图操作的函数所放的头文件*/#include"Seqlist.h"/*包含顺序表头文件*/typedef struct{SeqList Vertices;/*存放结点的顺序表*/int edge[MaxVertices][MaxVertices];/*存放边的邻接矩阵*/ int numOfEdges;/*边的条数*/}AdjMGraph;/*图的结构体定义*/void Initiate(AdjMGraph *G,int n)/*初始化*/{int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) G->edge[i][j]=0;else G->edge[i][j]=MaxWeight;}G->numOfEdges=0;/*边的条数置为0*/ListInitiate(&G->Vertices);/*顺序表初始化*/}void InsertVertex(AdjMGraph *G,DataType vertex)/*在图G中插入结点vertex*/{ListInsert(&G->Vertices,G->Vertices.size,vertex);/*顺序表尾插入*/}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/*在图G中插入边<v1,v2>,边<v1,v2>的权为weight*/if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=weight;G->numOfEdges++;}void DeleteEdge(AdjMGraph *G,int v1,int v2)/*在图G中删除边<v1,v2>*/{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;}void DeleteVerten(AdjMGraph *G,int v)/*删除结点V*/{int n=ListLength(G->Vertices),i,j;DataType x;for(i=0;i<n;i++)/*计算删除后的边数*/for(j=0;j<n;j++)if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight) G->numOfEdges--;/*计算被删除边*/for(i=v;i<n;i++) /*删除第v行*/for(j=0;j<n;j++)G->edge[i][j]=G->edge[i+1][j];for(i=0;i<n;i++) /*删除第v列*/for(j=v;j<n;j++)G->edge[i][j]=G->edge[i][j+1];ListDelete(&G->Vertices,v,&x);/*删除结点v*/}int GetFirstVex(AdjMGraph G,int v)/*在图G中寻找序号为v的结点的第一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*/int col;if(v<0||v>G.Vertices.size){printf("参数v越界出错\n");exit(1);}for(col=0;col<G.Vertices.size;col++)if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)return col;return -1;}int GetNextVex(AdjMGraph G,int v1,int v2)/*在图G中寻找v1结点的邻接结点v2的下一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*//*v1和v2都是相应结点的序号*/{int col;if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}for(col=v2+1;col<G.Vertices.size;col++)if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight) return col;return -1;}(3)/*AdjMGraphCreate.h图的创建函数所放的头文件*/typedef struct{int row;/*行下标*/int col;/*列下标*/int weight;/*权值*/}RowColWeight;/*边信息结构体定义*/void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) /*在图G中插入n个结点信息V和e条边信息E*/{int i,k;Initiate(G,n);/*结点顺序表初始化*/for(i=0;i<n;i++)InsertVertex(G,V[i]);/*结点插入*/for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight);/*边插入*/}(4)/* Dijkstra.h狄克斯特拉函数设计所放的头文件*/void Dijkstra(AdjMGraph G,int v0,int distance[],int path[])/*带权图G从下标v0结点到其他结点的最短距离distance*//*和最短路径下标path*/{int n=G.Vertices.size;int *s=(int *)malloc(sizeof(int)*n);int minDis,i,j,u;/*初始化*/for(i=0;i<n;i++){distance[i]=G.edge[v0][i];s[i]=0;if(i!=v0&&distance[i]<MaxWeight) path[i]=v0;else path[i]=-1;}s[v0]=1;/*标记结点v0已从集合T加入到集合S中*//*在当前还未到最短路径的结点集中选取具有最短距离的结点u*/for(i=1;i<n;i++){minDis=MaxWeight;for(j=0;j<n;j++)if(s[j]==0&&distance[j]<minDis){u=j;minDis=distance[j];}/*当已不再存在最短路径时算法结束;此语句对非连通图是必须的*/if(minDis==MaxWeight)return;s[u]=1;/*标记结点u已从集合T加入到集合S中*//*修改从v0到其他结点的最短距离和最短路径*/for(j=0;j<n;j++)if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) {/*结点v0经结点u到其他结点的最短距离和最短路径*/distance[j]=distance[u]+G.edge[u][j];path[j]=u;}}}(5)/*SchoolGuide.c文件*/#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxWeight 10000#include"AdjMGraph.h"#include"AdjMGraphCreate.h"#include"Dijkstra.h"void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j){ /*输出源点到其他各结点的最短距离和最短路径*/int i;/*从源结点到其他各结点的最短路径及其距离分别为:*/printf("从该结点%c到其他各结点的最短路径及其距离分别为:\n",g.Vertices.list[j]);printf("\n");//输出换行符for(i=0;i<n;i++){ /*从源结点到当前结点的最短路径为*/printf("从结点%c到结点%c的最短路径为:",g.Vertices.list[j],g.Vertices.list[i]);printf("(");//输出左括号if(path[i]!=-1)//源点到其他结点的最短路径的前一结点判断{ if(path[path[i]]!=-1)//该前一结点的前一结点进行判断{if(path[path[path[i]]]!=-1)//该前一结点的前一结点的前一结点进行判断{printf("%c,",g.Vertices.list[path[path[path[i]]]]);//输出相应存在的前一结点}printf("%c,",g.Vertices.list[path[path[i]]]);//输出应存在的前一结点}printf("%c,",g.Vertices.list[path[i]]);//输出应存在的前一结点}printf("%c",g.Vertices.list[i]);//输出当前结点printf(")");//输出换行符右括号printf(",其最短距离为%d;\n",distance[i]);//输出源点到其他结点的最短距离printf("\n");//输出换行符}}void Sgblueprint(){/*显示校园平面图*/printf(" ——————校园平面图——————\n");printf(" B(学生宿舍)———————————————————E(商业街)\n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf(" / \\(B到D) /| \n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf("A(校门口) ———————————————————D(学校食堂和 | \n");printf("| 学校田径场(学校田径场在学校食堂后面)) \\ | \n");printf("| \\(D到F)| \n");printf("| \\| \n");printf("C(第一、第二教学楼和校办) ———————————————————F(第三教学楼和实验楼)\n");}void main(void){AdjMGraph g;char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}};int i,j,n=6,e=9;//i为控制控制菜单项的数值,j为选取源点的数值char ch;int distance[6],path[6];printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i); //输入控制控制菜单项的数值i的值CreatGraph(&g,a,n,rcw,e);//创建图switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}while(3)//判断程序是否继续运行{printf("\n您是否还想进行其他操作(y/n):\n");//提示用户是否还需继续进行其他操作scanf("%s",&ch);//用户输入y/n以选择是否仍需进行其他操作if(ch=='Y'||ch=='y')//判断用户所输入的ch值是否为y/Y,以判断用户是否进行其他操作{system("cls");printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i);switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}}else return;//退出程序}}4:调试分析:(1)a)测试数据:char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}}; int n=6,e=9;b)测试结果:(2)所遇到的问题:1)SgPrint函数中的形参如何设置,通过仔细分析图的操作等头文件和主函数,最终分析函数SgPrint中应加入形参AdjMGraph g,int n,int distance[],int path[],int j;2)Sgblueprint函数中输出语句中想输出’\’,直接键入’\’发现不能输出’\’,最终查看消息窗口的提示信息和联系C语言中有关转义字符的相关知识,知道了如果相输出转义字符’\’本身就必须书写成’\\这样的格式;3)在进行菜单项操作时,如何做到清除原有屏幕的操作,通过上网查资料了解到,只需加入“system(“cls”);”该语句即可;4)SgPrint函数中如何实现输出如“从结点A到结点B的最短路径为:(A,C,B),其最短距离为20;”格式,通过分析Dijkstra.h和主函数,最终想到只需添加“if(path[i]!=-1){ if(path[path[i]]!=-1){if(path[path[path[i]]]!=-1){printf("%c,",g.Vertices.list[path[path[path[i]]]]);}printf("%c,",g.Vertices.list[path[path[i]]]);}printf("%c,",g.Vertices.list[path[i]]);}”这些代码,对源点到其他结点的最短路径的前一结点以及该前一结点的前一结点进行判断,并将这些结点输出,就能够解决上述问题。

数据结构试验报告—导游图

数据结构试验报告—导游图

实验报告:导游图姓名:石栋伟班级:计师一班学号:222013321081006一、需求分析:1.从全国选取各个省份的省份城市作为旅游景点,抽象成为一个无向带权图。

以途中的顶点作为旅游景点,边上的权值表示两地之间的距离。

同时,本程序还可以为用户提供旅游景点的信息。

2.本程序的目的是为用户提供路径咨询。

根据用户指定的起点和终点输出相应的路径已经之间的距离。

3.为用户提供图中任意景点的路径查询,即查询任意两个景点之间的最短简单路径。

当用户输入正确时,为用户输出任意两景点的最短路径;当用户输入不合法时,提示用户输入有误并返回让用户重新输入。

4.测试数据(附后)二、概要设计:1.抽象数据类型图的定义如下:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在路径}基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中边的集合。

操作结果:按V和VR的定义构造图G。

DestroyGraph(&G)初始条件:图G存在。

操作结果:销毁图G。

LocateVex(G,u)初始条件:图G存在,u和G中顶点有相同特征。

操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其他信息。

GetVex(G,v)初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的信息。

FirstEdge(G,v)初始条件:图G存在,v是G中某个顶点。

操作结果:返回依附于v的第一条边。

若该顶点在G中没有邻接点,则返回“空”。

NextEdge(G,v,w)初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。

操作结果:返回依附于v的(相对于w的)下一条边。

若不存在,则返回“空”。

InsertVex7(&G,v) 初始条件:图G存在,v和图中顶点有相同特征。

操作结果:在图中增添新顶点v。

数据结构-校园导游系统

数据结构-校园导游系统

课程设计论文(附有代码!)题目:校园导游咨询学院:计算机科学与工程学院专业:计算机科学与技术姓名:学号:指导教师: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)引言随着计算机科学技术的不断提高,计算机依靠其强大的功能已经成为人们生活中不可缺少的一部分,计算机能解决人类生活中的大部分问题,为人类文明和社会进步做出了巨大贡献。

桂林是一个全世界著名的旅游城市,近几年来旅游业得到了飞速的发展,来自各个国家各个城市的游客给城市带来了巨大的经济效益。

数据结构实验四图的应用-校园导游

数据结构实验四图的应用-校园导游

栅格地图
将校园地图划分为若干个栅格,每个 栅格表示一定的地理范围,可以快速 进行地图的渲染和展示。
04
实现校园导游系统
系统架构设计
架构概述
本系统采用客户端-服务器架构, 分为前端和后端两部分。前端负 责展示校园地图和导航信息,后 端负责处理用户请求、路径搜索
和地图数据存储。
前后端交互
前后端通过API进行数据交换, 前端发送用户请求(起点和终 点),后端返回路径信息和导航
提示。
数据存储
使用关系型数据库存储校园地图 数据、路径信息和用户信息。
路径搜索算法实现
算法选择
采用Dijkstra算法实现路径搜索,该算法能够在加权图中找到从起点到终点的最短路径。
算法流程
初始化距离数组,将起点到各节点的距离设为0,其他节点距离设为无穷大;遍历未访问节点, 找到距离最小的节点,更新其相邻节点的距离;重复上述步骤直到所有节点都被访问。
图的应用
通过构建图的数据结构,可以方便地实现校园导航、路径查询、最短路径计算 等功能,提高校园内人员流动的效率和便利性。
实验目的
1 2
掌握图的基本概念和数据结构
通过实验,学生将深入了解图的基本概念、表示 方法和相关数据结构,如邻接矩阵和邻接表。
实现校园导航系统
学生将利用所学知识,构建一个校园导航系统, 实现地点查询、路径规划和最短路径计算等功能。
错误处理
测试了系统在异常情况下的表现,如输入错误、网络中断等,并优 化了错误处理机制。
性能评估
响应时间
评估了系统在不同负载下的响应时间,确保系统 能够快速响应用户操作。
稳定性
测试了系统在高负载下的稳定性,确保系统在高 并发情况下不会崩溃。

(完整word版)数据结构课程设计-校园导游图

(完整word版)数据结构课程设计-校园导游图

齐齐哈尔大学计控学院数据结构课程设计选题名称:校园导游图系(院):计算机与控制工程学院专业:软件工程班级:软件121班姓名:刘泽强学号:2012023019指导教师:吴迪2014年7月1日数据结构课程设计评分表90~100为优,80~89为良,70~79为中,60~69为及格,60分以下不及格目录一、问题描述 (4)二、程序设计 (5)三、运行结果: (8)四、总结 (11)附录: (12)一.问题描述设计你所在的学校的校园平面图,所含景点不少于10个。

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

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

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

二、程序设计1.用数据结构知识创建校园图。

void creatgraph(vexnode g[],int *n, EdgeType e[],adjmax *adj) //创建校园图{int b,i,s,d,len;struct edgenode *p,*q; //定义图的结构体2.手动给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度。

得到一个模拟的校园图:图2.23.利用C语言知识编写查找景点相关信息的程序。

手动创建一个校园图creat(Matrix_Graph *G),然后为相应的边赋上真正的值。

主要代码:do{printf("是否继续? Y/N");scanf("%c",&ch);getchar();if(ch == 'Y' || ch == 'y') //继续{flag = 1;i = 1;printf("请输入您要查询的景点序号:\n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);4.利用迪杰斯特拉算法计算任意两点之间的最短路径。

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

数据结构课程设计报告(校园导游系统)附有源代码(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.

数据结构课程设计--校园导游咨询之欧阳音创编

数据结构课程设计--校园导游咨询之欧阳音创编

琼州学院电子信息工程学院课程设计报告课程名称:《数据结构》课程设计设计题目:校园导游咨询专业:软件工程班级: 2010软件工程学生姓名:学号:起止日期:指导教师:注意事项一、设计目的《数据结构》是一门实践性较强的软件基础课,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

二、设计要求1.通过这次课程设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

2.学生必须仔细研读《数据结构》课程设计要求,以学生自学为主、指导教师指导为辅,独立完成课程设计的任务,有问题及时主动与指导教师沟通。

3.本次课程设计按照教学要求需要在本学期15周前完成,学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向指导教师汇报。

4.编程语言:C 语言。

三、课程设计说明书的格式要求设计文档的撰写必须提前进行,以保证使文档与程序同步提交。

1.设计题目2.运行环境(软、硬件环境)3.算法的需求分析 4.算法概要设计5.算法详细设计 6.算法的测试7.运行结果分析 8.收获及体会四、问题分析、设计和测试过程要规范化1.需求分析:将题目中要求的功能进行叙述分析。

2.概要设计:算法的设计说明,描述解决此问题的数据存储结构,(有些题目已经指定了数据存储的,按照指定的设计),描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

3.详细设计:即各个算法的具体实现步骤,每个题目要有相应的源程序,其中每个功能模块采用不同的函数实现。

源程序要规范编写:结构要清晰,注释要清楚。

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

景德镇陶瓷学院信息工程学院班级:12计科(2)班学号:201210510216姓名:乐升平指导老师:林卫中时间:2014年6月18号题目:校园导游图校园导游图1.1、需求分析:需求:(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离。

为此图选择适当的数据结构。

(2)把各种路径都显示给游客,由游客自己选择游览路线。

(3)画出景点分布图于屏幕上。

分析:完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。

有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。

(4).依照景点的相关信息创建校园图。

(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。

(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。

(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。

1.2、设计与实现:选出本校10个景点结合景德镇陶瓷学院实际情况,我选出以下10个景点,从1到10编号: 编号 名称 编号 名称 编号 名称 编号 名称 1 研究生楼 2 二食堂 3 10#宿舍 4 主教学楼 5 毕业礼堂 6 主阶 7 一食堂 8 A 系列楼 9B 系列楼10图书馆11科艺楼12科阶13 篮球场 14 田径场 15 游泳池 16 体育馆17 翠湖 18 校门口 图的初始化由于邻接矩阵特殊的存储方式,它非常便于快速的查找两个顶点之间的边上的权值。

所以,图采用带权的邻接矩阵存储。

决定了图的存储方式后,以华南农业大学18个景点的游览地图作为蓝本,把校园地图抽象化成顶点与边构成的图形式,如图所示研究生楼 二食堂 10主教学楼 毕业礼堂主阶 一食堂A 系列楼B 系列楼 图书馆 科艺楼 科阶篮球场田径场研究生楼 10#宿舍 A 系列楼 篮球场 毕业礼堂主教学楼 科艺楼一食堂 二食堂主阶B 系列楼 图书馆 科阶 田径场游泳池体育馆 翠湖校门口1.3、模块的划分含有四个模块:(1)陶院地图信息 (2)陶院景点信息 (3)查找两点间最短路径 (4)退出 模板功能(1)将陶院的地图显示在程序运用上;(2)输入一个景点,运用程序上能够显示该景点的信息; (3)可以给游客提供两个景点的最短路径; (4)给游客提供方便。

#define N 18#define MAX 25 #define MAXedg 50 #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[18];char information[1010];struct edgenode *link;}vexnode;typedef struct edgenode{int adjvex;int length;char info[18];char info2[1010];struct edgenode *next;}edgenode, *Node ;typedef struct Edge{int lengh;int ivex, jvex;struct Edge *next;} EdgeType;typedef struct{int num;char name[18];} 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:10#宿舍\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:A系列楼\n\n");break;case 9:printf("9:B系列楼\n\n");break;case 10:printf("10:图书馆\n\n");break;case 11:printf("11:科艺楼\n\n");break;case 12:printf("12:科阶\n\n");break;case 13:printf("13:篮球场\n\n");break;case 14:printf("14:田径场\n\n");break;case 15:printf("15:游泳池\n\n");break;case 16:printf("16:体育馆\n\n");break;case 17:printf("17:翠湖\n\n");break;case 18:printf("18:校门口\n\n");break;default:printf("景点编号输入错误!请输入1-18的数字编号!\n\n"); break;}}void Information(int i)/*景点介绍*/{switch(i){case 1:printf("研究生楼:研究生的居住地及学习处。

\n\n");break;case 2:printf("二食堂:大部分学生的用餐地,深受大家喜爱。

\n\n");break;case 3:printf("10#宿舍:男宿舍楼,地理位置优越。

其余宿舍楼介绍略。

\n\n");break;case 4:printf("主教学楼:全校学生的上课之地。

\n\n");break;case 5:printf("毕业礼堂:毕业生的毕业典礼举办之地。

\n\n");break;case 6:printf("主阶:某些讲座场所以及考试场所。

\n\n");break;case 7:printf("一食堂:价格便宜,味道比二食堂稍重。

\n\n");break;case 8:printf("A系列楼:部分分院的实验室及上机之地(如:机电学院)。

\n\n");break;case 9:printf("B系列楼:部分分院的实验室及上机之地(如:信息学院)。

\n\n\n");break;case 10:printf("图书馆:学生的阅读、看书之地,其包含自习室,报刊阅览室、社科阅览室,美术阅览室等。

\n\n");break;case 11:printf("科艺楼:艺术生的天地。

\n\n\n");break;case 12:printf("科阶:大型活动及讲座的场所(尤其是科阶01)。

\n\n\n");break;case 13:printf("篮球场:顾名思义,打篮球的地方。

\n\n\n");break;case 14:printf("田径场:学生的运动之地,也是运动会场所。

含400米跑道,跑道内部是草坪,也是足球场。

\n\n\n");break;case 15:printf("游泳池:每年的差不多6、7月份开放,水质量优越,温度适宜。

\n\n\n");break;case 16:printf("体育馆:含篮球场,健身房,是下雨天的良好运动场所。

\n\n\n");break;case 17:printf("翠湖:陶院的一道亮丽风景线,是情侣之间约会、散步的首选场所。

\n\n\n");break;case 18:printf("校门口:宏伟壮观,秩序井然。

\n\n\n");break;default:printf("景点编号输入错误!请输入1->18的数字编号!\n\n"); break;}}void travgraph(vexnode g[],int n,adjmax adj) //查找指定景点信息{int i = 1,flag = 1,len;char ch;printf("\t请输入您要查询的景点序号: \n\n");printf("\t1.研究生楼 2.二食堂 3.10#宿舍 4.主教学楼 5.毕业礼堂 6.主阶\n\n");printf("\t7.一食堂8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n\n");printf("\t13.篮球场14.田径场15.游泳池16.体育馆17.翠湖18.校门口\n\n");printf("你的选择是");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);do{printf("\t\t是否继续? Y/N \n\n");printf("\t\t你的选择是:");scanf("%c",&ch);getchar();if(ch == 'Y' || ch == 'y'){clrscr();flag = 1;i = 1;printf("\t\t\t请再次输入您要查询的景点序号:\n\n");printf("\t1.研究生楼 2.二食堂 3.10#宿舍 4.主教学楼 5.毕业礼堂 6.主阶\n\n");printf("\t7.一食堂8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n\n");printf("\t13.篮球场14.田径场15.游泳池16.体育馆17.翠湖18.校门口\n\n");printf("你的选择是");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);continue ;}else{ flag = 0;printf("\t\t请再次按回车键或者任意键加回车键返回至主菜单");}break;}while(1);}void creat(Matrix_Graph *G){int i,j;for(i=1;i<=N;i++) G->vexs[i]=i;for(i=1;i<=N;i++)for(j=1;j<=N;j++) G->arcs[i][j]=0;G->arcs[1][2]=600; G->arcs[1][3]=700; G->arcs[1][4]=50; G->arcs[1][5]=650;G->arcs[2][1]=600; G->arcs[2][3]=100; G->arcs[2][4]=650;G->arcs[2][5]=50;G->arcs[3][1]=700; G->arcs[3][4]=750; G->arcs[3][5]=50;G->arcs[4][1]=50; G->arcs[4][5]=700; G->arcs[4][6]=50; G->arcs[4][7]=900;G->arcs[5][1]=650; G->arcs[5][6]=700; G->arcs[5][7]=150;G->arcs[6][7]=950; G->arcs[6][8]=50; G->arcs[6][9]=100;G->arcs[6][10]=200; G->arcs[6][11]=400; G->arcs[6][12]=500;G->arcs[7][8]=900; G->arcs[7][9]=850; G->arcs[7][10]=750;G->arcs[7][11]=150; G->arcs[7][12]=100;G->arcs[8][7]=900; G->arcs[8][9]=50; G->arcs[8][13]=1000;G->arcs[8][14]=1050; G->arcs[8][15]=1010; G->arcs[8][16]=1015; G->arcs[8][17]=100; G->arcs[8][18]=200;G->arcs[9][7]=50; G->arcs[9][8]=50; G->arcs[9][10]=100;G->arcs[9][17]=50; G->arcs[9][18]=150;G->arcs[18][13]=300; G->arcs[18][14]=250; G->arcs[18][15]=2000; G->arcs[18][16]=150;for(i=1;i<=N;i++)for(j=1;j<=N;j++)if(G->arcs[i][j]==0) G->arcs[i][j]=MAX;}void path(Matrix_Graph *G,int s,int e){int i,j,u,c=1,t,v;int r[N+1][N+1];int T[N],flag[N],d[N];for(i=0;i<=N;i++)for(j=0;j<=N;j++) r[i][j]=0;for(i=1;i<=N;i++){T[i]=-1;flag[i]=1;d[i]=MAX;}flag[s]=0;while(c<=N){t=MAX;for(i=1;i<=N;i++)if(flag[i]&&G->arcs[s][i]<t){t=G->arcs[s][i];v=i;r[v][1]=v;}for(i=1;i<=c;i++)for(j=1;j<=N;j++)if(flag[j]&&d[i]+G->arcs[T[i]][j]<t){t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}printf("\n最短路径是以下这条:\n(%d)",s);j=1;while(r[e][j]!=0){printf("-->(%d)",r[e][j]);j++;}printf("\n\n");}int main(){int i,j;Matrix_Graph G;creat(&G);int n = 0;vexnode g[MAX];EdgeType e[MAXedg];adjmax adj;char choice = 'x';while(1){clrscr();printf("\n\n\t\t\t ---校-园-导-游---");printf("\n\t\t--------------------------------------\n\n");printf("\t\t\t1. 陶院校园地图\n\n");printf("\t\t\t2. 陶院景点信息\n\n");printf("\t\t\t3. 查找两点间最短路径\n\n");printf("\t\t\t0. 退出\n\n");printf("\n\t\t--------------------------------------\n\n");printf("\t\t景德镇陶瓷学院校训:崇德尚学陶冶成器\n");printf("\n\t\t--------------------------------------\n\n");printf("\t\t请输入你的选择(0-3): ");choice = getchar();switch(choice){case '1':clrscr();printf("\t\t 陶院地图\n\n");printf("\n");printf(" 1.研究生楼* * * * * * 2.二食堂* * * * *3.10#宿舍楼\n");printf(" * * * *\n");printf(" * * * *\n");printf(" * * * *\n");printf(" * * * *\n");printf(" 4.主教学楼* * * * * * * * * * ** 5.毕业礼堂\n");printf(" * * *\n");printf(" * * *\n");printf(" * * *\n");printf(" * *\n");printf(" 6.主阶* * * * * * * * * * * * * * * * 7.一食堂\n");printf(" * * * * *\n");printf(" * * * * * \n");printf(" * * * * * *\n");printf(" * * * * * *\n");printf(" * * * * *\n");printf(" * * * *\n");printf(" 8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n");printf(" * * * * *\n");printf(" * * * * * * * * * * * * * * * * * 13.篮球场\n");printf(" * * * * * *\n");printf(" * * * * * * * * * * * * * * * * * 14.田径场\n");printf(" * * * * * * * * \n");printf(" * * * * * * * 15.游泳池\n");printf(" * * * * * * * * *\n");printf(" * * * * * * 16.体育馆\n");printf(" * * * * **\n");printf(" * 17.翠湖* \n");printf(" * * *\n");printf(" * 18.校门口*\n");printf(" (入口)&(出口)\n");printf("\t\t输入任意键返回菜单");getchar();getchar();break;case '2':clrscr();travgraph(g,n,adj);getchar();break;case '3':clrscr();printf("\t\t 陶院地图\n\n");printf("\n");printf(" 1.研究生楼* * * * * * 2.二食堂* * * * *3.10#宿舍楼\n");printf(" * * * *\n");printf(" * * * *\n");printf(" * * * *\n");printf(" * * * *\n");printf(" 4.主教学楼* * * * * * * * * * * * 5.毕业礼堂\n");printf(" * * *\n");printf(" * * *\n");printf(" * * *\n");printf(" * *\n");printf(" 6.主阶* * * * * * * * * * * * * * * * 7.一食堂\n");printf(" * * * * *\n");printf(" * * * * * \n");printf(" * * * * *printf(" * * * * * *\n");printf(" * * * * *\n");printf(" * * * *\n");printf(" 8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n");printf(" * * * * *\n");printf(" * * * * * * * * * * * * * * * * * 13.篮球场\n");printf(" * * * * * *\n");printf(" * * * * * * * * * * * * * * * * * 14.田径场\n");printf(" * * * * * * * * \n");printf(" * * * * * * * 15.游泳池\n");printf(" * * * * * * * * *\n");printf(" * * * * * * 16.体育馆\n");printf(" * * * * **\n");printf(" * 17.翠湖* \n");printf(" * * *\n");printf(" * 18.校门口*\n");printf(" (入口)&(出口)\n");printf("\2你现在的位置是(请输入1-18):\n\n");printf("\t1.研究生楼 2.二食堂 3.10#宿舍 4.主教学楼 5.毕业礼堂 6.主阶\n\n");printf("\t7.一食堂8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n\n");printf("\t13.篮球场14.田径场15.游泳池16.体育馆17.翠湖18.校门口\n\n");printf("\t你的输入是:");scanf("%d",&i);getchar();printf("\2你想要去的地方是(请输入1-18):\n\n");printf("\t1.研究生楼 2.二食堂 3.10#宿舍 4.主教学楼 5.毕业礼堂 6.主阶printf("\t7.一食堂8.A系列楼9.B系列楼10.图书馆11.科艺楼12.科阶\n\n");printf("\t13.篮球场14.田径场15.游泳池16.体育馆17.翠湖18.校门口\n\n");printf("\t你的输入是:");scanf("%d",&j);getchar();path(&G,i,j);getchar();creat(&G);do{printf("是否继续查询Y/N");char ch;int flag=1;scanf("%c",&ch);getchar();if(ch == 'Y' || ch == 'y'){flag = 1;i = 1;printf("\2你现在的位置是(请输入1-18):\n\n");scanf("%d",&i);getchar();printf("\2你想要去的地方是(请输入1-18):\n\n");scanf("%d",&j);getchar();path(&G,i,j);getchar();creat(&G);continue ;}elseflag = 0;break;}while(1);break;case '0':clrscr();printf("\n\t\t--------按任意键退出!--------\n\n");printf("\n\t\t--------谢谢您的使用!--------\n");getchar();exit(0);break;default:printf("\n输入错误,请重新输入0-3之间的数字:\n");getchar();break;}}getchar();}。

相关文档
最新文档