您的当前位置:首页正文

交通咨询系统设计

2022-06-17 来源:汇智旅游网


交通咨询系统设计

实验目的和要求

1. 掌握最短路径的算法;

2. 编写实验报告;

实验内容

本设计要求一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一个城市顶点之间的最短路径、最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或所需费用。

实验步骤

1、 问题分析

该设计分为三个部分:

 建立交通网络图的存储结构

 解决单源最短路径问题

 实现两个城市顶点之间的最短路径问题

2、 问题求解

 2.1建立交通网络图的存储结构

图的邻接矩阵

#define MVNum 50

Typedef struct{

VertexType vexs[MVNum];//顶点信息

Adjmatrix arcs[MVNum][MVNum];//邻接矩阵边的信息

}MGraph

 2.2单源最短路径

Dijkstra算法

按路径长度递增产生诸顶点的最短路径

 2.3任意两个顶点之间的最短路径

Floyd算法

3、 完整的程序清单

4、 程序运行测试

#include \"stdafx.h\"

#include

#include

#define MVNum 50

#define Dij_MAXN 33

#define MAX_VERTEX_NUM 31

#define MAX_STRING_NUM 10

#define MAX_TRAFFIC_NUM 10

typedef struct TrafficNode

{

char name[MAX_STRING_NUM];

int Time;//

int EndCity //火车到达城市的编号

int Cost;//票价

} TrafficNodeDat;

typedef struct VNode

{

CityType city; //城市编号

int TrainNum; //标记下面Train数组里元素个数

TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次

} VNodeDat;

typedef struct TrafficNode

{

char name[MAX_STRING_NUM]; //班次

int Time;

int EndCity; //火车到达城市的编号

int Cost; //票价

} TrafficNodeDat;

typedef struct VNode

{

CityType city; //城市编号

int FlightNum; //标记下面Train数组和Flight数组里元素个数

TrafficNodeDat Flight[MAX_TRAFFIC_NUM];

} VNodeDat;

int main()

switch(Command)

{

case 0:

return 0;

case 1:

Administrators();//管理员操作界面函数

break;

case 2:

User();//用户操作界面函数

break;

default:

cout<<\"\选择序号错误!请重新选择!\\n\";

int InitSystem()

void User()

void Administrators()

int DelCity(char *Name) //删除城市

{

//删除城市

int city,i,j;

city=SeekCity(Name);

for(i=city;i{

strcpy(CityName[i],CityName[i+1]);

AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;

for(j=0;j{

AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;

AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;

strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);

AdjList[i].Flight[j].Time=AdjList[i+1].Flight[j].Time;

}

}

CityNum--;

return 1;

}

int DelPath(char *name) {

//删除路线

int i,j,flag=0;

for(i=0;i{

//删除路线

for(j=0;jif(strcmp(AdjList[i].Flight[j].name,name)==0)

{flag=1;break;}//找到要删除的路线,找到跳出for循环

if(flag)

{

for(;j{

AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;

AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;

strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name);

AdjList[i].Flight[j].Time=AdjList[i].Flight[j+1].Time;

}

AdjList[i].FlightNum--;//将要删除路线后面的路线全部向前移,并将总数减1

break;

}

for(j=0;jif(strcmp(AdjList[i].Train[j].name,name)==0)

{

flag=1;

break;

}

if(flag)

{

for(;j{

AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;

AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;

strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);

AdjList[i].Train[j].Time=AdjList[i].Train[j+1].Time;

}

AdjList[i].TrainNum--;

break;

}

}return 1;

}

int InsertCity(char *Name) //添加某个城市

{

//添加城市

strcpy(CityName[CityNum],Name);

AdjList[CityNum].city=CityNum;//设置城市编号

AdjList[CityNum].FlightNum=0;

AdjList[CityNum].TrainNum=0;//新增城市火车数和飞机数初始为零

CityNum++;//城市总数加1

return 1;

}

int InsertFlight(char *flight,char *StartCity,char *EndCity,int Time,int cost) //添加某架航班

{

//添加飞机路线

int i,j;

i=SeekCity(StartCity);j=SeekCity(EndCity);

AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;

AdjList[i].Flight[AdjList[i].FlightNum].Time=Time;

strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);

AdjList[i].FlightNum++;

return 1;

}

int InsertTrain(char *train,char *StartCity,char *EndCity,int Time,int cost) //添加某次列车

{

//添加火车路线

int i,j;

i=SeekCity(StartCity);j=SeekCity(EndCity);

AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;

AdjList[i].Train[AdjList[i].TrainNum].Time=Time;

strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);

AdjList[i].TrainNum++;

return 1;

}

void Dijkstra(int s[30][30],int p_start,int p_end,int TravelType)

{

int PreCity[30];

int i,j,min,pre,pos;

for(i=0;iPreCity[p_start]=-2;

while(PreCity[p_end]==-1)

{

min=-1;

for(i=0;iif(PreCity[i]!=-1)//i为起始站

{

for(j=0;jif(PreCity[j]==-1&&s[i][j]>0&&(min<0||s[i][j]{

pre=i;pos=j;//j为起始站中花费最小的到达站的城市编号

min=s[i][j];

}

}

PreCity[pos]=pre;

}

Dijkstra_Output(s,PreCity,p_end,TravelType);

}

int CalcMinCost(int StartCity,int EndCity,int TravelType)

{

//查询最小耗费路线

int s[30][30];

int i,j,min,end,flag1,flag2;

flag1=0;flag2=0;

for(i=0;ifor(j=0;js[i][j]=-1;//设空路径

if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中

for(i=0;ifor(j=0;j{

if(AdjList[i].Train[j].EndCity==StartCity) flag1=1;

if(AdjList[i].Train[j].EndCity==EndCity) flag2=1;

}

else if(TravelType==1)//判断初始和终点城市是否在飞机交通路线中

for(i=0;ifor(j=0;j{

if(AdjList[i].Flight[j].EndCity==StartCity) flag1=1;

if(AdjList[i].Flight[j].EndCity==EndCity) flag2=1;

}

if(flag1!=1&&flag2!=1)

{printf(\"\\n\抱歉!没有您要查找的路线!\");return 0;}

if(TravelType==0)

{

for(i=0;i{

min=32767;j=0;

while(j{

min=32767;end=AdjList[i].Train[j].EndCity;

while(end==AdjList[i].Train[j].EndCity&&j{

if(AdjList[i].Train[j].Costj++;

}//min为i城市中的最小花费,end为其路线终点站

s[i][end]=min;

}

}

}

else

{

for(i=0;i{

min=32767;j=0;

while(j{

min=32767;end=AdjList[i].Flight[j].EndCity;

while(end==AdjList[i].Flight[j].EndCity&&j{

if(AdjList[i].Flight[j].Costj++;

}

s[i][end]=min;

}

}

}

Dijkstra(s,StartCity,EndCity,TravelType);

return 1;

}

//存储数据函数

int SaveFile()///////////////////////////////////////////////////////////////

{

//将火车飞机交通信息写入文件

FILE *fp;

int i,j,total;

if((fp=fopen(\"city.txt\

{

cout<<\"\\n\无法打开文件!\\n\"; return -1;

}

fprintf(fp,\"%d\\n\在city文件中输入城市总数

for(i=0;ifprintf(fp,\"%s\\n\再输入城市名

fclose(fp);

total=0;

if((fp=fopen(\"train.txt\

{

cout<<\"\\n\无法打开文件!\\n\"; return -1;

}

for(i=0;itotal+=AdjList[i].TrainNum;

fprintf(fp,\"%d\\n\在train文件中输入火车总数

for(i=0;ifor(j=0;j{

fprintf(fp,\"%s %s %s \j].name,CityName[i],

CityName[AdjList[i].Train[j].EndCity]);

//输入火车车次,始发站和终点站

fprintf(fp,\"%d %d\\n\j].Time,AdjList[i].Train[j].Cost);//输入发车时间和到站时间和费用

}

fclose(fp);

total=0;

if((fp=fopen(\"flight.txt\

{

cout<<\"\\n\无法打开文件!\\n\";

return -1;

}

for(i=0;itotal+=AdjList[i].FlightNum;

fprintf(fp,\"%d\\n\在flight文件中输入飞机总数

for(i=0;ifor(j=0;j{

fprintf(fp,\"%s %s %s \j].name,CityName[i],

CityName[AdjList[i].Flight[j].EndCity]);

//输入飞机航班号,始发站和终点站

fprintf(fp,\"%d %d\\n\j].Time,AdjList[i].Flight[j].Cost);//输入起飞时间,到达时间和费用

}

fclose(fp);

return 1;

}

因篇幅问题不能全部显示,请点此查看更多更全内容