其他分享
首页 > 其他分享> > 校园导游咨询系统(数据结构C语言)

校园导游咨询系统(数据结构C语言)

作者:互联网

这是本科数据结构课设时设计的一个校园导游咨询系统,包含界面可视化,功能丰富,欢迎参考,觉得可以的话,可以点个赞,谢谢!

需求分析

一、课题内容分析

二、设计思路

三、系统模块划分

四、需求分析

3.1 所需知识点

3.2 数据结构

typedef struct {                             /*存放景点信息的结构体*/
	int num;                                      /*景点代号*/
	char name[20];                                /*景点名称*/
	char intro[200];                              /*景点简介*/
}vertextype;

typedef int edgtype;                            /*权值类型*/
typedef struct {                                /*校园景点图结构体*/
	vertextype vexs[M];                           /*顶点信息域*/
	edgtype edge[M][M];                           /*邻接矩阵*/
	int vexNum, edgNum;                           /*图中顶点数和边数*/
}mgraphtype;

 3.3 基本算法实现

int menu();                                /*主菜单*/
void Create_Map(mgraphtype *g);            /*从文件读取信息建立图*/
void Print_Map();                          /*显示校园景点地图*/
int Judge_Input(int num);                   /*判断输入的编号是否合理*/
void Search_Location(mgraphtype *g);       /*景点信息查询*/
void ShortPath(mgraphtype *g);             /*求景点间最短路径*/
void Floyd_Print(mgraphtype *g, int sNum, int eNum);/*递归打印两点间最短路径*/
void Shortpath_Print(mgraphtype *g);    /*输出并打印两点间的最短路径*/
void Dfs_Print(mgraphtype *g, int sNum, int eNum);/*深度优先遍历查询两景点间所有路径*/
void Allpath_Print(mgraphtype *g);    /*查询两顶点间的所有路径并打印*/
void BestPath(mgraphtype *g);        /*多顶点间求最佳路径*/
void System_Exit(int *q);            /*退出系统*/

3.4 系统开发平台要求

3.5 参考书籍

五、项目附加功能

 六、核心功能代码实现

1. 景点信息查询

void Search_Location(mgraphtype *g) {
	int s;
	do {
		printf("\n请输入你要查找的景点编号:");
		scanf("%d", &s);
	} while (Judge_Input(s));
	printf("\n景点名称:[%s]\n\n", g->vexs[s - 1].name);
	printf("景点简介: %s\n\n", g->vexs[s - 1].intro);
}

2. Floyd算法求两景点间的一条最短的路径

int dist[M][M];                                                    /*距离向量*/
int path[M][M];                                                    /*路径向量*/
void ShortPath(mgraphtype *g) {
	int i, j, k;
	for (i = 0; i < g->vexNum; i++)                                /*初始化距离向量矩阵与路径向量矩阵*/
		for (j = 0; j < g->vexNum; j++) {
			dist[i][j] = g->edge[i][j];
			if (i != j && dist[i][j] < INFINITY) path[i][j] = i;
			else path[i][j] = -1;                                  /*-1代表当前两点不可达*/
		}
	for (k = 0; k < g->vexNum; k++)                                /*递推求解每两景点的最短路径*/
		for (i = 0; i < g->vexNum; i++)
			for (j = 0; j < g->vexNum; j++)                        /*更新dist[i][j]的值*/
				if (dist[i][j] >(dist[i][k] + dist[k][j])) {
					dist[i][j] = dist[i][k] + dist[k][j];
					path[i][j] = k;                                /*path用于记录最短路径上的经结点*/
				}
}

3. 递归实现打印两点间的最短路径

void Floyd_Print(mgraphtype *g, int sNum, int eNum) {
	if (path[sNum][eNum] == -1 || path[sNum][eNum] == eNum || path[sNum][eNum] == sNum)
		return;
	else {
		Floyd_Print(g, sNum, path[sNum][eNum]);                 /*将中间点作为终点继续打印路径*/
		printf("%s->", g->vexs[path[sNum][eNum]].name);         /*打印中间景点名字*/
		Floyd_Print(g, path[sNum][eNum], eNum);                 /*将中间点作为起点继续打印路径*/
	}
}

4. 深度优先遍历查询任意两个景点之间的所有路径

int pathStack[M];                                                             /*路径栈,存储路径信息*/
int top;                                                                      /*栈顶*/
int visited[M];                                                               /*入栈标记,防止形成回路*/
int count;                                                                    /*路径计数器*/
void Dfs_Print(mgraphtype *g, int sNum, int eNum) {
	int dis = 0;                                                              /*用于记录路径长度*/
	pathStack[top] = sNum;                                                    /*将本趟起点入栈*/
	top++;
	visited[sNum] = 1;                                                        /*将入栈点标记为已入栈*/
	for (int i = 0; i < g->vexNum; i++) {
		if (g->edge[sNum][i] > 0 && g->edge[sNum][i] != INFINITY && !visited[i]) {
			/*表明前一个入栈点与该点可达,且该点未入栈(未被访问)*/
			if (i == eNum) {                                                  /*如果深度遍历搜到了终点,就输出刚才的路径*/
				printf("第%d条路:", count++);
				for (int j = 0; j < top; j++) {
					printf("%s->", g->vexs[pathStack[j]].name);
					if (j < top - 1)
						dis = dis + g->edge[pathStack[j]][pathStack[j + 1]];        /*统计路径长度*/
				}
				dis = dis + g->edge[pathStack[top - 1]][eNum];                      /*最后一条路单独出来,因为enum不能入栈*/
				printf("%s\n", g->vexs[eNum].name);
				printf("总长度是:%dm\n\n", dis);
			}
			else {
				Dfs_Print(g, i, eNum);                                              /*如果该点不是终点,接着深度搜索*/
				top--;                                                              /*支路全被访问一遍后,顶点出栈*/
				visited[i] = 0;                                                     /*将出栈点标记为已出栈,允许下次访问*/
			}
		}
	}
}

 5. 查询任意两个景点之间的所有路径并打印

void Allpath_Print(mgraphtype *g) {
	int sNum, eNum;
	count = 1;                                                       /*路径计数器*/
	top = 0;                                                         /*栈顶*/
	memset(pathStack, 0, sizeof(pathStack));                         /*路径栈初始化*/
	memset(visited, 0, sizeof(visited));                             /*入栈标记初始化*/
	do {
		printf("\n请输入起点编号:");
		scanf("%d", &sNum);
	} while (Judge_Input(sNum));
	do {
		printf("\n请输入终点编号:");
		scanf("%d", &eNum);
	} while (Judge_Input(eNum));
	printf("\n");
	Dfs_Print(g, sNum - 1, eNum - 1);
}

6. 多景点间求最佳路径

void BestPath(mgraphtype *g) {
	int vNum[M] = { 0 }, j = 1;                                       /*记录用户输入的编号信息*/
	int d = 0;                                                        /*统计全程总长*/
	printf("\n请输入你要游览的第%d个景点的编号(输入-1结束输入):", j);
	scanf("%d", &vNum[j - 1]);
	while (vNum[j - 1] != -1 && j < 12) {
		while (Judge_Input(vNum[j - 1])) {
			printf("\n请输入你要游览的第%d个景点编号:", j);
			scanf("%d", &vNum[j - 1]);
		}
		if (vNum[j - 1] == -1) break;
		printf("\n请输入你要游览的第%d个景点编号:", ++j);
		scanf("%d", &vNum[j - 1]);
	}
	printf("\n这是最佳访问路径:");
	for (int i = 0; vNum[i] > 0 && vNum[i + 1] > 0; i++) {
		printf("%s->", g->vexs[vNum[i] - 1].name);                   /*输出路径上的起点*/
		Floyd_Print(g, vNum[i] - 1, vNum[i + 1] - 1);                /*利用Floyd算法*/
		d += dist[vNum[i] - 1][vNum[i + 1] - 1];
	}
	printf("%s\n\n", g->vexs[vNum[j - 2] - 1].name);                 /*输出路径上的终点*/
	printf("全程总长为:%dm\n\n", d);
}

完整代码请移步本人GitHub:校园导游咨询系统

标签:eNum,int,路径,导游,C语言,景点,printf,sNum,数据结构
来源: https://blog.csdn.net/qq_37543361/article/details/120322473