校园导游系统 数据结构课程设计 简单且功能齐全

【问题描述】
  用无向网表示南农校园景点平面图,所含景点不少于10个。图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等相关信息。
【基本要求】
  (1) 查询各景点的相关信息;
  (2) 查询图中任意两个景点间的最短路径。
  (3) 查询图中任意两个景点间的所有路径。
  (4) 增加、删除、更新有关景点和道路的信息。
【算法设计思想】
(1)图的存储结构:运用邻接矩阵来存储无向图的有关信息,各顶点的数据类型为了方便使用采用数字整形类型来标记。共有十个顶点分别记为1-10,共有11条路径,路径长度提前给出并存在邻接矩阵当中。
(2)菜单函数:为了保证能实现要求的6个功能,需要设计一个菜单函数来选择所需要的功能,同时设计一个退出功能。为了保证健壮性,还需要菜单函数自身实现递归直到使用了退出功能。
(3)查询函数算法:在菜单功能选择了功能1菜单功能后,进入到查询功能。通过switch,case来实现输入不同节点名称输出不同的介绍内容。
(4)最短路径算法:运用Floyd算法分别构建最小距离矩阵和选择路径矩阵。Floyd算法思想即为循环更新这两个矩阵。对于每一对节点u,v,循环查找是否存在一个顶点w使得u->w->v的距离比原来u->v的距离要小,如果是则更新该路径。分别设两个二位矩阵,命名为d[][],以及path[][],先初始化d[][]使该矩阵和邻接矩阵一样,再初始化path[][]。之后开始更新这两个矩阵,三次循环来查找是否存在路径更小的点,如果有更新这两个矩阵。最后输出结果,注意保存再矩阵中的点从0-9,但是为了方便用户所以显示出来的是1-10,因此在输出时要主要转换。
(5)所有路径算法:自身深度遍历递归。提前定义好全局start,end变量,以及两个数组stack[](用来存储路径上的顶点),v[](初始全为0,为了标志是否被访问过),为了简洁不使用栈,但为了实现栈的功能使用stack[]数组和全局变量top的组合使用。先将起点标记为访问过,并将该顶点放到数组stack中,top++,然后在该顶点的临界矩阵中找它的下一个点,如果有且未被访问过则将下一个点递归。因为要输出所有的路径,在递归结束后要将起点置为未被访问,top–,来实现所有路径的访问。
(6)插入算法:最后用临界矩阵来表示结果。要将新顶点的序号以及和其他顶点的路径信息存到邻接矩阵中,所以要新建一行。首先分析新顶点可能和其他不止一条路有路径,所以要循环询问用户是否该点与其他点有路径,用switch,case来判断何时结束,如果为1则继续修改临界矩阵的信息,如果为0则输出该邻接矩阵展示结果并结束循环。
(7)删除算法:首先要删除所有与这个被删除的节点相连的所有节点,即将这些原来存放权值的邻接矩阵信息换成32767,再将G.vexs[]数组向前移。最后将被删除节点后面以及右边的元素分别向前,向左移动。最后输出邻接矩阵。
(8)更新算法:更新两点之间权值的大小。只需要修改邻接矩阵中相应的数值即可,并用邻接矩阵来展示结果。
【源代码】

头文件:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAXNum 20
#define MAXint 32767
#define MAXVex 10
#define MAXArc 11	
#define STACK_INIT_SIZE 20
typedef int ArcType;			//权值类型
typedef int VertexType;
typedef int SElemType;
int stack[120],v[100]={
   0},top=0,start,end;		//dfs
int d[100][100],path[100][100];					//shortestway
typedef struct
{
   
	char vexs[MAXNum];
	ArcType arcs[MAXNum][MAXNum];
	int vexnum,arcnum;
}MGraph;

函数块:
#include "h.h"
void display()												//平面图函数
{
   
	printf("**********欢迎使用南京农业大学校园导游系统**********\n");
	printf("                                      1北门\n");
	printf("                                      |\n");
	printf("                                      |(7)\n");
	printf("                                      |\n");
	printf("	   2西门--(5)--3教学楼--(6)--4主楼\n");
	printf("                       |              |\n");
	printf("                       |(8)           |(5)\n");
	printf("                       |              |\n");
	printf("                  5图书馆--(5)-----6操场--(4)---7足球场--(2)---8篮球场\n");
	printf("                                    |                             |\n");
	printf("                                    |(2)                          |(3)\n");
	printf("                                    |                             |\n");
	printf("                              10南大门----------(5)--------------9宿舍\n");
	
}
void CreateUDN(MGraph &G1)								//创建无向网
{
   
	int i,j;
	G1.arcnum=MAXArc;
	G1.vexnum=MAXVex;
	for(i=0;i<G1.vexnum;i++)
	{
   
		for(j=0;j<G1.vexnum;j++)
		{
   
			G1.arcs[i][j]=MAXint;
		}
	}
	G1.arcs[0][3]=G1.arcs[3][0]=7;
	G1.arcs[1][2]=G1.arcs[2][1]=5;
	G1.arcs[2][3]=G1.arcs[3][2]=6;
	G1.arcs[2][4]=G1.arcs[4]
  • 12
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值