From b021787f65d339b942889bb20525db28569974a1 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Sat, 24 Jun 2023 23:17:34 +0800 Subject: [PATCH 01/12] CHANGE --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e7ae5c5..6b6fae2 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,25 @@ ## 1.1 问题描述 -问题描述和具体要求。 +设计一个城市公路导航系统,能够计算出省内及周边任意两个城市之间的导航路径及最短距离。选择一个合适的省份,省内及周边城市数量在 100 个左右(最少不低于 80 个)。查阅相关资料获取邻近城市之间的公路里程数据,建立导航地图。任意指定两个城市作为起点和终点,系统能够计算出两个城市之间的最短距离和导航路径。 +(1)基于真实的公路地图数据建立导航地图模型,编制成格式简单的数据文件,包括城市名称,以及邻近城市之间的公路里程数。 + +(2)系统能够读取导航地图数据文件,建立地图模型,也能够将模型输出成地图数据文件,以便验证模型的正确性。 + +(3)通过人机交互的方式输入起点和终点城市名称,系统给出最短路径和导航路径上途径的城市名称。 + +(4)能够读取不同的导航地图进行功能测试。 + +要求系统运行正常、功能完整;数据结构使用得当,算法有较高的效率;代码规范、可读性高,结构清晰;具备一定的健壮性、可靠性和可维护性。 ## 1.2 可行性分析 +地图可以用图结构建立模型,每个城市作为图中的一个顶点,城市之间的公路对应图中的边。给定起点和终点的条件下,可以利用最短路径算法求得导航路径。 + +真实的公路地图数据需要经过预先处理,编辑并保存成便于程序读取和处理的格式。在数据量比较大的情况下,要根据数据的特点采用合适的数据结构。 + +除了基于真实数据的测试,还可以采用小规模的模拟数据进行测试,以便验证算法的正确性。 + 明确解决问题的关键,核心数据结构,核心算法等。 确定解决问题的总体思路和方案。 @@ -174,7 +189,5 @@ void bubble_sort(T a[], int n) # 参考文献 -列出参考的文献资料,根据情况自行添加。 - [1] 严蔚敏, 吴伟民. 数据结构(C语言版). 北京: 清华大学出版社, 2007. - +[山东省国道里程表](http://www.onegreen.net/maps/HTML/50213.html) From b6baf86b92b1f68762e775395be6f58c8904c057 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Sun, 2 Jul 2023 16:21:30 +0800 Subject: [PATCH 02/12] change --- README.md | 161 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 138 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6b6fae2..3be33e8 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,33 @@ # 项目名称 城市公路导航系统 +``` 杨腾泽,刘鑫成,李培毅,孙英皓 - +``` **摘要**:本项目针对什么问题,实现了哪些功能。为了有效地存储和处理何种数据,采用了何种数据结构。为了解决什么问题,采用了什么算法,算法效率如何。针对其他特定需求做了哪些工作。项目的整体效果如何,有何亮点和创新。 任务分工及完成情况。 - +| 任务 | 设计 | 开发 | 测试 | 文档 | +| ---- | ---- | ---- | ---- | ---- | +| 1. 系统分析 | 杨腾泽 | 杨腾泽 | 刘鑫成 | 杨腾泽 | +| 2. 系统设计 | 团队 | 团队 | 孙英皓 | 杨腾泽 | 工作量占比。 +| 杨腾泽 | 孙英皓 | 李培毅 | 刘鑫成 | +|--------|-------|---------|-------| +| 25 | 25 | 25 | 25 | + + + + + + + + # 1. 系统分析 @@ -51,9 +66,7 @@ ### (2)数据字典 -描述系统中需要处理的所有数据包含的具体信息。例如: - -学生 = 学号 + 姓名 + 成绩 +地点 = 城市名 + 编号 + 地点介绍 + 弧边 ### (3)数据文件 @@ -75,6 +88,14 @@ + + + + + + + + # 2. 系统设计 ## 2.1 概要设计 @@ -113,44 +134,120 @@ + + + + + + + # 3. 系统实现 -说明所使用的语言、开发工具等。 +本次使用的程序语言为C++,开发工具为VScode。 介绍项目的文件结构,以及主要函数的功能。 -## 3.1 核心数据结构的实现 -描述数据结构的实现方法。 -可以配合程序代码加以说明。如: -```cpp -struct LNode { - E data; // 数据元素 - LNode *next; // 指向下一个结点的指针 -}; -``` +## 3.1 核心数据结构的实现 + +```cpp +typedef struct +{ + int length;//边的长度,既两个地点之的长 + int money; +}ArcCell; //定义边的类型 + +typedef struct +{ int no; //顶点的编号 + char sight[10]; //地点 + char introduction[100]; //地点的介绍 +}VertexType; //定义顶点的类型 + +typedef struct +{ + int vexnum; //顶点数 + int arcnum; //边数 + VertexType vexs[NO]; //在图结构体中调用点的结构体 + ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 +}MatGrath; + 对该数据结构的特点进行分析。 -## 3.2 核心算法的实现 -描述算法的实现方法。 -可以配合程序代码加以说明。如: + + + + + +## 3.2 核心算法的实现 ```cpp -// 冒泡排序 -void bubble_sort(T a[], int n) + +//Dijkstra算法 +void Ppath(MatGrath &G,int path[],int w,int v) //前向递归查找路径上的顶点 { - ...... + int k; + k=path[w]; + if (k==v) return; //找到了起点则返回 + Ppath(G,path,k,v); //找顶点k的前一个顶点 + printf("%s->",G.vexs[k].sight); //输出顶点k } -``` + + +int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 +{ + int dist[MAXV],path[MAXV]; + int s[MAXV]; + int mindis,i,j,u; + for (i=0; i",G.vexs[v].sight); //输出路径上的起点 + Ppath(G,path,w,v); //输出路径上的中间点 + printf("%s\n",G.vexs[w].sight); //输出路径上的终点 + } + if(s[w]==0) + printf("从%d到%d不存在路径\n",v,w); +} + @@ -158,6 +255,14 @@ void bubble_sort(T a[], int n) + + + + + + + + # 4. 系统测试 描述测试的思路和方法。比如,先用小数据量进行测试,再用真实数据进行测试。 @@ -168,6 +273,15 @@ void bubble_sort(T a[], int n) + + + + + + + + + # 5. 总结 概况项目和完成情况。 @@ -176,7 +290,8 @@ void bubble_sort(T a[], int n) 个人小结: -杨腾泽: +杨腾泽:通过这次数据结构课程设计,我对《数据结构》这门课程有了更深一步的了解,使我对《数据结构》这门课程掌握以及运用更加灵活·同时也让我发现了自已在这门课上的不足与缺陷,同时也明确了自己在以后的类似课程中的具体学习方法。 +这次在应用中,我发现了自己的很多不足,在编写城市公路导航系统的过程中,自己C语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一 次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也 知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许 掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。 如此次对于邻接 矩阵的存储于读取,以及最短路算法的实现,两个及其重要的算法,狄克斯特算法和佛洛依德算法,在具体的应用上还是有很多不足 刘鑫成: From 9c714baf3fffd2209c5a8aeed2f32b99c8093072 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Sun, 2 Jul 2023 16:22:26 +0800 Subject: [PATCH 03/12] change --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3be33e8..5b68d42 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ typedef struct VertexType vexs[NO]; //在图结构体中调用点的结构体 ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 }MatGrath; - +``` 对该数据结构的特点进行分析。 @@ -247,7 +247,7 @@ int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 if(s[w]==0) printf("从%d到%d不存在路径\n",v,w); } - +``` From 4fedf3871b4f433b4b3a71f73bc37d1334d45cbd Mon Sep 17 00:00:00 2001 From: yangtengze Date: Sun, 2 Jul 2023 16:38:16 +0800 Subject: [PATCH 04/12] 1 --- README.md | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b68d42..183022c 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,12 @@ ### (1)输入和输出 -确定系统的主要输入和输出,如可以设定的参数,数据文件等,明确其主要作用。 +输入形式: +构建图时,输入顶点、弧涉及的信息,包括:起始地、目的地、长度、该弧此时间段的平均速度等信息; +用户或者客户要输入出发地和目的地,并选择何种最优决策的路线规划。 +输出形式:根据用户需求输出对应信息 +输出最短路程所需要的路线信息和最短路程; +输出最短时间所需要的路线信息和最短时间。 ### (2)数据字典 @@ -124,7 +129,35 @@ 首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 -### (1)XXX算法 +### (1)Dijkstra算法 + + +求最短路径Dijkstra算法的实现: + +设置Visited[]保存是否被标记,Dis[]保存用户起点到下标号的节点路径的长度,Father[]保存最短路径上的前一个节点。其他类似于Prim算法。 +算法主体有三步: + +1.更新:找到这样的两个顶点 即 i位置已经被访问 且j位置未被访问 且ij有连接,把(0,i)+(i,j)和(0,j)中的较小者赋给j,并且Father[j] = i即i作为j的前驱节点。 +2.访问:每轮在更新Dis后 判断最小未被标记的顶点 对其访问(vis = 1;) +3.重复1、2 步骤直到Visited[]的值全为1为止。 +然后是输出语句: + +输出用户输入位置到其他各个顶点的最短路径长度: +直接一个循环输出Dis数组的前n位即可 +输出用户输入位置到其他各个顶点的最短路径对应的路线: +首先设置i从0到n的循环每次都将i赋值给VVV作为终点,v是用户输入的起点位置。 +``` +while (Father[vvv] != -1 && Father[vvv] != v) + { + cout << Father[vvv] << "<--"; + vvv = Father[vvv]; + } +``` +根据Father数组内存的节点的前驱关系输出路线。 +以上是迪杰斯特拉算法的基础部分, + +在本程序中由于多次调用了此算法,为了减少重复的代码提高代码的复用性,于是在此算法中增加了一个接口,即一个switch case开关语句,调用迪杰斯特拉时需要在参数列表中给出需要进入的部分以实现不同的功能。 + 给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。 @@ -189,6 +222,8 @@ typedef struct ## 3.2 核心算法的实现 +在验证到其他城市中间不超过 2 个城市时,新建一个二维数组将原二维数组中的权值全部改为1,这样用dijkstra算法得到的权值最小的路径就经过节点最少的路径。 + ```cpp //Dijkstra算法 From 5d531ce7ec23736ec6faafc119d2ca19717bba1c Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 3 Jul 2023 16:10:39 +0800 Subject: [PATCH 05/12] code eidt --- code/{creat.cpp => creat.h} | 0 code/{function.cpp => function.h} | 6 +++--- code/main.cpp | 22 +++++++++++++--------- code/{menu.cpp => menu.h} | 0 code/{short.cpp => short.h} | 11 +++++++---- code/tempCodeRunnerFile.h | 1 + code/type.h | 23 ++++++++++++----------- 7 files changed, 36 insertions(+), 27 deletions(-) rename code/{creat.cpp => creat.h} (100%) rename code/{function.cpp => function.h} (97%) rename code/{menu.cpp => menu.h} (100%) rename code/{short.cpp => short.h} (96%) create mode 100644 code/tempCodeRunnerFile.h diff --git a/code/creat.cpp b/code/creat.h similarity index 100% rename from code/creat.cpp rename to code/creat.h diff --git a/code/function.cpp b/code/function.h similarity index 97% rename from code/function.cpp rename to code/function.h index 359395c..03c2f2b 100644 --- a/code/function.cpp +++ b/code/function.h @@ -36,7 +36,7 @@ 输入:两个点的编号 输出:无 ***********************/ - int addbian(MatGrath &G) + void addbian(MatGrath &G) { int b,c,d; int i,j; printf("请输入你要增加的边的两个点\n"); @@ -58,7 +58,7 @@ 输入:与其他点的边的权值 输出:无 ***********************/ - int adddian(MatGrath &G) + void adddian(MatGrath &G) { int a; int b; @@ -100,7 +100,7 @@ 输入:要修改的城市编号,以及修改后的城市信息 输出:无 ***********************/ - int modify(MatGrath &G) + void modify(MatGrath &G) { int a; int flag=1; diff --git a/code/main.cpp b/code/main.cpp index ce8ce4d..73e926d 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -2,8 +2,13 @@ #include #include #include -#include "type.h" #include +#include "type.h" +#include "menu.h" +#include "function.h" +#include "creat.h" +#include "short.h" + int CreatGrath(MatGrath &G); //创造图 int DFS(MatGrath &G,int m); @@ -11,22 +16,21 @@ void ShortestPath(MatGrath &G,int v,int w); //Dijkstra算法求最短 void Ppath(MatGrath &G,int path[],int w,int v); //前向递归查找路径上的顶点 int Ppath1(MatGrath &G,int path[][MAXV],int v,int w);//前向递归查找路径上的顶点 -int ShortestMoney(MatGrath &G,int v,int w); //用floyd算法求最少费用 - +void ShortestMoney(MatGrath &G,int v,int w); //用floyd算法求最少费用 + int menu(void); int delet(MatGrath &G,int y,int x); int search(MatGrath &G); //查找某一个城市的信息 -int addbian(MatGrath &G); //增加城市的边信息 -int adddian(MatGrath &G); //增加城市的信息 -int modify(MatGrath &G); //修改城市信息 +void addbian(MatGrath &G); //增加城市的边信息 +void adddian(MatGrath &G); //增加城市的信息 +void modify(MatGrath &G); //修改城市信息 int display(MatGrath &G);//输出所有城市信息 - -int danyuan(MatGrath &G,int d); //求两点之间的最短路径 +void danyuan(MatGrath &G,int d); //求两点之间的最短路径 int Ppath2(MatGrath &G,int path[],int i,int v); - + int main() { int a; //case语句的选择 diff --git a/code/menu.cpp b/code/menu.h similarity index 100% rename from code/menu.cpp rename to code/menu.h diff --git a/code/short.cpp b/code/short.h similarity index 96% rename from code/short.cpp rename to code/short.h index 7215fb4..365b498 100644 --- a/code/short.cpp +++ b/code/short.h @@ -1,5 +1,7 @@ #include"type.h" + + /*********************** 功能:用floyd算法求给出的两点之间的最短路径 @@ -17,7 +19,7 @@ void Ppath(MatGrath &G,int path[],int w,int v) //前向递归查找路径上的 } -int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 +void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 { int dist[MAXV],path[MAXV]; int s[MAXV]; @@ -87,6 +89,8 @@ int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找 Ppath1(G,path,k,w); //找顶点k的前一个顶点j } + + void ShortestMoney(MatGrath &G,int v,int w)//求花费最少的路径 { int A[MAXV][MAXV],path[MAXV][MAXV]; @@ -138,15 +142,14 @@ int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的 { int k; k=path[i]; - if (k==v) - return k; //找到了起点则返回 + if (k==v) return k; //找到了起点则返回 Ppath2(G,path,k,v); //找顶点k的前一个顶点 printf("%s->",G.vexs[k].sight);//输出顶点k } -int danyuan(MatGrath &G,int v)//求两点之间的最短路径 +void danyuan(MatGrath &G,int v)//求两点之间的最短路径 { int dist[MAXV],path[MAXV]; int s[MAXV]; diff --git a/code/tempCodeRunnerFile.h b/code/tempCodeRunnerFile.h new file mode 100644 index 0000000..54caf60 --- /dev/null +++ b/code/tempCodeRunnerFile.h @@ -0,0 +1 @@ +] \ No newline at end of file diff --git a/code/type.h b/code/type.h index 8408f59..92855ba 100644 --- a/code/type.h +++ b/code/type.h @@ -1,28 +1,29 @@ -#include +#pragma once +#ifndef _TEST_H_ +#define _TEST_H_ + #define NO 30 #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ -typedef struct + +struct ArcCell { int length;//边的长度,既两个地点之的长 int money; -}ArcCell; //定义边的类型 +}; //定义边的类型 -typedef struct +struct VertexType { int no; //顶点的编号 char sight[10]; //地点 char introduction[100]; //地点的介绍 -}VertexType; //定义顶点的类型 +}; //定义顶点的类型 -typedef struct +struct MatGrath { int vexnum; //顶点数 int arcnum; //边数 VertexType vexs[NO]; //在图结构体中调用点的结构体 ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 -}MatGrath; +}; - - - - +#endif \ No newline at end of file From 6544282aaf713c50505b85a5e0f440bfa9775497 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 3 Jul 2023 16:18:15 +0800 Subject: [PATCH 06/12] code --- code/short.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/code/short.h b/code/short.h index 365b498..400e5c0 100644 --- a/code/short.h +++ b/code/short.h @@ -1,6 +1,28 @@ #include"type.h" - +#define NO 30 +#define MAXV 100 //最大顶点个数 +#define INF 32767 //INF表示∞ +typedef struct +{ + int length;//边的长度,既两个地点之的长 + int money; +}ArcCell; //定义边的类型 + +typedef struct +{ int no; //顶点的编号 + char sight[10]; //地点 + char introduction[100]; //地点的介绍 +}VertexType; //定义顶点的类型 + +typedef struct +{ + int vexnum; //顶点数 + int arcnum; //边数 + VertexType vexs[NO]; //在图结构体中调用点的结构体 + ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 +}MatGrath; + /*********************** From 0a6a24145bfe4702d2943927fe2502f723d3ac1e Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 3 Jul 2023 16:18:43 +0800 Subject: [PATCH 07/12] code --- code/main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/main.cpp b/code/main.cpp index 73e926d..625ac62 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -44,13 +44,9 @@ int main() MatGrath G; system("color 1A"); /*修改控制台的颜色信息,改为绿字红底的模式*/ CreatGrath(G); - printf(" ■■■■■■■■■■■■■■■■■■■■ \n"); - printf(" ■ ■ \n"); printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n"); printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n"); printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n"); - printf(" ■ 作者:杨腾泽 ■ \n"); - printf(" ■■■■■■■■■■■■■■■■■■■■ \n"); printf("\n"); printf(" 编号 城市名称\n"); printf(" 1 烟台市\n"); From b355e9bdda161f81605dbf3967f4f1abab60cae8 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 3 Jul 2023 16:19:22 +0800 Subject: [PATCH 08/12] code --- code/short.h | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/code/short.h b/code/short.h index 400e5c0..4728f6e 100644 --- a/code/short.h +++ b/code/short.h @@ -1,28 +1,5 @@ #include"type.h" -#define NO 30 -#define MAXV 100 //最大顶点个数 -#define INF 32767 //INF表示∞ -typedef struct -{ - int length;//边的长度,既两个地点之的长 - int money; -}ArcCell; //定义边的类型 - -typedef struct -{ int no; //顶点的编号 - char sight[10]; //地点 - char introduction[100]; //地点的介绍 -}VertexType; //定义顶点的类型 - -typedef struct -{ - int vexnum; //顶点数 - int arcnum; //边数 - VertexType vexs[NO]; //在图结构体中调用点的结构体 - ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 -}MatGrath; - /*********************** From 9702138b6545732cb1139cbd665f9c9510a15399 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 3 Jul 2023 16:58:39 +0800 Subject: [PATCH 09/12] change --- README.md | 34 ++++++++++++++-------------------- code/short.h | 5 ----- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 183022c..7301538 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,20 @@ # 项目名称 城市公路导航系统 -``` +### 成员 杨腾泽,刘鑫成,李培毅,孙英皓 -``` + **摘要**:本项目针对什么问题,实现了哪些功能。为了有效地存储和处理何种数据,采用了何种数据结构。为了解决什么问题,采用了什么算法,算法效率如何。针对其他特定需求做了哪些工作。项目的整体效果如何,有何亮点和创新。 任务分工及完成情况。 -| 任务 | 设计 | 开发 | 测试 | 文档 | -| ---- | ---- | ---- | ---- | ---- | -| 1. 系统分析 | 杨腾泽 | 杨腾泽 | 刘鑫成 | 杨腾泽 | -| 2. 系统设计 | 团队 | 团队 | 孙英皓 | 杨腾泽 | - +| 任务 | 设计 | 测试 | +| ---- | ---- | ---- | +| 1. 系统分析 | 李培毅 | 刘鑫成 | +| 2. 系统设计 | 杨腾泽 | 孙英皓 | +| 3. 系统实现 | 刘鑫成 | 杨腾泽 | +| 4. 系统测试 | 孙英皓 | 李培毅 | 工作量占比。 @@ -24,13 +25,6 @@ - - - - - - - # 1. 系统分析 ## 1.1 问题描述 @@ -188,25 +182,25 @@ while (Father[vvv] != -1 && Father[vvv] != v) ## 3.1 核心数据结构的实现 ```cpp -typedef struct +struct ArcCell { int length;//边的长度,既两个地点之的长 int money; -}ArcCell; //定义边的类型 +}; //定义边的类型 -typedef struct +struct VertexType { int no; //顶点的编号 char sight[10]; //地点 char introduction[100]; //地点的介绍 -}VertexType; //定义顶点的类型 +}; //定义顶点的类型 -typedef struct +struct MatGrath { int vexnum; //顶点数 int arcnum; //边数 VertexType vexs[NO]; //在图结构体中调用点的结构体 ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 -}MatGrath; +}; ``` 对该数据结构的特点进行分析。 diff --git a/code/short.h b/code/short.h index 4728f6e..20587ae 100644 --- a/code/short.h +++ b/code/short.h @@ -2,11 +2,6 @@ #include"type.h" -/*********************** -功能:用floyd算法求给出的两点之间的最短路径 -输入:出发地,目的地 -输出:地点的最短路程以及路径 -***********************/ //Dijkstra算法 void Ppath(MatGrath &G,int path[],int w,int v) //前向递归查找路径上的顶点 { From 4c78e0926a453dc302ee85df545908b4d27eeb30 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Tue, 4 Jul 2023 17:45:57 +0800 Subject: [PATCH 10/12] change --- .vscode/settings.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index cd503cd..2555b0e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,9 @@ "files.associations": { "stdlib.h": "c", "string.h": "c" + }, + "code-runner.executorMap": { + "c": "cd $dir && gcc -fexec-charset=GBK $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "cpp": "cd $dir && g++ -fexec-charset=GBK $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", } } \ No newline at end of file From 31b3c58cafdc8d00cf96a5fd0ecd9ee1e03f10e5 Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 10 Jul 2023 11:03:16 +0800 Subject: [PATCH 11/12] code --- code/creat.h | 167 +++++++++++++++++++++++++------------- code/function.h | 84 +++++++++---------- code/main.cpp | 61 +++++++++++--- code/menu.h | 4 +- code/short.h | 58 ------------- code/tempCodeRunnerFile.h | 1 - code/type.h | 18 ++-- 7 files changed, 208 insertions(+), 185 deletions(-) delete mode 100644 code/tempCodeRunnerFile.h diff --git a/code/creat.h b/code/creat.h index 1ceadc2..314661b 100644 --- a/code/creat.h +++ b/code/creat.h @@ -12,73 +12,128 @@ G.arcnum=14; //说明图的边的数目 for(i=1;i<=G.vexnum;i++) { - G.vexs[i].no=i; + G.vexs[i].bianhao=i; } - strcpy(G.vexs[1].sight,"烟台市"); - strcpy(G.vexs[1].introduction,"山东省沿海城市,位于山东半岛中部"); - strcpy(G.vexs[2].sight,"青岛市"); - strcpy(G.vexs[2].introduction,"山东省沿海城市,位于山东半岛南部,有崂山风景区等众多景点"); - strcpy(G.vexs[3].sight,"潍坊市"); - strcpy(G.vexs[3].introduction,"景色优美,气候宜人,经济发达"); - strcpy(G.vexs[4].sight,"威海市"); - strcpy(G.vexs[4].introduction,"山东省辖地级市,位于山东半岛东端,北,东,南三面濒临 黄海"); - strcpy(G.vexs[5].sight,"东营市"); - strcpy(G.vexs[5].introduction,"山东省辖地级市,位于山东省东北部,黄河入海口的三角洲地带"); - strcpy(G.vexs[6].sight,"滨州市"); - strcpy(G.vexs[6].introduction,"山东省辖地级市,位于山东省北部、鲁北平原、黄河三角洲腹地"); - strcpy(G.vexs[7].sight,"德州市"); - strcpy(G.vexs[7].introduction,"山东省辖地级市,位于山东省西北部,北以新河为界,"); - strcpy(G.vexs[8].sight,"聊城市"); - strcpy(G.vexs[8].introduction,"山东省辖地级市,位于山东省西部,西部靠漳卫河与河 "); - strcpy(G.vexs[9].sight,"菏泽市"); - strcpy(G.vexs[9].introduction,"位于山东西南部,鲁苏豫皖交界地带,东与济宁市相邻"); - strcpy(G.vexs[10].sight,"泰安市"); - strcpy(G.vexs[10].introduction,"位于山东省中部,是鲁中地区中心城,国家历史文化名城"); - + strcpy(G.vexs[1].sight,"济南市"); + strcpy(G.vexs[2].sight,"德州市"); + strcpy(G.vexs[3].sight,"淄博市"); + strcpy(G.vexs[4].sight,"潍坊市"); + strcpy(G.vexs[5].sight,"烟台市"); + strcpy(G.vexs[6].sight,"威海市"); + strcpy(G.vexs[7].sight,"青岛市"); + strcpy(G.vexs[8].sight,"日照市"); + strcpy(G.vexs[9].sight,"临沂市"); + strcpy(G.vexs[10].sight,"济宁市"); + strcpy(G.vexs[11].sight,"泰安市"); + strcpy(G.vexs[12].sight,"滨州市"); + strcpy(G.vexs[13].sight,"菏泽市"); + strcpy(G.vexs[14].sight,"即墨市"); + strcpy(G.vexs[15].sight,"胶州市"); + strcpy(G.vexs[16].sight,"胶南市"); + strcpy(G.vexs[17].sight,"诸城市"); + strcpy(G.vexs[18].sight,"高密市"); + strcpy(G.vexs[19].sight,"安丘市"); + strcpy(G.vexs[20].sight,"莒县"); + strcpy(G.vexs[21].sight,"平度市"); + strcpy(G.vexs[22].sight,"莱西市"); + strcpy(G.vexs[23].sight,"莱阳市"); + strcpy(G.vexs[24].sight,"海阳市"); + strcpy(G.vexs[25].sight,"乳山市"); + strcpy(G.vexs[26].sight,"文登市"); + strcpy(G.vexs[27].sight,"荣成市"); + strcpy(G.vexs[28].sight,"牟平区"); + strcpy(G.vexs[29].sight,"蓬莱市"); + strcpy(G.vexs[30].sight,"栖霞市"); + strcpy(G.vexs[31].sight,"莱州市"); + strcpy(G.vexs[32].sight,"招远市"); + strcpy(G.vexs[33].sight,"龙口市"); + strcpy(G.vexs[34].sight,"昌邑市"); + strcpy(G.vexs[35].sight,"昌乐"); + strcpy(G.vexs[36].sight,"孝光市"); + strcpy(G.vexs[37].sight,"青州市"); + strcpy(G.vexs[38].sight,"临朐"); + strcpy(G.vexs[39].sight,"沂水"); + strcpy(G.vexs[40].sight,"广饶"); + strcpy(G.vexs[41].sight,"东营市"); + strcpy(G.vexs[42].sight,"沂源"); + strcpy(G.vexs[43].sight,"恒台"); + strcpy(G.vexs[44].sight,"博兴"); + strcpy(G.vexs[45].sight,"博山"); + strcpy(G.vexs[46].sight,"沂南"); + strcpy(G.vexs[47].sight,"蒙阴"); + strcpy(G.vexs[48].sight,"莱芜市"); + for(i=0;i=0&&a<=G.vexnum) { printf("编号已经存在,请重新输入\n"); scanf("%d",&a); - G.vexs[a].no=a; + G.vexs[a].bianhao = a; } else flag=0; } - printf("请输入你要连接的点权值和所需费用\n"); - scanf("%d",&b); - scanf("%d",&c); + printf("请输入你要连接的点权值\n"); scanf("%d",&d); - G.arc[a][b].money=G.arc[a][b].money=c; G.arc[a][b].length=G.arc[b][a].length=d; scanf("%s",G.vexs[a].sight); - scanf("%s",G.vexs[a].introduction); G.vexnum++; } @@ -117,10 +113,8 @@ else flag=0; } - printf("请输入你要修改的信息\n"); - scanf("%s",G.vexs[a].sight); - - scanf("%s",G.vexs[a].introduction); + printf("请输入你要修改的信息\n"); + scanf("%s",G.vexs[a].sight); } @@ -135,7 +129,7 @@ printf("城市编号 城市名称 城市介绍\n"); for (i=1; i<=G.vexnum;i++) { - printf("% -9d % -10s %-15s\n",G.vexs[i].no,G.vexs[i].sight,G.vexs[i].introduction); + printf("% -9d % -10s\n",G.vexs[i].bianhao,G.vexs[i].sight); } return 0; } @@ -145,34 +139,30 @@ 输出:输出所有的城市信息 ***********************/ - bool visited[MAXV]; - int DFS(MatGrath &G,int m)//深度优先搜索 +bool visited[MAXV]; +int DFS(MatGrath &G,int m)//深度优先搜索 +{ + int i; + printf("%d %s\n",G.vexs[m].bianhao,G.vexs[m].sight); + visited[m]=true; + for(i=1;i<=G.vexnum;i++) + { + if(G.arc[m][i].length!=INF&&visited[i]==false) { - int i; - printf("%d %s %s\n",G.vexs[m].no,G.vexs[m].sight,G.vexs[m].introduction); - visited[m]=true; - for(i=1;i<=G.vexnum;i++) - { - if(G.arc[m][i].length!=INF&&visited[i]==false) - { - DFS(G,i); - } - - } - return 0; + DFS(G,i); } - /*********************** - 功能:删除某一个边 - 输入:边两边的城市编号 - 输出:无 - ***********************/ - int delet(MatGrath &G,int y,int x) - { - - - G.arc[x][y].length=G.arc[y][x].length=INF; - return 0; - - - } \ No newline at end of file + } + return 0; +} + +/*********************** +功能:删除某一个边 +输入:边两边的城市编号 +输出:无 +***********************/ +int delet(MatGrath &G,int y,int x) +{ + G.arc[x][y].length=G.arc[y][x].length=INF; + return 0; +} \ No newline at end of file diff --git a/code/main.cpp b/code/main.cpp index 625ac62..1134052 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -48,17 +48,56 @@ int main() printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n"); printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n"); printf("\n"); + printf(" 编号 城市名称\n"); - printf(" 1 烟台市\n"); - printf(" 2 青岛市\n"); - printf(" 3 潍坊市\n"); - printf(" 4 威海市\n"); - printf(" 5 东营市\n"); - printf(" 6 滨州市\n"); - printf(" 7 德州市\n"); - printf(" 8 聊城市\n"); - printf(" 9 菏泽市\n"); - printf(" 10 泰安市\n"); + printf(" 1 济南市\n"); + printf(" 2 德州市\n"); + printf(" 3 淄博市\n"); + printf(" 4 潍坊市\n"); + printf(" 5 烟台市\n"); + printf(" 6 威海市\n"); + printf(" 7 青岛市\n"); + printf(" 8 日照市\n"); + printf(" 9 临沂市\n"); + printf(" 10 济宁市\n"); + printf(" 11 泰安市\n"); + printf(" 12 滨州市\n"); + printf(" 13 菏泽市\n"); + printf(" 14 即墨市\n"); + printf(" 15 胶州市\n"); + printf(" 16 胶南市\n"); + printf(" 17 诸城市\n"); + printf(" 18 高密市\n"); + printf(" 19 安丘市\n"); + printf(" 20 莒县\n"); + printf(" 21 平度市\n"); + printf(" 22 莱西市\n"); + printf(" 23 莱阳市\n"); + printf(" 24 海阳市\n"); + printf(" 25 乳山市\n"); + printf(" 26 文登市\n"); + printf(" 27 荣成市\n"); + printf(" 28 牟平市\n"); + printf(" 29 蓬莱市\n"); + printf(" 30 栖霞市\n"); + printf(" 31 莱州市\n"); + printf(" 32 招远市\n"); + printf(" 33 龙口市\n"); + printf(" 34 昌邑市\n"); + printf(" 35 昌乐\n"); + printf(" 36 孝光市\n"); + printf(" 37 青州市\n"); + printf(" 38 临朐\n"); + printf(" 39 沂水\n"); + printf(" 40 广饶\n"); + printf(" 41 东营市\n"); + printf(" 42 沂源\n"); + printf(" 43 恒台\n"); + printf(" 44 博兴\n"); + printf(" 45 博山\n"); + printf(" 46 沂南\n"); + printf(" 47 蒙阴\n"); + printf(" 48 莱芜市\n"); while(a!=9) { a=menu(); @@ -86,7 +125,7 @@ int main() modify(G); break; case 4: - printf("1-增加边,2-增加点"); + printf("1-增加边,2-增加点"); scanf("%d",&c); if(c==1) diff --git a/code/menu.h b/code/menu.h index d98c2a4..103a0b0 100644 --- a/code/menu.h +++ b/code/menu.h @@ -15,9 +15,9 @@ printf(" ┏━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 1.选择出发点和目的地 ┃\n"); - printf(" ┃ 2.查看景点信息 ┃\n"); + printf(" ┃ 2.查看城市信息 ┃\n"); printf(" ┃ 3.修改城市信息 ┃\n"); - printf(" ┃ 4.增加景点信息 ┃\n"); + printf(" ┃ 4.增加城市信息 ┃\n"); printf(" ┃ 5.输出所有城市信息 ┃\n"); printf(" ┃ 6.输出单源路径 ┃\n"); printf(" ┃ 7.DFS遍历输出 ┃\n"); diff --git a/code/short.h b/code/short.h index 20587ae..2a67263 100644 --- a/code/short.h +++ b/code/short.h @@ -66,64 +66,6 @@ void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 -/*********************** -功能:用floyd算法求给出的两点之间的最好费用 -输入:出发地,目的地 -输出:地点的最少费用以及路径 -***********************/ -//Floyd算法 - -int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找路径上的顶点 -{ - int k; - k=path[v][w]; - if (k==-1) return 0; //找到了起点则返回 - Ppath1(G,path,v,k); //找顶点i的前一个顶点k - printf("%s->",G.vexs[k].sight); - Ppath1(G,path,k,w); //找顶点k的前一个顶点j -} - - - -void ShortestMoney(MatGrath &G,int v,int w)//求花费最少的路径 -{ - int A[MAXV][MAXV],path[MAXV][MAXV]; - int i,j,k; - for (i=0; iA[i][k]+A[k][j]) - { - A[i][j]=A[i][k]+A[k][j]; - path[i][j]=k; - } - } - - - - if (A[v][w]==INF) - { - if (v!=w) - printf("从%d到%d没有路径\n",v,w); - } - else - { - printf(" 从%s到%s路径费用:%d元人民币 路径:",G.vexs[v].sight,G.vexs[w].sight,A[v][w]); - printf("%s->",G.vexs[v].sight); //输出路径上的起点 - Ppath1(G,path,v,w); //输出路径上的中间点 - printf("%s\n",G.vexs[w].sight); //输出路径上的终点 - } - -} - - /*********************** 功能:用Dijkstra算法求给出的一点到其余个点的最短路径 diff --git a/code/tempCodeRunnerFile.h b/code/tempCodeRunnerFile.h deleted file mode 100644 index 54caf60..0000000 --- a/code/tempCodeRunnerFile.h +++ /dev/null @@ -1 +0,0 @@ -] \ No newline at end of file diff --git a/code/type.h b/code/type.h index 92855ba..397118c 100644 --- a/code/type.h +++ b/code/type.h @@ -2,28 +2,26 @@ #ifndef _TEST_H_ #define _TEST_H_ -#define NO 30 +#define M 30 #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ +struct VertexType +{ int bianhao; //顶点的编号 + char sight[10]; //地点 +}; //定义顶点的类型 + struct ArcCell { int length;//边的长度,既两个地点之的长 - int money; }; //定义边的类型 -struct VertexType -{ int no; //顶点的编号 - char sight[10]; //地点 - char introduction[100]; //地点的介绍 -}; //定义顶点的类型 - struct MatGrath { int vexnum; //顶点数 int arcnum; //边数 - VertexType vexs[NO]; //在图结构体中调用点的结构体 - ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 + VertexType vexs[M]; //在图结构体中调用点的结构体 + ArcCell arc[M][M]; //在图结构体中调用边的结构体 }; #endif \ No newline at end of file From 37e048dfca8051b4ba25436a42de25469876b26b Mon Sep 17 00:00:00 2001 From: yangtengze Date: Mon, 10 Jul 2023 11:08:13 +0800 Subject: [PATCH 12/12] cahnge --- code/main.cpp | 13 ++--------- code/menu.h | 9 ++++---- code/short.h | 61 +-------------------------------------------------- 3 files changed, 7 insertions(+), 76 deletions(-) diff --git a/code/main.cpp b/code/main.cpp index 1134052..e443c6c 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -28,9 +28,6 @@ void adddian(MatGrath &G); //增加城市的信息 void modify(MatGrath &G); //修改城市信息 int display(MatGrath &G);//输出所有城市信息 -void danyuan(MatGrath &G,int d); //求两点之间的最短路径 -int Ppath2(MatGrath &G,int path[],int i,int v); - int main() { int a; //case语句的选择 @@ -48,7 +45,6 @@ int main() printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n"); printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n"); printf("\n"); - printf(" 编号 城市名称\n"); printf(" 1 济南市\n"); printf(" 2 德州市\n"); @@ -137,20 +133,15 @@ int main() display(G); break; case 6: - scanf("%d",&d); - danyuan(G,d); - - break; - case 7: scanf("%d",&m); DFS(G,m); break; - case 8: + case 7: scanf("%d",&y); scanf("%d",&x); delet(G,y,x); break; - case 9: + case 8: printf("欢迎使用,再见!\n"); exit(0); break; diff --git a/code/menu.h b/code/menu.h index 103a0b0..cdb47b2 100644 --- a/code/menu.h +++ b/code/menu.h @@ -19,14 +19,13 @@ printf(" ┃ 3.修改城市信息 ┃\n"); printf(" ┃ 4.增加城市信息 ┃\n"); printf(" ┃ 5.输出所有城市信息 ┃\n"); - printf(" ┃ 6.输出单源路径 ┃\n"); - printf(" ┃ 7.DFS遍历输出 ┃\n"); - printf(" ┃ 8.删除节点 ┃\n"); - printf(" ┃ 9.退出系统 ┃\n"); + printf(" ┃ 6.DFS遍历输出 ┃\n"); + printf(" ┃ 7.删除节点 ┃\n"); + printf(" ┃ 8.退出系统 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" 请输入您的选择\n"); scanf("%d",&c); - if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8||c==9) + if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8) flag=0; } while(flag); return c; diff --git a/code/short.h b/code/short.h index 2a67263..f8b4167 100644 --- a/code/short.h +++ b/code/short.h @@ -71,63 +71,4 @@ void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 功能:用Dijkstra算法求给出的一点到其余个点的最短路径 输入:源点 输出:地点的最短路程以及路径 -***********************/ - -//Dijkstra算法求单源路径 -int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的顶点 -{ - int k; - k=path[i]; - if (k==v) return k; //找到了起点则返回 - Ppath2(G,path,k,v); //找顶点k的前一个顶点 - printf("%s->",G.vexs[k].sight);//输出顶点k - -} - - -void danyuan(MatGrath &G,int v)//求两点之间的最短路径 -{ - int dist[MAXV],path[MAXV]; - int s[MAXV]; - int mindis,i,j,u; - for (i=1; i<=G.vexnum; i++) - { - dist[i]=G.arc[v][i].length; //距离初始化 - s[i]=0; //s[]置空 - if (G.arc[v][i].length",G.vexs[v].sight); //输出路径上的起点 - Ppath2(G,path,i,v); //输出路径上的中间点 - printf("%s\n",G.vexs[i].sight); //输出路径上的终点 - } - - -} +***********************/ \ No newline at end of file