效果图
[运行环境]
Windows系统
[问题描述]
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
[基本要求]
(1)设计你的学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
[测试数据]
由读者根据实际情况指定。
[实现提示]
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。顶点和边均含有相关信息。
[选做内容]
(1)求校园图的关节点。
(2)提供图中任意景点问路查询,即求任意两个景点之间的所有路径。(已做)
(3)提供校园图中多个景点的最佳访问路线查询,即求途经这多个景点的最佳(短)路径。
(4)校园导游图的景点和道路的修改扩充功能。(已做)
(5)扩充道路信息,如道路类别(车道、人行道等)、沿途景色等级,以至可按客人所需分别查询人行路径或车行路径或观景路径等。
(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
(7)实现校园导游图的仿真界面。
1. 需求分析
设计一个校园导游程序,为来访的客人提供各种信息查询服务。根据学校平面图设计一个校园导游咨询系统,系统中存有景点。可实现功能:
(1)设计你的学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
(4)提供图中任意景点问路查询,即求任意两个景点之间的所有路径。
(5)校园导游图的景点和道路的修改扩充功能。
数据的条件限定:采用无向图-邻接数组的存储结构,点的类型是自定义结构体spot类型,其中含int和字符串类型,邻接数组类型为int**类型。
操作的限定:根据选择提示进行选择,限定输入所规定范围内的int类型作选择操作,有时要输入字符串如修改景点的信息。
输出的限定:输出的是字符串或十进制数。
2. 概要设计
(1) ADT的定义
无向图-邻接数组的存储结构,邻接数组里的顶点数组是spot类型,关系数组是int**类型,其中存有权值,还存有定点数和边数,且有tags[]标志数组,可用于在图中的遍历中标记顶点访问与否,spot类型是自定义的用于存储景点信息的结构体,其中包括有景点位序、名称和简介。DistInfo类型是用于迪杰斯特拉算法,其中当前最短路径上该顶点的前驱顶点的位序和当前最短路径的长度。
(2)程序模块的划分
1)主程序模块
先创建邻接数组类型无向图,再提供用户界面供用户选择功能,用switch语句供用户选择
功能模块:
2)LocateVex()
定位点v在G中的位序
3)InitGraph()
初始化无向图G,初始话vexs数组等等
4)CreateGraph()
创建无向图G,先调用初始化函数再根据已录入的数据创建
5)修改信息类
修改信息的功能只需直接在所创建的MGraph类型的图G中修改其spot的信息或arcs邻接数组的信息即可
6)FirstAdjVex()
求图G中k顶点的第一个邻接顶点的位序
7)NextAdjVex()
m顶点为k顶点的邻接顶点,求图中k顶点相对于m顶点的下一个邻接顶点的位序
8)visit()
访问结点信息(读取景点信息)
9)DFS_ALL()
基于DFS法找到所有路径函数,算法思想:从点u开始,每访问一个点,将其加入到path数组中,标记为VISITED,然后用循环访问其邻接顶点,如果被访问的点在此次所在的路径中之前已被访问,或该顶点没有邻接顶点了,且该顶点不是目的顶点,则返回上一个顶点并将其置为UNVISITED,length--,继续查找其他邻接点。如果该顶点是目的顶点,则将当前path中存储的顶点输出,就是一条路径了,之后将上一个顶点置为UNVISITED,length--,观察是否还有其余邻接点,如果有继续查找,没有则返回上一个顶点,置为UNVISITED后,继续用DFS法查找
10)Dijkstra()
迪杰斯特拉算法。求图G中从i顶点到其他所有顶点的最短路径,并由Dist返回
11)Outputpath()
沿Dist数组的prev域,可递归获得源点到k定点的最短路径
12)reviseSpot()
修改顶点信息
13)reviseArc()
修改边(道路)信息
14)creatVA()
录入点和边的信息
15)menu()
打印菜单
16)spotList()
打印景点列表
17)printmap()
打印简易地图
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#define UNVISITED 0
#define VISITED 1
#define INFINITY INT_MAX
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define UNSELECTED 0
#define SELECTED 1
typedef int Status;
typedef enum{DG,DN,UDG,UDN} GraphKind; //图的四种类型:有向图,有向带权图,无向图和无向带权图
typedef struct{
int symbol;//景点代号
char *name;//景点名字
char *introduction;//景点简介
}spot; //景点类型
typedef struct{
spot v,w; //边的端点
int info; //对带权图,为权值,此处为距离
}ArcInfo; //存储边信息
typedef struct{
spot *vexs; //顶点数组,spot是景点类型
int **arcs; //关系数组,此图为带权图