2-6 校园导航 (50分)

校园导航问题@

【问题描述】

以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。

【需求分析】

设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。

要求:

(1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。

(2) 为游人提供任意景点相关信息查询。

(3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。

基于java的校园导航系统 校园导航csdn_最短路径

地图中共有12个顶点,20条边

实现提示:
一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。
选做内容:
(1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。
(2)校园导游图的仿真界面。

解题报告

【概要设计】

抽象数据类型定义:
(1)景点 顶点名称 代号 顶点信息简介

#define MaxVerNum 100 //最大景点数
typedef struct {
	int num;//代号
	char name[MaxVerNum];//景点名字
	char features[1000];//景点信息
} VertexType;

(2)图的存储结构:

//图的存储结构
typedef struct {
	VertexType vexs[MaxVerNum];//每一个景点的信息
	int edges[MaxVerNum][MaxVerNum];//每一个景点的邻接边的权值
	int v, e;//顶点数和边数 
} MGraph;
static MGraph map;

2 主要功能模块
(1)创建图的邻接矩阵存储结构 create()
(2) 浏览图中任一景点介绍
(3) 修改景点信息
(4) 增加景点信息
(5) 删除景点信息
(6) 增加道路
(7) 删除道路
(8) 查找某一景点到其他景点的最短路径
(9) 查找任一两个景点之间的最短路径。
3 主模块流程
管理员登陆,可实现(1)-(9)功能操作
游客登陆,在(1)基础实现基础之上,可实现 (2)(8)(9)功能操作

【详细设计】

用C语言定义相关数据类型
写出各模块伪代码算法
画出函数间的调用关系图
【调试分析】

调试中遇到的问题及对问题的解决方法
算法时间复杂度和空间复杂度
【使用书说明及测试结果】

叨叨我刚开始的想法

基于java的校园导航系统 校园导航csdn_最短路径_02

菜单

这是我原来想要的菜单界面,我真的挺喜欢的!!!这么好看。
但是后来发现一个问题,当删除和修改景点节点的时候,我的界面不会的自动对齐,就是那种错位,很不美观。
所以最好下定决心,舍去吧!!!

第一次版本

void Listmenu() {
	system("cls");
	printf("\n");
	printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
	printf("\t * *                   *河大景点列表*                     * *\n");
	printf("\t * ****************************************************** * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * *  <1>体检中心      <2>操场            <3>校门北口     * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * *  <4>银杏景观      <5>邯郸音乐厅      <6>图书馆       * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * *  <7>信息学部      <8>花园景观        <9>校门东口     * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * *  <10>网计学院     <11>校门南口       <12>餐厅        * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * ****************************************************** * *\n");
	printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
}

改进版本【同样不可用】

//河大景点列表
void Listmenu() {
	system("cls");
	printf("\n");
	printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
	printf("\t * *                   *河大景点列表*                     * *\n");
	printf("\t * ****************************************************** * *\n");
	printf("\t * *                                                      * *\n");
	printf("\t * *  <1>%s      <2>%s            <3>%s     * *\n",map.vexs[0].name,map.vexs[1].name,map.vexs[2].name);
	printf("\t * *                                                      * *\n");
	printf("\t * *  <4>%s      <5>%s      <6>%s       * *\n",map.vexs[3].name,map.vexs[4].name,map.vexs[5].name);
	printf("\t * *                                                      * *\n");
	printf("\t * *  <7>%s      <8>%s        <9>%s     * *\n",map.vexs[6].name,map.vexs[7].name,map.vexs[8].name);
	printf("\t * *                                                      * *\n");
	printf("\t * *  <10>%s     <11>%s       <12>%s        * *\n",map.vexs[9].name,map.vexs[10].name,map.vexs[11].name);
	printf("\t * *                                                      * *\n");
	printf("\t * ****************************************************** * *\n");
	printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
}

管理员界面

基于java的校园导航系统 校园导航csdn_最短路径_03


游客界面

基于java的校园导航系统 校园导航csdn_#include_04


现在的:

基于java的校园导航系统 校园导航csdn_#include_05


基于java的校园导航系统 校园导航csdn_#define_06


基于java的校园导航系统 校园导航csdn_数据结构_07

修改和增删景点

刚开始的时候,我以为简单的很,和修改景点差不多的样子,但是后来发现,不是那么回事啊?!

  • 修改的时候,我就在想,是只改名字呢,还是名字和介绍一块改呢?最后选择了后者。因为不会真的有人闲的没事天天给同一块地方改名字,而不该介绍吧?呵呵,至少您的介绍里,最少要加一句:于xx年xx月xx日由xx名改为xx名。【我闲的慌,别理我,每次写大作业,都在打心理战】
  • 增加景点的时候,还有加入它与其他景点的路径,这就要输入它的相邻景点了【PS:检查前后是不是输入了重复相邻的景点】
  • 同样的,删除的时候,也要删除所有与该景点直接相连的道路【数组记得同样的删除该景点的位置啊】
  • 还有一点,呃。。。不是很重要。对界面美观或者有强迫的孩子们,可以考虑一下,那就是展示景点的顺序。一般我都默认插入到数组的最后面,这样的话,循环输出,最后插入的景点自然而然的在最下面。但是,如果新加的景点会给学校带来好处或者收益,还是放在C位比较合适啊。毕竟像咱们的图书馆等标志的建筑,一般宣传都会是在最上面的。呃呃,我就算了吧,因为我,目前还没有这意识【算了,其实是没有实力】。

增删路径

  • 增加路径还好了,先看一共有多少景点,0或1个景点就不要进行操作了,直接输出提示并返回;然后判断一下你要加入的那个路径是不是已经存在了,如果是,就没有什么必要再添加了;然后正常添加就行。
  • 删除路径也是,先看一共有多少景点,0或1个景点就不要进行操作了,直接输出提示并返回;然后判断一下你要删除的路径存不存在,如果不,提示错误,接着输入。

查找最短路径

这里有两种算法。
我想了好久,Floyd算法在我的程序上运行不出来,之后干脆算了,使用大概率相同的代码,完成了两种功能【只有部分的输出需要更改】,很不地道。
但是我还是想着都写出来比较好,之后再好好的研究研究。

密码

这个最好还是用文件操作比较好,这样可以记录每一次的密码,但是我的时间来不及了,直接给了一个默认的密码1234,你可以更改密码,但是关闭程序之后,还是恢复我的默认密码。


这次就算了,毕竟只是一个小系统,实现一个功能,以后有机会参加什么大型的项目,一定要认真找bug

说到bug,再说一点,如果scanf时,用的int型的%d,这是一个(小)大问题,1和01和001都是系统认为都是一样的,都正确,所以啊,,,最好还是用char型,比较两个字符串是否相等,对了,我那样子写的,输入1.1只有带.的,会错的啊。哈哈哈哈哈哈,我不改了,这是后来发现的。

代码

/* 
同学你好,欢迎检测校园导航系统,本系统的管理员默认密码是1234。 
你可以进行后期的更改,祝你体验愉快! 
*/ 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MaxVerNum 100 //最大景点数
#define INF 99999//表示无穷 即没有路径 

char PASSWORD[20]="1234";//默认密码

typedef struct {
	//int num;//代号这个变量本来我也是有的 后来发现没什么用 舍弃了
	char name[MaxVerNum];//景点名字
	char features[1000];//景点信息
} VertexType;

//图的存储结构
typedef struct {
	VertexType vexs[MaxVerNum];//每一个景点的信息
	int edges[MaxVerNum][MaxVerNum];//每一个景点的邻接边的权值
	int v, e;//顶点数和边数
} MGraph;
static MGraph map;

void menu1();//管理员菜单
void menu2();//游客菜单
void ListSpots();//河大景点列表
void create();//创建邻接链表
void Introduce();//景点介绍函数
void ChangeVexs();//修改景点
void IncreaseVexs();//增加景点
void DeleteVexs();//删除景点
void IncreaseEdges();//增加道路
void DeleteEdges();//删除道路
void Dijkstra();//查找当前景点到其他景点的最短路径
void Floyd();//查找任一两个景点之间的最短路径
void Exit();//退出系统的函数
void changepassword();

//主函数
int main() {
	while(1) {
		create();
		printf("\n\n");
		system("cls");
		printf("\t欢迎光临河北大学新校区!\n\n");
		printf("\t请输入代号选择您相应的身份:\n\n");
		printf("\t<1>管理员\n\n");
		printf("\t<2>游客\n\n");
		printf("\t<3>退出系统!\n\n");
		int n;
		scanf("%d",&n);
		if(n==1) {
			printf("请输入管理员密码:\n");
			char pw[20];
			scanf("%s",pw);
			getchar();
			while(strcmp(pw,PASSWORD)!=0) {
				printf("密码错误,请重新输入:\n");
				scanf("%s",pw);
			}
			if(strcmp(pw,PASSWORD)==0)
				menu1();
		} else if(n==2) {
			menu2();
		} else if(n==3) {
			Exit();
		} else {
			printf("您的输入有误,请重新输入!\n");
			system("pause");
		}
	}
	return 0;
}


//管理员菜单
void menu1() {
	while(1) {
		int n;
		system("cls");
		printf("\t当前为管理员操作界面\n\n");
		printf("\t请选择您要进行的操作:\n\n");
		printf("\t<1>查看景点介绍\t");
		printf("\t<2>修改景点\t");
		printf("\t<3>增加景点\n\n");
		printf("\t<4>删除景点\t");
		printf("\t<5>增加道路\t");
		printf("\t<6>删除道路\n\n");
		printf("\t<7>查找当前景点到其他景点的最短路径\n\n");
		printf("\t<8>查找任一两个景点之间的最短路径\n\n");
		printf("\t<9>退出系统!\t");
		printf("\t<0>修改密码!\n\n");
		scanf("%d",&n);
		if(n==1) {
			Introduce();
		} else if(n==2) {
			ChangeVexs();
		} else if(n==3) {
			IncreaseVexs();
		} else if(n==4) {
			DeleteVexs();
		} else if(n==5) {
			IncreaseEdges();
		} else if(n==6) {
			DeleteEdges();
		} else if(n==7) {
			Dijkstra();
		} else if(n==8) {
			Floyd();
		} else if(n==9) {
			Exit();
		} else if(n==0) {
			changepassword();
		} else {
			printf("您的输入有误,请重新输入!\n");
			system("pause");
		}
	}
}

//游客菜单
void menu2() {
	while(1) {
		system("cls");
		printf("\t当前为游客操作界面\n\n");
		printf("\t<1>查看景点介绍\n\n");
		printf("\t<2>查找当前景点到其他景点的最短路径\n\n");
		printf("\t<3>查找任一两个景点之间的最短路径\n\n");
		printf("\t<4>退出系统!\n\n");
		int n;
		scanf("%d",&n);
		if(n==1) {
			Introduce();
		} else if(n==2) {
			Dijkstra();
		} else if(n==3) {
			Floyd();
		} else if(n==4) {
			Exit();
		} else {
			printf("您的输入有误,请重新输入!\n");
			system("pause");
		}
	}
}

//景点介绍函数
void Introduce() {
	system("cls");
	if(map.v==0) {
		printf("该地图暂时没有景点!\n\n");
		system("pause");
		return ;
	}
	ListSpots();
	printf("\n请输入你要查看的景点代号:\n");
	int n;
	while(1) {
		scanf("%d",&n);
		if(n<1||n>map.v) {
			printf("您的输入有误,请重新输入!\n");
		} else
			break;
	}
	printf("%s:",map.vexs[n-1].name);
	printf("%s\n",map.vexs[n-1].features);
	int flag;
	printf("\n再次查询请按1,退出查询请按任意键\n");
	scanf("%d",&flag);
	if(flag==1)
		Introduce();
}

//修改景点
void ChangeVexs() {
	system("cls");
	if(map.v<=0) {
		printf("地图中没有任何景点,无法操作!!!\n");
		system("pause");
		return ;
	}
	ListSpots();
	int n;
	printf("请输入您要修改的景点代号:\n");
	scanf("%d",&n);
	while(n<=0||n>map.v) {
		printf("您的输入有误,请重新输入!\n");
		scanf("%d",&n);
	}
	char newName[200];
	char newFeatures[1000];
	printf("该景点当前的名字是:\n\n【%s】\n\n请输入更改后的名字:\n",map.vexs[n-1].name);
	scanf("%s",newName);
	getchar();
	printf("该景点当前的介绍为:\n\n%s\n\n请输入更改后新的景点介绍:\n",map.vexs[n-1].features);
	scanf("%s",newFeatures);
	getchar();
	strcpy(map.vexs[n-1].name,newName);
	strcpy(map.vexs[n-1].features,newFeatures);
	printf("\n景点信息修改成功!\n");
	system("pause");
}

//增加景点
void IncreaseVexs() {
	system("cls");
	if(map.v>MaxVerNum) {
		printf("景点已到达最大限度,当前无法添加景点!\n");
		system("pause");
		return ;
	}
	char newName[200];
	char newFeatures[1000];
	printf("请输入您要添加的景点名:\n");
	scanf("%s",newName);
	getchar();
	printf("请输入【%s】景点的介绍,最多可输入200字:\n",newName);
	scanf("%s",newFeatures);
	getchar();
	int m=0;
	int i;
	ListSpots();
	printf("请输入新增景点的相邻景点个数:\n");
	scanf("%d",&m);
	while(m<0||m>map.v) {
		printf("您的输入有误,请重新输入!\n");
		scanf("%d",&m);
	}
	for(i=0; i<m; i++) {
		int a,d;
		printf("请输入第%d个相邻景点的代号:\n",i+1);
		scanf("%d",&a);
		while(a<=0||a>map.v||map.edges[a-1][map.v]!=INF) {
			if(a<=0||a>map.v)
				printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
			if(map.edges[a-1][map.v]!=INF)
				printf("请不要输入重复的相邻景点,重新输入:\n");
			scanf("%d",&a);
		}
		printf("请输入【%s】与【%s】之间的距离:\n",newName,map.vexs[a-1].name);
		scanf("%d",&d);
		while(d<=0||d>=INF) {
			printf("您输入的距离有误!请重新输入:\n");
			scanf("%d",&d);
		}
		map.edges[a-1][map.v]=map.edges[map.v][a-1]=d;
	}
	strcpy(map.vexs[map.v].name,newName);
	strcpy(map.vexs[map.v].features,newFeatures);
	map.v++;//景点数加1
	map.e=map.e+m;//边数加m
	printf("景点添加成功!\n");
	system("pause");
}

//删除景点
void DeleteVexs() {
	system("cls");
	if(map.v<1) {
		printf("地图中没有任何景点,无法删除!\n");
		system("pause");
		return ;
	}
	ListSpots();
	printf("请输入您要删除的景点编号:\n");
	int a;
	scanf("%d",&a);
	while(a<1||a>map.v) {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d",&a);
	}
	printf("您要删除的景点为:【%s】\n确认删除请按1,退出删除请按任意键\n",map.vexs[a-1].name);
	int flag;
	scanf("%d",&flag);
	if(flag==1) {
		int i,j;
		int cnt=0;
		for(i=0; i<map.v; i++) {
			if(map.edges[a-1][i]!=INF)
				cnt++;//记录于a景点直接相连的路径有几条
		}
		//删除节点 整个VertexType类型的结构体赋值
		for(i=a-1; i<map.v; i++) {
			map.vexs[i]=map.vexs[i+1];
		}
		//删除该节点在二维数组中所对应的列
		for(i=0; i<map.v; i++) {
			for(j=a-1; j<map.v; j++)
				map.edges[i][j]=map.edges[i][j+1];
		}
		//删除该节点在二维数组中所对应的行
		for(i=0; i<map.v; i++) {
			for(j=a-1; j<map.v; j++)
				map.edges[j][i]=map.edges[j+1][i];
		}
		map.v--;//节点数减1
		map.e-=cnt;//边数减cnt
	} else
		return ;
	printf("景点删除成功!\n");
	system("pause");
}

//增加道路
void IncreaseEdges() {
	system("cls");
	if(map.v<=0) {
		printf("地图中没有景点,无法添加道路!\n");
		system("pause");
		return ;
	}
	if(map.v==1) {
		printf("地图中只有一个景点,无法添加道路!\n");
		system("pause");
		return ;
	}
	ListSpots();
	if(map.e==0)
		printf("当前地图中没有道路!\n");
	else
		printf("当前地图中含有%d条道路!\n",map.e);
	printf("请输入您要添加道路的两个景点代号:\n");
	int a,b;
	scanf("%d %d",&a,&b);
	while(a<1||a>map.v||b<1||b>map.v||a==b) {
		if(a==b)
			printf("您输入的景点代号相同,请重新输入!\n");
		else
			printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&a,&b);
	}
	if(map.edges[a-1][b-1]!=INF) {
		printf("【%s】与【%s】之间已经存在一条道路,无需再次添加!\n",map.vexs[a-1].name,map.vexs[b-1].name);
	} else {
		int d;
		printf("请输入【%s】和【%s】之间道路的长度:\n",map.vexs[a-1].name,map.vexs[b-1].name);
		scanf("%d",&d);
		while(d<=0||d>=INF) {
			printf("您输入的长度有误,请重新输入!\n");
			scanf("%d",&d);
		}
		map.edges[a-1][b-1]=map.edges[b-1][a-1]=d;
		map.e++;
		printf("道路添加成功!\n");
	}
	system("pause");
}

//删除道路
void DeleteEdges() {
	system("cls");
	if(map.v<=0) {
		printf("地图中没有景点,无法删除道路!\n");
	}
	if(map.e<=0) {
		printf("地图中没有道路,无法删除!\n");
	}
	ListSpots();
	printf("当前地图中一共有%d条道路\n",map.e);
	printf("请输入您要删除的道路对应的两个景点代号,中间使用空格隔开:\n");
	int a,b;
	scanf("%d %d",&a,&b);
	while(a<1||a>map.v||b<1||b>map.v||a==b) {
		if(a==b)
			printf("您输入的景点代号相同,请重新输入!\n");
		else
			printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&a,&b);
	}
	if(map.edges[a-1][b-1]>=INF) {
		printf("%s与%s之间没有道路,无法删除!\n",map.vexs[a-1].name,map.vexs[b-1].name);
	} else {
		printf("您确定要删除【%s】与【%s】之间的道路吗?\n",map.vexs[a-1].name,map.vexs[b-1].name);
		printf("按1确认删除,按任意键退出!\n");
		int flag;
		scanf("%d",&flag);
		if(flag==1) {
			map.edges[a-1][b-1]=map.edges[b-1][a-1]=INF;
			map.e--;
		} else
			return ;
		printf("道路删除成功!\n");
	}
	system("pause");
}

//查找当前景点到其他景点的最短路径
void Dijkstra() {
	system("cls");
	if(map.v<=0) {
		printf("地图中没有景点,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	if(map.v==1) {
		printf("地图中只有一个景点,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	if(map.e<=0) {
		printf("地图中没有道路,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	ListSpots();
	int a;
	printf("请输入您所在景点位置的代号:\n");
	scanf("%d",&a);
	while(a<1||a>map.v) {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d",&a);
	}
	int s[MaxVerNum];//存放源点和已生成的终点
	int dist[MaxVerNum];//存放最短路径的长度
	int path[MaxVerNum];//存放上一个路径的位置
	int i,j,k,min,pre;
	s[a-1]=1;
	//初始化
	for(i=0; i<map.v; i++) {
		dist[i]=map.edges[a-1][i];
		path[i]=a-1;
		s[i]=0;//这个看网上的答案是没有的 我自己加上去的,这样就正确了
	}
	//对当前位置进行信息更改
	dist[a-1]=0;
	s[a-1]=1;
	path[a-1]=-1;
	for(i=0; i<map.v; i++) {
		min=INF+1;
		for(k=1; k<map.v; k++) {
			if(s[k]==0&&dist[k]<min) {
				j=k;
				min=dist[k];
			}
		}
		s[j]=1;
		for(k=0; k<map.v; k++) {
			if(s[k]==0&&(dist[j]+map.edges[j][k]<dist[k])) {
				dist[k]=dist[j]+map.edges[j][k];
				path[k]=j;
			}
		}
	}
	int flag=1;
	for(i=0; i<map.v; i++) {
		if(i!=a-1) {
			if(dist[i]!=INF) {
				flag=0;
				printf("%d米: %s",dist[i],map.vexs[i].name);
				pre=path[i];
				while(pre>=0) {
					printf(" <-%s",map.vexs[pre].name);
					pre=path[pre];
				}
				printf("\n");
			}
		}
	}
	if(flag)
		printf("【%s】与任何景点之间都没有可通道路!\n",map.vexs[a-1].name);
	system("pause");
}

//查找任一两个景点之间的最短路径
void Floyd() {
	system("cls");
	if(map.v<=0) {
		printf("地图中没有景点,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	if(map.v==1) {
		printf("地图中只有一个景点,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	if(map.e<=0) {
		printf("地图中没有道路,无法查询最短路径!\n");
		system("pause");
		return ;
	}
	ListSpots();
	int a,b;
	printf("请输入您要查询距离的两个景点代号,中间用空格隔开:\n");
	scanf("%d %d",&a,&b);
	while(a<1||a>map.v||b<1||b>map.v) {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&a,&b);
	}
	int s[MaxVerNum];//存放源点和已生成的终点
	int dist[MaxVerNum];//存放最短路径的长度
	int path[MaxVerNum];//存放上一个路径的位置
	int i,j,k,min,pre;
	s[a-1]=1;
	//初始化
	for(i=0; i<map.v; i++) {
		dist[i]=map.edges[a-1][i];
		path[i]=a-1;
		s[i]=0;//这个看网上的答案是没有的 我自己加上去的,这样就正确了
	}
	//对当前位置进行信息更改
	dist[a-1]=0;
	s[a-1]=1;
	path[a-1]=-1;
	for(i=0; i<map.v; i++) {
		min=INF+1;
		for(k=1; k<map.v; k++) {
			if(s[k]==0&&dist[k]<min) {
				j=k;
				min=dist[k];
			}
		}
		s[j]=1;
		for(k=0; k<map.v; k++) {
			if(s[k]==0&&(dist[j]+map.edges[j][k]<dist[k])) {
				dist[k]=dist[j]+map.edges[j][k];
				path[k]=j;
			}
		}
	}
	if(dist[b-1]==INF)
		printf("【%s】与【%s】任何景点之间都没有可通道路!\n",map.vexs[a-1].name,map.vexs[b-1].name);
	else {
		printf("【%s】->【%s】的最短距离是%d米。 \n",map.vexs[b-1].name,map.vexs[a-1].name,dist[b-1]);
		pre=path[b-1];
		printf("路径为:%s",map.vexs[b-1].name);
		while(pre>=0) {
			printf("-> %s",map.vexs[pre].name);
			pre=path[pre];
		}
	}
	printf("\n");
	system("pause");
}

//河大景点列表
void ListSpots() {
	if(map.v==0) {
		printf("当前地图中没有景点!\n\n");
		system("pause");
		return ;
	}
	if(map.v>0)
		printf("河北大学有当前景点:\n\n");
	int i;
	for(i=0; i<map.v; i++) {
		printf("\t<%d>%s\n",i+1,map.vexs[i].name);
	}
}

//创建邻接链表
void create() {
	map.v=12;
	map.e=20;
	int i,j,k;
	for(i=0; i<MaxVerNum; i++) {
		for(j=0; j<MaxVerNum; j++) {
			map.edges[i][j]=INF;
		}
	}
	//顶点的名字 介绍赋值
	strcpy(map.vexs[0].name, "体检中心");
	strcpy(map.vexs[0].features, "这是个什么地方,我从来没去过!!!");
	strcpy(map.vexs[1].name, "操场");
	strcpy(map.vexs[1].features, "大一大二的体育课在这里上,春秋早晚跑步的同学超多的。");
	strcpy(map.vexs[2].name, "校门北口");
	strcpy(map.vexs[2].features, "疫情期间的唯一开放通道,老北街原址附近,现在已经增加了可移动的红绿灯。");
	strcpy(map.vexs[3].name, "银杏景观");
	strcpy(map.vexs[3].features, "河大新区专属的标志,秋季拍照打卡的圣地,附近的居民也超爱的。");
	strcpy(map.vexs[4].name, "邯郸音乐厅");
	strcpy(map.vexs[4].features, "河北大学举办音乐活动的场所,场馆可容纳1500名学生,进去过一次。");
	strcpy(map.vexs[5].name, "图书馆");
	strcpy(map.vexs[5].features, "河大新区的标志性建筑,环境优美,冬暖夏凉,入馆体验超级棒,期末前夕人爆满。");
	strcpy(map.vexs[6].name, "信息学部");
	strcpy(map.vexs[6].features, "河北大学工商学院唯一的理工科学部,成立于2001年。");
	strcpy(map.vexs[7].name, "花园景观");
	strcpy(map.vexs[7].features, "图书馆前面的风景,我猜着:应该是为了凸显图书馆的存在,欣赏不来。");
	strcpy(map.vexs[8].name, "校门东口");
	strcpy(map.vexs[8].features, "疫情期间封闭门,请假可出行,问一句,什么时候可以开放啊?");
	strcpy(map.vexs[9].name, "网计学院");
	strcpy(map.vexs[9].features, "2017年9月正式更名为河北大学网络空间安全与计算机学院,很荣幸来到贵院!");
	strcpy(map.vexs[10].name, "校园南口");
	strcpy(map.vexs[10].features, "教学区大门,公交站点,紧邻省道,方便师生的出行。");
	strcpy(map.vexs[11].name, "餐厅");
	strcpy(map.vexs[11].features, "网红餐厅,环境优美,好吃,部分有点小贵;服务态度好,超级建议错峰就餐,人超多。");
	//边的权重赋值
	map.edges[0][1]=map.edges[1][0]=350;
	map.edges[0][4]=map.edges[4][0]=200;
	map.edges[1][2]=map.edges[2][1]=200;
	map.edges[1][4]=map.edges[4][1]=480;
	map.edges[1][5]=map.edges[5][1]=280;
	map.edges[2][3]=map.edges[3][2]=100;
	map.edges[2][11]=map.edges[11][2]=100;
	map.edges[3][11]=map.edges[11][3]=100;
	map.edges[4][5]=map.edges[5][4]=400;
	map.edges[4][6]=map.edges[6][4]=500;
	map.edges[4][9]=map.edges[9][4]=500;
	map.edges[5][7]=map.edges[7][5]=160;
	map.edges[5][8]=map.edges[8][5]=300;
	map.edges[6][7]=map.edges[7][6]=150;
	map.edges[6][10]=map.edges[10][6]=400;
	map.edges[7][8]=map.edges[8][7]=200;
	map.edges[8][10]=map.edges[10][8]=600;
	map.edges[8][11]=map.edges[11][8]=100;
	map.edges[9][10]=map.edges[10][9]=400;
	map.edges[10][7]=map.edges[7][10]=500;
}

void Exit() {
	printf("\n【警告】:\n退出系统之后,当前的所有操作将会恢复默认值。\n");
	printf("确认退出请按1,按任意键停止当前退出操作。\n");
	int flag;
	scanf("%d",&flag);
	if(flag==1) {
		system("cls");
		exit(0);
	}
}

void changepassword() {
	printf("请输入新密码:\n");
	char newword[20];
	scanf("%s",newword);
	strcpy(PASSWORD,newword);
	printf("密码修改成功!请记住您的新密码。\n");
	printf("【注意】:新密码会在您下一次进入该程序时失效并恢复系统默认密码!\n");
	system("pause");
}