校园路径导航

使用数据结构中的 Floyd算法 ,Dijkstra算法 最短路径
参考《数据结构教程 第五版 李春葆》

Floyd算法 ,Dijkstra算法 所用到的结构体
初始化无向图

#include<stdlib.h>  //包含system等系统调用
#include<stdio.h>
#include<conio.h>  //定义了通过按键盘产生的对应操作
#include<string.h>  //在使用到字符数组时需要使用
#define Infinity      32767       //图的矩阵中A(i,i)记为0,若没有通路,记为INFINITY = 32762
#define MAXV    100  //最大景点数定为40
#define INF 32767typedef struct{int num;//顶点的编号 char name[30];//顶点名称 char info[100];//顶点的其他信息
}VertexType;//顶点的类型 typedef struct{int edges[MAXV][MAXV];//邻接矩阵数组 int n,e;//顶点数,边数 VertexType vexs[MAXV];//存放顶点的信息
}MGraph; //完整的图邻接矩阵类型 MGraph g;
void map();
void Search(MGraph g);
void deal();
void Floyd(MGraph g);
void Dispath(MGraph g,int A[][MAXV],int path[][MAXV]);
void Dispath1(MGraph g,int dist[],int path[],int S[],int v);MGraph InitGraph()  //初始化无向图
{int i=0,j=0;g.n=7;//无向图顶点个数 g.e=12;//边数 for(i=0;i<g.n;i++)g.vexs[i].num=i;strcpy(g.vexs[0].name,"教学楼");strcpy(g.vexs[0].info,"西安航空学院地标建筑,也是最高的建筑");strcpy(g.vexs[1].name,"图书馆");strcpy(g.vexs[1].info,"这里藏书百万册,设施良好,环境幽雅,适合潜心读书");strcpy(g.vexs[2].name,"球场"); strcpy(g.vexs[2].info,"运动无止境,打球的男孩子都帅");strcpy(g.vexs[3].name,"操场");strcpy(g.vexs[3].info,"这里很适合散步 恋爱,你懂得");strcpy(g.vexs[4].name,"公寓(男)");strcpy(g.vexs[4].info,"男孩子的寝室");strcpy(g.vexs[5].name,"公寓(女)");strcpy(g.vexs[5].info,"女孩子的寝室");strcpy(g.vexs[6].name,"餐厅");strcpy(g.vexs[6].info,"吃饭的地方不多说");for(int i=0;i<g.n;i++)for(int j=0;j<g.n;j++)g.edges[i][j]=Infinity;g.edges[0][1]=g.edges[1][0]=200;g.edges[0][6]=g.edges[6][0]=175;g.edges[0][5]=g.edges[5][0]=275;g.edges[1][2]=g.edges[2][1]=200;g.edges[2][3]=g.edges[3][2]=225;g.edges[3][4]=g.edges[4][3]=275;g.edges[4][5]=g.edges[5][4]=250;g.edges[5][6]=g.edges[6][5]=200;g.edges[1][6]=g.edges[6][1]=175;g.edges[2][6]=g.edges[6][2]=250;g.edges[3][6]=g.edges[6][3]=375;g.edges[4][6]=g.edges[6][4]=300;return g;
}

菜单,主界面

定点查询路径

两点间路径导航

唉,老早写的了,现在看来很就是一堆 垃圾,
但是数据结构的算法还是值得学习一下的

(程序可能存在一定bug)
就这样~

完整代码

#include<stdlib.h>  //包含system等系统调用
#include<stdio.h>
#include<conio.h>  //定义了通过按键盘产生的对应操作
#include<string.h>  //在使用到字符数组时需要使用
#define Infinity      32767       //图的矩阵中A(i,i)记为0,若没有通路,记为INFINITY = 32762
#define MAXV    100  //最大景点数定为40
#define INF 32767typedef struct{int num;//顶点的编号 char name[30];//顶点名称 char info[100];//顶点的其他信息
}VertexType;//顶点的类型 typedef struct{int edges[MAXV][MAXV];//邻接矩阵数组 int n,e;//顶点数,边数 VertexType vexs[MAXV];//存放顶点的信息
}MGraph; //完整的图邻接矩阵类型 MGraph g;
void map();
void Search(MGraph g);
void deal();
void Floyd(MGraph g);
void Dispath(MGraph g,int A[][MAXV],int path[][MAXV]);
void Dispath1(MGraph g,int dist[],int path[],int S[],int v);MGraph InitGraph()  //初始化无向图
{int i=0,j=0;g.n=7;//无向图顶点个数 g.e=12;//边数 for(i=0;i<g.n;i++)g.vexs[i].num=i;strcpy(g.vexs[0].name,"教学楼");strcpy(g.vexs[0].info,"西安航空学院地标建筑,也是最高的建筑");strcpy(g.vexs[1].name,"图书馆");strcpy(g.vexs[1].info,"这里藏书百万册,设施良好,环境幽雅,适合潜心读书");strcpy(g.vexs[2].name,"球场"); strcpy(g.vexs[2].info,"运动无止境,打球的男孩子都帅");strcpy(g.vexs[3].name,"操场");strcpy(g.vexs[3].info,"这里很适合散步 恋爱,你懂得");strcpy(g.vexs[4].name,"公寓(男)");strcpy(g.vexs[4].info,"男孩子的寝室");strcpy(g.vexs[5].name,"公寓(女)");strcpy(g.vexs[5].info,"女孩子的寝室");strcpy(g.vexs[6].name,"餐厅");strcpy(g.vexs[6].info,"吃饭的地方不多说");for(int i=0;i<g.n;i++)for(int j=0;j<g.n;j++)g.edges[i][j]=Infinity;g.edges[0][1]=g.edges[1][0]=200;g.edges[0][6]=g.edges[6][0]=175;g.edges[0][5]=g.edges[5][0]=275;g.edges[1][2]=g.edges[2][1]=200;g.edges[2][3]=g.edges[3][2]=225;g.edges[3][4]=g.edges[4][3]=275;g.edges[4][5]=g.edges[5][4]=250;g.edges[5][6]=g.edges[6][5]=200;g.edges[1][6]=g.edges[6][1]=175;g.edges[2][6]=g.edges[6][2]=250;g.edges[3][6]=g.edges[6][3]=375;g.edges[4][6]=g.edges[6][4]=300;return g;
}void map()//学校平面图
{printf("\t*******************已激活校园导平面图!*********************\t\n");printf("\t...........................................................\t\n");printf("\t.             ...........                                 .\t\n");printf("\t.             . 1.      .  ..............       .......   .\t\n");printf("\t.  ........   .  图书馆 .  .2.  球场    .       .3.   .   .\t\n");printf("\t.  . 0.   .   ...........  ..............       .     .   .\t\n");printf("\t.  .  教  .                                     .  操 .   .\t\n");printf("\t.  .  学  .                                     .     .   .\t\n");printf("\t.  .  楼  .    ..........                       .     .   .\t\n");printf("\t.  .      .    . 6.餐厅 .                       .  场 .   .\t\n");printf("\t.  ........    ..........                       .     .   .\t\n");printf("\t                                                .......   .\t\n");printf("\t.           .............     .............               .\t\n");printf("\t.           . 5. (女   .     . 4.(男)  .               .\t\n");printf("\t.           .    公寓   .     .    公寓   .               .\t\n");printf("\t.           .............     .............               .\t\n");printf("\t...........................................................\t\n");  }void Search(MGraph g)
{   int i;printf("编号\t景点名称\t\t景点简介\t\t\n");printf("____________________________________________________________________________\n");for(i=0;i<g.n;i++)printf("%-10d%-25s%-80s\n",g.vexs[i].num,g.vexs[i].name,g.vexs[i].info);printf("____________________________________________________________________________\n");printf("\n"); deal();
}void Dijkstra(MGraph g,int v)//迪杰斯特拉算法
{   int dist[MAXV],path[MAXV];int S[MAXV];int MINdis,i,j,u;for(i=0;i<g.n;i++){dist[i]=g.edges[v][i];S[i]=0;if(g.edges[v][i]<Infinity ){path[i]=v;}else{path[i]=-1;}}S[v]=1;path[v]=0;for(i=0;i<g.n-1;i++){MINdis=Infinity ;for(j=0;j<g.n;j++){if(S[j]==0 && dist[j]<MINdis){u=j;MINdis=dist[j];}}S[u]=1;for(j=0;j<g.n;j++){if(S[j]==0){if(g.edges[u][j]<Infinity  && dist[u]+g.edges[u][j]<dist[j]){dist[j]=dist[u]+g.edges[u][j];path[j]=u;}}}}Dispath1(g,dist,path,S,v);printf("\n") ;deal();
}void Dispath1(MGraph g,int dist[],int path[],int S[],int v)
{   int i,j,k;int apath[MAXV],d;for(i=0;i<g.n;i++){if(i!=v){if(S[i]==1 && i!=v){printf("%s 到 %s 的长度是 %d 米 , 路径是 ",g.vexs[v].name,g.vexs[i].name,dist[i]);}d=0;apath[d]=i;k=path[i];if(k==-1){ printf("无路径\n");}else{while(k!=v){d++;apath[d]=k;k=path[k];}d++;apath[d]=v;printf("%d--->",apath[d]);for(j=d-1;j>=0;j--){printf("%d",apath[j]);if(j>=1)printf("--->");}printf("\n");}}else{printf("");}
}}void Floyd(MGraph g)//Floyd算法
{int flag=0;int A[MAXV][MAXV],path[MAXV][MAXV];int i,j,k;for(i=0;i<g.n;i++)for(j=0;j<g.n;j++){A[i][j]=g.edges[i][j];if(i!=j && g.edges[i][j]<INF)path[i][j]=i;elsepath[i][j]=-1;}for(k=0;k<g.n;k++){for(i=0;i<g.n;i++)for(j=0;j<g.n;j++)if(A[i][j]>A[i][k]+A[k][j]){A[i][j]=A[i][k]+A[k][j];path[i][j]=path[k][j];}}Dispath(g,A,path);//输出最短路径printf("\n");deal();
}void Dispath(MGraph g,int A[][MAXV],int path[][MAXV])
{   int flag=0;int i,j,k,s,q,t;printf("请您先输入出发点: ");do{      if(!scanf("%d",&q))   {   scanf("%*[^\n]");flag=0;}else if(!(q==0||q==1||q==2||q==3||q==4||q==5||q==6)){scanf("%*[^\n]");flag=0;} else{scanf("%*[^\n]");flag=1;break;}scanf("%*[^\n]");printf("请您先输入出发点:");fflush(stdin);}while(flag==0);printf("请您的输入目的地:");do{    if(!scanf("%d",&t))   {   scanf("%*[^\n]");//scanf("%*c");flag=0;}else   if(!(t==0||t==1||t==2||t==3||t==4||t==5||t==6)){scanf("%*[^\n]");//scanf("%*c");flag=0;} else{scanf("%*[^\n]");//scanf("%*c");flag=1;break;}scanf("%*[^\n]");//scanf("%*c");printf("警告!请重新输入您的目的地:");fflush(stdin);}while(flag==0);   printf("\n");int apath[MAXV],d;for(i=0;i<g.n;i++)for(j=0;j<g.n;j++)   {if(A[i][j]!=INF && i!=j){if(i==q&&j==t){printf("%s  到  %s 的路径是 ",g.vexs[i].name,g.vexs[j].name);k=path[i][j];d=0;apath[d]=j;while(k!=-1 && k!=i){d++;apath[d]=k;k=path[i][k];}d++;apath[d]=i;printf("%d--->",apath[d]);for(s=d-1;s>=0;s--){printf("%d",apath[s]);if(s>=1)printf("--->");}printf(", 长度是 %d 米. \n",A[i][j]);      }}}
}void cmd()//菜单函数
{   int a; int yourchoice;int flag=0; printf("\t************欢迎使用西安航空学院的校园导航系统*************\t\n\n");map();printf("\t*--1.-------------------学校景点介绍----------------------*\t\t\n");printf("\t*--2.-------------查看一定点到各景点的游览路线------------*\t\t\n");printf("\t*--3.----------------两景点间的最短路径-------------------*\t\t\n");printf("\t*--4.----------------------退出---------------------------*\t\t\n");printf("请输入:");do{   if(!scanf("%d",&yourchoice))  {   flag=0;}     else  if(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4)){          flag=0;}else{flag=1;break;}printf("警告!请重新输入:");fflush(stdin);//break;}while(flag==0);  switch(yourchoice){case 1:system("cls");map();Search(g);break;//查看景点信息 case 2:system("cls");map(); printf("请输入您的起始位置:");do{    if(!scanf("%d",&a))   {       flag=0;}    else   if(!(a==0||a==1||a==2||a==3||a==4||a==5||a==6)){flag=0;} else {flag==1;break;} printf("警告!请重新输入您的起始位置:");fflush(stdin);}while(flag==0);printf("\n") ;Dijkstra(g,a);break;//一景点到各景点的最短路径 case 3:system("cls");map();Floyd(g);break;//任意两景点的最短路径 case 4:system("cls");exit(1);break;//退出系统 default:break;}
}void deal()//返回菜单||退出系统函数
{int YC;int flag=0;printf("1:返回主菜单\n");printf("0:退出系统\n");printf("请输入:");do{ if(!scanf("%d",&YC))  {    flag=0;}else  if(!(YC==0 || 1==YC)){flag=0;} else{flag==1;break;}printf("警告!请重新输入:");fflush(stdin);}while(flag==0);switch(YC){case 1:system("cls");cmd();break;//查看景点间的路线case 0:system("cls");exit(1);break;default:break;
}
}int main()
{InitGraph();cmd();   system("pause");return 0;}

c++ 与 数据结构 实现 《校园路径导航系统》相关推荐

  1. 数据结构无向图简单路径

    数据结构无向图简单路径 一.课程设计目的和要求 目的:锻炼学生对软件界面设计并进行实现的实践能力. 要求:(1)完成课程设计所给的所有功能. (2)根据课程设计的特点设计出相应的画面. 二.课程设计环 ...

  2. 【数据结构】校园地图导航---主函数 景点查询函数

    //主函数 int main() //主函数 {int k; //选择键init(); //初始化Welcome_Gui(); //欢迎界面int start, ends, n;while (1){f ...

  3. 【数据结构】独立路径计算

    问题描述 老张和老王酷爱爬山,每周必爬一次香山.有次两人为从东门到香炉峰共有多少条路径发生争执,于是约定一段时间内谁走过对方没有走过的路线多谁胜. 给定一线路图(无向连通图,两顶点之间可能有多条边), ...

  4. 数据结构课程设计 : 博物馆导航系统

    好久之前写的一个东西了, 运行截图: 对于所有的地点实现已经编号,便于后面算法的实现. 各个功能介绍: 1. 查看地图 地图是自己用记事本写的, 输出的时候直接把记事本中的内容读取输出即可. 另外用一 ...

  5. 地图导航中的路径规划算法(综述)

    综述介绍+本人研究与实践结果--实际是论文 相关的路径规划算法,静态路网中,通常使用双向A*算法 常见的其他搜索算法,IA*(迭代A*),内存限定A*,分层路网A*(将高速路网构建成一个新的路网), ...

  6. C/C++路面导航系统[2023-01-16]

    C/C++路面导航系统[2023-01-16] 数据结构大作业:路面导航系统 系统初始信息,保存在数据库或其他文件中: 1·初始化地图,生成若干节点,具有节点名,坐标(x,y)等必要信息.节点间的连接 ...

  7. 计算机毕业设计题目参考

    jsp1986 变电站直流设备及仪表监控管理系统的设计与实现 jsp1987 咸鱼企业员工考勤管理系统 jsp1988 农产品质量分级检测系统的实现与设计 jsp1989 Bole招聘平台 jsp19 ...

  8. 软件测试入门基础知识汇总

    第一部分:软件评测知识 1.  软件质量与软件测试 软件测试:在规定条件下对程序进行操作,以发现错误,对软件质量进行评估,包括对软件形成过程的文档.数据以及程序进行测试 软件质量:软件特性的总和,软件 ...

  9. 软件测试基础知识总结(一)

    第一部分:软件评测知识 1.  软件质量与软件测试 软件测试:在规定条件下对程序进行操作,以发现错误,对软件质量进行评估,包括对软件形成过程的文档.数据以及程序进行测试 软件质量:软件特性的总和,软件 ...

最新文章

  1. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
  2. Android中关于setLatestEventInfo()过时以及构建Notification的解决方法
  3. C语言 链表 头插法
  4. 编写高性能 .NET 代码 第二章:垃圾回收 基本操作
  5. C++中数组定义及初始化
  6. 第9章 逻辑回归 学习笔记 中
  7. assert断言的概念
  8. oracle中同义词的用法,Oracle中使用同义词
  9. 复杂网络社区划分方法综述
  10. Easy CHM软件使用方法【申明:来源于网络】
  11. Python实验-小黑屋
  12. 关于蜕变测试文献REST ful 的Web API的翻译与思考
  13. applicationContext.xml读取properties中属性
  14. 从程序员到大厂CTO,这5个习惯让我终身受益
  15. 华信mysql数据恢复_华信安卓手机数据恢复程序3.0
  16. 软考信息系统项目管理师质量管理高分论文赏析
  17. EXCEL删除重复数据的多种方法
  18. GPS : 热启动 冷启动,暖启动
  19. 深度学习数据不均衡的处理方法
  20. MATLAB人脸识别疫情防护门禁系统

热门文章

  1. 思科网络设备安装与调试——帧中继云配置
  2. sublime匹配汉字
  3. Delphi6/7/2007获取类型信息
  4. 解决您所有WiFi问题的10个智能路由器
  5. 面试:MySQL篇,详尽知识点总结
  6. 两步验证 非双重认证
  7. SAP的萨班斯法案SOA解决方案
  8. 新三板上市企业专利数据(含发明专利、实用新型专利、外观设计专利)
  9. 腾讯优图贾佳亚:当AI进入产业应用时代时,计算机视觉技术更应该服务于人才对!...
  10. access团员人数公式_2015年3月全国二级ACCESS操作真题第1套