您的位置:首页 > 理论基础 > 数据结构算法

数据结构—课程设计(城市导航系统)

2017-12-22 09:16 477 查看
Copyright (c) 2017, 烟台大学计算机学院  *All rights reserved.   *作    者:张行  *完成日期:2017年12月22日  *文件名称:hang.c *文件标识:无 *内容摘要:该代码用于获取满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 main.cpp
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "type.h"
#include <malloc.h>
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);
}

ef4f
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;
}
creat.cpp         
        #include"type.h"#include <string.h>/***********************功能:创建图结构输入:给图中的点赋予该点的编号,名称以及简介输出:无***********************/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<G.vexnum;i++){for(j=0;j<G.vexnum;j++){G.arc[i][j].length=INF;G.arc[i][j].money=INF;}}G.arc[1][3].length=G.arc[3][1].length=500;G.arc[1][4].length=G.arc[4][1].length=200;G.arc[3][5].length=G.arc[5][3].length=100;G.arc[10][3].length=G.arc[3][10].length=800;G.arc[6][4].length=G.arc[4][6].length=200;G.arc[5][2].length=G.arc[2][5].length=200;G.arc[2][4].length=G.arc[4][2].length=800;G.arc[5][7].length=G.arc[7][5].length=500;G.arc[2][4].length=G.arc[4][2].length=400;G.arc[4][7].length=G.arc[7][4].length=600;G.arc[6][8].length=G.arc[8][6].length=500;G.arc[8][7].length=G.arc[7][8].length=300;G.arc[6][9].length=G.arc[9][6].length=500;G.arc[10][3].length=G.arc[3][10].length=600;G.arc[1][3].money=G.arc[3][1].money=100;G.arc[1][4].money=G.arc[4][1].money=250;G.arc[3][5].money=G.arc[5][3].money=360;G.arc[10][3].money=G.arc[3][10].money=5000;G.arc[6][4].money=G.arc[4][6].money=200;G.arc[5][2].money=G.arc[2][5].money=100;G.arc[2][4].money=G.arc[4][2].money=450;G.arc[5][7].money=G.arc[7][5].money=600;G.arc[6][4].money=G.arc[4][6].money=120;G.arc[4][7].money=G.arc[7][4].money=300;G.arc[6][8].money=G.arc[8][6].money=460;G.arc[8][7].money=G.arc[7][8].money=100;G.arc[6][9].money=G.arc[9][6].money=640;G.arc[10][3].money=G.arc[3][10].money=230;return 1;}
function.cpp     
        #include<stdio.h>#include"type.h"#include <string.h>/***********************功能:查找某一个城市的信息输入:城市的编号输出:城市的编号,名称以及简介***********************/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;}elseflag=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);}elseflag=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;}
type.h
    #include<stdio.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;
menu.cpp  
        #include<stdio.h>/***********************功能:输出所有的功能目录输入:选择的功能编号输出:返回一个值给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;}
short.cpp
#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.vexnum; i++){dist[i]=G.arc[v][i].length;      //距离初始化s[i]=0;                     //s[]置空if (G.arc[v][i].length<INF)      //路径初始化path[i]=v;     //v到i有边elsepath[i]=-1;    //v到i没有边,置顶点i的前一个顶点为-1}s[v]=1;path[v]=0;              //源点编号v放入s中for (i=0; i<G.vexnum; i++)               //循环直到所有顶点的最短路径都求出{mindis=INF;                 //mindis置最小长度初值for (j=0; j<G.vexnum; j++)       //选取不在s中且具有最小距离的顶点uif (s[j]==0 && dist[j]<mindis){u=j;mindis=dist[j];}s[u]=1;                     //顶点u加入s中for (j=0; j<G.vexnum; j++)       //修改不在s中的顶点的距离if (s[j]==0)if (G.arc[u][j].length<INF && dist[u]+G.arc[u][j].length<dist[j]){dist[j]=dist[u]+G.arc[u][j].length;path[j]=u;}}if (s[w]==1){printf(" 从%s到%s的最短路径长度为:%d米\t路径为:",G.vexs[v].sight,G.vexs[w].sight,dist[w]);printf("%s->",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的前一个顶点kprintf("%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; i<G.vexnum; i++)for (j=0; j<G.vexnum; j++){A[i][j]=G.arc[i][j].money;path[i][j]=-1;  //i到j没有边}for (k=0; k<G.vexnum; k++){for (i=0; i<G.vexnum; i++)for (j=0; j<G.vexnum; j++)if (A[i][j]>A[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<INF)      //路径初始化path[i]=v;elsepath[i]=-1;}s[v]=1;path[v]=0;              //源点编号v放入s中for (i=1; i<=G.vexnum; i++)               //循环直到所有顶点的最短路径都求出{mindis=INF;                 //mindis置最小长度初值for (j=1; j<=G.vexnum; j++)       //选取不在s中且具有最小距离的顶点uif (s[j]==0 && dist[j]<mindis){u=j;mindis=dist[j];}s[u]=1;                     //顶点u加入s中for (j=1; j<=G.vexnum; j++)       //修改不在s中的顶点的距离if (s[j]==0)if (G.arc[u][j].length<INF && dist[u]+G.arc[u][j].length<dist[j]){dist[j]=dist[u]+G.arc[u][j].length;path[j]=u;}}for(i=1; i<=G.vexnum; i++)if (s[i]==1&&v!=i){printf(" 从%s到%s的最短路径长度为:%d米\t路径为:",G.vexs[v].sight,G.vexs[i].sight,dist[i]);printf("%s->",G.vexs[v].sight);    //输出路径上的起点Ppath2(G,path,i,v);    //输出路径上的中间点printf("%s\n",G.vexs[i].sight);   //输出路径上的终点}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: