diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cd503cd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "stdlib.h": "c", + "string.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..ccfcfb2 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe build active file", + "command": "C:\\mingw64\\bin\\g++.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/code/creat.cpp b/code/creat.cpp new file mode 100644 index 0000000..1ceadc2 --- /dev/null +++ b/code/creat.cpp @@ -0,0 +1,86 @@ + #include"type.h" + #include + /*********************** + 功能:创建图结构 + 输入:给图中的点赋予该点的编号,名称以及简介 + 输出:无 + ***********************/ + int CreatGrath(MatGrath &G)//进行图的创建 + { + int i,j; + G.vexnum=10; //说明图的顶点的数目 + G.arcnum=14; //说明图的边的数目 + for(i=1;i<=G.vexnum;i++) + { + G.vexs[i].no=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,"位于山东省中部,是鲁中地区中心城,国家历史文化名城"); + + for(i=0;i + #include"type.h" + #include + + /*********************** + 功能:查找某一个城市的信息 + 输入:城市的编号 + 输出:城市的编号,名称以及简介 + ***********************/ + int search(MatGrath &G) + { int a; + int flag=1; + printf("请输入您要查询的城市编号\n"); + scanf("%d",&a); + while(flag) + { + if(a<=0||a>G.vexnum) + { + printf("编号不存在,请重新输入\n"); + scanf("%d",&a); + } + else + { flag=0; + + printf("编号 景点名称 简介 \n"); + printf(" %-4d %-16s%-58s\n",G.vexs[a].no,G.vexs[a].sight,G.vexs[a].introduction); + ; + } + } + return 0; + + } + + /*********************** + 功能:连接任意两个点 + 输入:两个点的编号 + 输出:无 + ***********************/ + int addbian(MatGrath &G) + { int b,c,d; + int i,j; + printf("请输入你要增加的边的两个点\n"); + scanf("%d %d",&b,&c); + printf("请输入你要增加的边的权值\n"); + scanf("%d",&d); + for (i=1; i<=G.vexnum;i++) + for (j=1;j<=G.vexnum;j++) + { + if((G.arc[i][j].length==INF)&&(i==b)&&(j==c)) + { + G.arc[i][j].length=G.arc[j][i].length=d; + } + } + + } + /*********************** + 功能:增加一个点 + 输入:与其他点的边的权值 + 输出:无 + ***********************/ + int adddian(MatGrath &G) + { + int a; + int b; + int c; + int d; + char e[10]; //地点名 + char f[100]; //地点介绍 + int flag; + printf("请输入该城市的编号\n"); + scanf("%d",&a); + G.vexs[a].no=a; + while(flag) + { + if(a>=0&&a<=G.vexnum) + { + printf("编号已经存在,请重新输入\n"); + scanf("%d",&a); + G.vexs[a].no=a; + } + else + flag=0; + } + + printf("请输入你要连接的点权值和所需费用\n"); + scanf("%d",&b); + scanf("%d",&c); + 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++; + + } + + + /*********************** + 功能:修改城市信息 + 输入:要修改的城市编号,以及修改后的城市信息 + 输出:无 + ***********************/ + int modify(MatGrath &G) + { int a; + int flag=1; + + + printf("请输入你要修改的城市的编号\n"); + scanf("%d",&a); + while(flag) + { + if(a<=0||a>G.vexnum) + { + printf("编号不存在,请重新输入\n"); + scanf("%d",&a); + } + else + flag=0; + } + printf("请输入你要修改的信息\n"); + scanf("%s",G.vexs[a].sight); + + scanf("%s",G.vexs[a].introduction); + + + } + /*********************** + 功能:输出所有的城市信息 + 输入:无 + 输出:输出所有的城市信息 + ***********************/ + int display(MatGrath &G) + { + int i; + 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); + } + return 0; + } + /*********************** + 功能:用深度遍历输出城市信息 + 输入:无 + 输出:输出所有的城市信息 + ***********************/ + + bool visited[MAXV]; + int DFS(MatGrath &G,int m)//深度优先搜索 + { + 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; + } + + /*********************** + 功能:删除某一个边 + 输入:边两边的城市编号 + 输出:无 + ***********************/ + 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 new file mode 100644 index 0000000..5be1fed --- /dev/null +++ b/code/main.cpp @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include "type.h" +#include +int CreatGrath(MatGrath &G); //创造图 +int DFS(MatGrath &G,int m); + +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算法求最少费用 + +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); //修改城市信息 +int display(MatGrath &G);//输出所有城市信息 + + +int danyuan(MatGrath &G,int d); //求两点之间的最短路径 +int Ppath2(MatGrath &G,int path[],int i,int v); + +int main() +{ + int a; //case语句的选择 + int v,w; //用于求最好费用以及最短路程 + int b; //选择两种最短 + int c; //选择增加点还是增加边 + int d; //定义单源的源点 + int m; //用于DFS算法 + int x,y; //代表删除点的两边城市的编号 + + 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"); + 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"); + while(a!=9) + { + a=menu(); + switch(a) + { + case 1: + printf("1-路径最短,2-费用最少,请选择"); + scanf("%d",&b); + scanf("%d",&v); + scanf("%d",&w); + if(b==1) + { + + ShortestPath(G,v,w); + } + if(b==2) + { + ShortestMoney(G,v,w); + } + break; + case 2: + search(G); + break; + case 3: + modify(G); + break; + case 4: + printf("1-增加边,2-增加点"); + scanf("%d",&c); + + if(c==1) + addbian(G); + else + adddian(G); + break; + case 5: + display(G); + break; + case 6: + scanf("%d",&d); + danyuan(G,d); + + break; + case 7: + scanf("%d",&m); + DFS(G,m); + break; + case 8: + scanf("%d",&y); + scanf("%d",&x); + delet(G,y,x); + break; + case 9: + printf("欢迎使用,再见!\n"); + exit(0); + break; + default: + break; + + } + } + return 0; + } \ No newline at end of file diff --git a/code/menu.cpp b/code/menu.cpp new file mode 100644 index 0000000..d98c2a4 --- /dev/null +++ b/code/menu.cpp @@ -0,0 +1,33 @@ + #include + + /*********************** + 功能:输出所有的功能目录 + 输入:选择的功能编号 + 输出:返回一个值给main函数 + ***********************/ + int menu() +{ int c; + int flag; + + do + { + flag=1; + + printf(" ┏━━━━━━━━━━━━━━━━━━━━┓\n"); + printf(" ┃ 1.选择出发点和目的地 ┃\n"); + printf(" ┃ 2.查看景点信息 ┃\n"); + printf(" ┃ 3.修改城市信息 ┃\n"); + printf(" ┃ 4.增加景点信息 ┃\n"); + printf(" ┃ 5.输出所有城市信息 ┃\n"); + printf(" ┃ 6.输出单源路径 ┃\n"); + printf(" ┃ 7.DFS遍历输出 ┃\n"); + printf(" ┃ 8.删除节点 ┃\n"); + printf(" ┃ 9.退出系统 ┃\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) + flag=0; + } while(flag); + return c; +} diff --git a/code/short.cpp b/code/short.cpp new file mode 100644 index 0000000..7215fb4 --- /dev/null +++ b/code/short.cpp @@ -0,0 +1,194 @@ + +#include"type.h" + +/*********************** +功能:用floyd算法求给出的两点之间的最短路径 +输入:出发地,目的地 +输出:地点的最短路程以及路径 +***********************/ +//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); +} + + + + + + + + +/*********************** +功能:用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算法求给出的一点到其余个点的最短路径 +输入:源点 +输出:地点的最短路程以及路径 +***********************/ + +//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 + +} + + +int 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); //输出路径上的终点 + } + + +} diff --git a/code/type.h b/code/type.h new file mode 100644 index 0000000..8408f59 --- /dev/null +++ b/code/type.h @@ -0,0 +1,28 @@ +#include +#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; + + + + +