数据结构课程设计交通咨询系统设计
设计题目< 二〉:7、3、4 交通咨询系统设计P160 一、 设计要求 1 .问题描述 在望希客旅得差出公因,如例。求要得同不有具工通交对客旅得得目同不据根ﻩﻩ旅途中得时间尽可能得短,出门旅行得旅客希望旅费尽可能得少,而老年人则要求中转次数少。模拟一个全国城市之间得咨询交通程序,为旅客提供两种或三种最优得交通路线。
2 。需求分析 二、 概要设计 1. 主界面设计
(图 2、1“交通咨询系统”主菜单)
2。存储结构设计 本系统采用图结构类型存储抽象交通咨询系统得信息。
typedef struct TrafficNode {
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM 最为 10
int StartTime, StopTime; //起止时间
号编市城该即,置位得中组数在点顶得向指边向有该// ;ytiCdnE tniﻩ
价票// ;tsoC tniﻩ} TrafficNodeDat; typedef struct VNode {
;ytic epyTytiCﻩ元里组数 thgilF 与组数 niarT面下记标// ;muNthgilF ,muNniarT tniﻩ素个数
TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价与班次
;]MUN_CIFFART_XAM[thgilF taDedoNciffarTﻩ //
)用费者或间时(费耗得市城该达到时历遍// ;tsoC tniﻩ} VNodeDat; typedef struct PNode {
;ytiC tniﻩ int TraNo; } PNodeDat; 3。系统功能设计 (1)添加城市。添加一个城市得名称 (2)删除城市。输入一个城市名称,删除该城市. (3)添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间与票价 (4)
删除交通路线。输入火车或飞机得班次删除该交通路线。
(5)查询最小费用路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。
三、模块 设计 1. . 模块设计
ﻩﻩ
(图 2、2 模块调用示意图) 主程序模块 工作区模块 无向网操作模块
2. 系统子程序及功能设计 (1)int ShowMenu()//主菜单 (2)void CopyRight()
(3)int SeekCity(char *name)
//寻找城市 (4)int InsertCity(char *Name)
//添加城市 (5)int SaveSysInfo()
//向程序输入数据 (6)int DelCity(char *Name)
//删除城市 (7)int InsertTrain(char *train, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)//添加火车路线 (8)int InsertFlight(char *flight, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)//添加飞机航线 (9)int DelPath(char *name)//删除路线 (10)void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType) (11)int InitSysData()//存储数据 (12)int SearchMinTime(CityType City, CityType EndCity, int CurTime, int curPathNo, int TravelType)//查询最短时间 (13)int CalcMinTime(int StartCity, int EndCity, int TravelType) //显示最短时间 (14)int CalcMinCost(int StartCity, int EndCity, int TravelType)//最少花费 (15)int main()//主函数 3。
。
函数主要调用关系图
ﻩ
ﻩﻩﻩ
(图2、3 函数主要调用关系图 ) 四、 详细设计 1. . 数据类型定义 (1)全局变量得定义 15main() 8 9 1 12 7 5 4 13 6 3 6 1 2 2 3 7 1 6
typedef short int CityType;//CityType 定义短整形得变量
typedef struct TrafficNode { 最 MUN_GNIRTS_XAM// 次班// ;]MUN_GNIRTS_XAM[eman rahcﻩ为 10
间时止起// ;emiTpotS ,emiTtratS tniﻩ
号编市城该即,置位得中组数在点顶得向指边向有该// ;ytiCdnE tniﻩ int Cost; //票价
} TrafficNodeDat; typedef struct VNode {
CityType city; 元里组数 thgilF与组数 niarT 面下记标// ;muNthgilF ,muNniarT tniﻩ素个数
结为员成组数// ;]MUN_CIFFART_XAM[niarT taDedoNciffarTﻩ构体,记录了到达城市、起止时间、票价与班次
TrafficNodeDat Flight[MAX_TRAFFIC_NUM];
//
)用费者或间时(费耗得市城该达到时历遍// ;tsoC tniﻩ} VNodeDat; typedef struct PNode {
;ytiC tniﻩ
;oNarT tniﻩ} PNodeDat;
2 2. 系统主要子程序详细设计 (1)用户工作区模块得设计 int ShowMenu()
{
printf("\n|******************欢迎使用交通咨询系统*******|\n”);
printf(”\n|-----———-----—-——-1: 添加城市——-------——-——-—|”); --——----市城除删 :2———-——-—-—-———--——|n\"(ftnirpﻩ--——-—--|”); 线路通交加添 :3——----—--—--——————|n\”(ftnirpﻩ-———--———-——|");
printf("\n|———-—--——----———-—4:
删除交通路线—-—--—--——--|”);
printf("\n|-—---——---—-----—-5: 查询最小费用路线---—-———|");
printf(”\n|-----———----------6:
查询最快路线-———--—————-|"); -—-—--幕屏除清 :7-—----------------|n\”(ftnirpﻩ--———-—---|”);
printf("\n|-—--—--—-------—--0:
退出-——--—--—------—————|\n”);
printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n”);
;)":择选得您入输请 n\"(ftnirpﻩ ;1 nruterﻩ
} (2)用 Dijkstra 算法求两段路程得最短距离 void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], int PreCity[Dij_MAXN], int p_end, int TravelType)
{
int track[Dij_MAXN];
;0 = tsoc ,dne ,pmt ,nim ,k ,j ,0 = i tniﻩ ;j = ]++i[kcart ;dne_p = jﻩ )0 => ]j[ytiCerP( elihwﻩ {
cost += matx[PreCity[j]][j];
track[i++] = j = PreCity[j];
}
;)”:yaW kcarTn\"(ftnirpﻩ if (!TravelType)
{
)--i ;0>i ;--i( rofﻩﻩ
{
;)]]i[kcart[emaNytiC ,":s%n\"(ftnirpﻩﻩ
end = track[i - 1]; min = 32767;
ﻩ
for (k = 0; k<AdjList[track[i]]、TrainNum; k++)
if (AdjList[track[i]]、Train [k]、EndCity == end&&min〉AdjList[track[i]]、Train[k]、Cost)
{ﻩﻩ ﻩ
min = AdjList[track[i]]、Train[k]、Cost;
ﻩ
tmp = k;
}ﻩﻩ
;)eman、]pmt[niarT、]]i[kcart[tsiLjdA ,”s%"(ftnirpﻩ
ﻩ 、]]i[kcart[tsiLjdA ,”d2%:d2%—d2%:d2%"(ftnirpﻩTrain[tmp]、StartTime / 60, AdjList[track[i]]、Train[tmp]、StartTime % 60, AdjList[track[i]]、Train[tmp]、StopTime / 60, AdjList[track[i]]、Train[tmp]、StopTime % 60);
}ﻩ }
esleﻩ {
for (i-—; i>0; i--)
ﻩ {
;)]]i[kcart[emaNytiC ,":s%n\”(ftnirpﻩﻩ
ﻩ end = track[i — 1]; min = 32767;
)++k ;muNthgilF、]]i[kcart[tsiLjdA〈k ;0 = k( rofﻩﻩ dA>nim&&dne == ytiCdnE、]k[niarT、]]i[kcart[tsiLjdA( fiﻩﻩjList[track[i]]、Flight[k]、Cost)
{
ﻩ
min = AdjList[track[i]]、Flight[k]、Cost; ;k = pmtﻩﻩ
}ﻩ ﻩ
printf(”%s", AdjList[track[i]]、Flight[tmp]、name);
hgilF、]]i[kcart[tsiLjdA ,"d2%:d2%—d2%:d2%"(ftnirpﻩﻩt[tmp]、StartTime / 60, AdjList[track[i]]、Flight[tmp]、StartTime % 60, AdjList[track[i]]、Flight[tmp]、StopTime / 60, AdjList[track[i]]、Flight[tmp]、StopTime % 60);
}ﻩﻩ }
printf(”\n%s:
DESTINATION!”, CityName[track[0]]);
printf("\nMin Cost :
%d\n”, cost);
} void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType) {
;desu reven,1-==]i[ytiCerP// ;]NXAM_jiD[ytiCerP tniﻩ//
i ytiC fo yticerp eht,0>ytiCerPﻩ int i, j, min, pre, pos;
)++i ;muNytiC<i ;0 = i( rofﻩ {
;1- = ]i[ytiCerPﻩﻩ }ﻩ ;2— = ]trats_p[ytiCerPﻩ while (PreCity[p_end] == -1)
{
;1— = nimﻩ )++i ;muNytiC<i ;0 = i( rofﻩﻩ ﻩ if (PreCity[i] != -1)
ﻩ {
)++j ;muNytiC<j ;0 = j( rofﻩﻩ
if (PreCity[j] == -1 && matx[i][j]>0 && (min<0 || matx[i][j]<min))
ﻩ
{
ﻩ
pre = i; pos = j; min = matx[i][j];
}ﻩﻩﻩ
}ﻩ
PreCity[pos] = pre;
}ﻩ ;)epyTlevarT ,dne_p ,ytiCerP ,xtam(tuptuO_artskjiDﻩ}
五、测试分析 1、 添加城市 在主菜单下,用户输入1,添加城市名称。
(4、2图ﻩ 添加城市 )
2.删除城市 在主菜单下,用户输入 2,删除已添加城市名称.
ﻩﻩ (图 2、5 删除城市 ) 3.添加交通路线 在主菜单下,用户输入3,已添加城市名称。添加起始城市、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、与票价。
ﻩ (图2、6 添加交通路线 )
4.删除交通路线 输入班次号,删除交通路线
ﻩﻩ (图 2、7 删除交通路线 )
5。查询最小费用交通路线
(ﻩ8、2 图ﻩ 查询最小费用交通路线 ) 6。查询最快交通路线
ﻩ (图 2、9 查询最快交通路线 ) 7。清除屏幕 8.退出 六、用户手册 使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市得路线与使用各项功能。
七、调试报告 程序运行无错误,但当系统输入其她无储存内容时程序会意外中断,代码需要优化。
八 、 程序清单 #include ”stdafx、h” #include <stdio、h>
#include 〈string、h>
#include <stdlib、h> #define ERR 0
#define OK 1
#define Dij_MAXN 100
#define MAX_VERTEX_NUM 100 #define MAX_STRING_NUM 100
#define MAX_TRAFFIC_NUM 100
const char CityFile[] = "city、txt"; const char TrainFile[] = "train、txt"; const char FlightFile[] = ”flight、txt”; typedef short int CityType;//CityType 定义短整形得变量
typedef struct TrafficNode {
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM 最为10
int StartTime, StopTime; //起止时间
号编市城该即,置位得中组数在点顶得向指边向有该// ;ytiCdnE tniﻩ int Cost; //票价
} TrafficNodeDat; typedef struct VNode {
;ytic epyTytiCﻩ
数个素元里组数 thgilF 与组数 niarT 面下记标// ;muNthgilF ,muNniarT tniﻩ构结为员成组数// ;]MUN_CIFFART_XAM[niarT taDedoNciffarTﻩ体,记录了到达城市、起止时间、票价与班次
;]MUN_CIFFART_XAM[thgilF taDedoNciffarTﻩ // int Cost; //遍历时到达该城市得耗费(时间或者费用)
} VNodeDat; typedef struct PNode {
int City;
;oNarT tniﻩ
} PNodeDat; VNodeDat AdjList[MAX_VERTEX_NUM];
char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中得编号
int CityNum; //城市数目
PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径
PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前得最小时间路径
int MinTime, StartTime; int curPath; int ShowMenu()
{
printf("\n|******************欢迎使用交通咨询系统*******|\n");
printf(”\n|-—----—---—-——————1:
添加城市---————-——---—-—|"); --———----市城除删 :2-——-—-——-—-—-—-——-|n\"(ftnirpﻩ------—|");
printf(”\n|—--——----—--—--—-—3:
添加交通路线--—-——-—-——-|");
printf("\n|—--——---—-——------4:
删除交通路线-——--------—|”);
printf("\n|—-—-————------—-—-5:
查询最小费用路线——--—---|");
printf("\n|—-----—-—-——-—-———6:
查询最快路线--------—-——|");
printf("\n|——-—----—-—---———-7:
清除屏幕------—----——---|");
------—--—----出退 :0-———-—-—-—————-—--|n\”(ftnirpﻩ--—--—|\n"); ********** o)∩_∩(o o)∩_∩(o***********|n\"(ftnirpﻩ****|\n");
;)":择选得您入输请n\”(ftnirpﻩ return 1; } void CopyRight()
{
;)”n\"(ftnirpﻩ} int SeekCity(char *name)
//寻找城市 {
;i tniﻩ for (i = 0; i〈CityNum; i++)
{ﻩ
if (strcmp(name, CityName[i])
== 0) //比较函数,若相等,则返回i值
ﻩ {
ﻩ
return i;
}ﻩ }
;1- nruterﻩ} //=============================================Edit Info====================================================
int SaveSysInfo() //向程序输入数据 {
FILE *fp; int i, j, total;
fp = fopen(CityFile, "w"); //打开CityFile 文档
fprintf(fp, "%d\n”, CityNum); //往文档中写城市得数量
)++i ;muNytiC<i ;0 = i( rofﻩ {
字名得市城写中档文往// ;)]i[emaNytiC ,”n\s%" ,pf(ftnirpfﻩ }ﻩ 闭关档文 eliFytiC将//;)pf(esolcfﻩ ;0 = latotﻩ fp = fopen(TrainFile, "w”);//打开TrainFile 文档
量数得次班车列算计// )++i ;muNytiC<i ;0 = i( rofﻩ {ﻩ
;muNniarT、]i[tsiLjdA =+ latotﻩ }
量数得次班车列写中档文往// ;)latot ,"n\d%” ,pf(ftnirpfﻩ // )++i ;muNytiC〈i ;0 = i( rofﻩ {ﻩ 列写中档文往// )++j ;muNniarT、]i[tsiLjdA〈j ;0 = j( rofﻩ车得车次、始发城市、终点城市
ﻩ {
ﻩ fprintf(fp, ”%s %s %s ", AdjList[i]、Train[j]、name,
,]i[emaNytiCﻩ
ﻩ CityName[AdjList[i]、Train[j]、EndCity]);
ﻩﻩ fprintf(fp, "%2d:%2d %2d:%2d %d\n”, AdjList[i]、Train[j]、StartTime / 60, //往文档中写
ﻩﻩ
,06 % emiTtratS、]j[niarT、]i[tsiLjdAﻩ ﻩ,06 / emiTpotS、]j[niarT、]i[tsiLjdAﻩ
ﻩ
,06 % emiTpotS、]j[niarT、]i[tsiLjdAﻩ
ﻩ AdjList[i]、Train[j]、Cost);
}ﻩ
}
;0 = latot ;)pf(esolcfﻩ fp = fopen(FlightFile, "w”);
for (i = 0; i<CityNum; i++)
{
;muNthgilF、]i[tsiLjdA =+ latotﻩﻩ }ﻩ ;)latot ,”n\d%” ,pf(ftnirpfﻩ for (i = 0; i〈CityNum; i++)
{ﻩ
)++j ;muNthgilF、]i[tsiLjdA〈j ;0 = j( rofﻩ
{ﻩ
fprintf(fp, "%s %s %s ”, AdjList[i]、Flight[j]、name,
ﻩ
,]i[emaNytiCﻩ;)]ytiCdnE、]j[thgilF、]i[tsiLjdA[emaNytiCﻩﻩ thgilF、]i[tsiLjdA ,"n\d% d2%:d2% d2%:d2%" ,pf(ftnirpfﻩﻩ[j]、StartTime / 60,
ﻩﻩ AdjList[i]、Flight[j]、StartTime % 60,
ﻩ,06 / emiTpotS、]j[thgilF、]i[tsiLjdAﻩ ﻩ
,06 % emiTpotS、]j[thgilF、]i[tsiLjdAﻩ
ﻩ
;)tsoC、]j[thgilF、]i[tsiLjdAﻩ }ﻩﻩ }
;1 nruter ;)pf(esolcfﻩ} int InsertCity(char *Name) //添加城市 {
strcpy(CityName[CityNum], Name);
;muNytiC = ytic、]muNytiC[tsiLjdAﻩ
AdjList[CityNum]、FlightNum = 0;
AdjList[CityNum]、TrainNum = 0;
CityNum++;
;1 nruterﻩ} int DelCity(char *Name)
//删除城市 {
int city, i, j,o=1,k=1;
;)emaN(ytiCkeeS = yticﻩ printf("%s",Name);
)eurt( elihwﻩ {ﻩ ﻩ while (CityName[k] != Name)
ﻩ {
k++;
}
)muNytiC 〉 k( fiﻩﻩ
{ﻩ
ﻩ o-—;
;)"!入输新重请,市城此到找未"(ftnirpﻩ
;0 nruterﻩﻩ
}
ﻩ for (i = city; i < CityNum — 1; i++) //???可能 city 就是从0开始得
{ﻩ ﻩ
strcpy(CityName[i], CityName[i + 1]);
AdjList[i]、FlightNum = AdjList[i + 1]、FlightNum; ﻩ;muNniarT、]1 + i[tsiLjdA = muNniarT、]i[tsiLjdAﻩ
ﻩ车火有没么什为// )++j ;muNthgilF、]i[tsiLjdA < j ;0 = j( rofﻩ得??
ﻩﻩ {
ﻩ C、]j[thgilF、]1 + i[tsiLjdA = tsoC、]j[thgilF、]i[tsiLjdAﻩﻩost;
ﻩ thgilF、]1 + i[tsiLjdA = ytiCdnE、]j[thgilF、]i[tsiLjdAﻩﻩ[j]、EndCity;
ﻩﻩ 、]j[thgilF、]1 + i[tsiLjdA ,eman、]j[thgilF、]i[tsiLjdA(ypcrtsﻩname); ilF、]1 + i[tsiLjdA = emiTtratS、]j[thgilF、]i[tsiLjdAﻩﻩght[j]、StartTime;
ﻩ、]j[thgilF、]1 + i[tsiLjdA = emiTpotS、]j[thgilF、]i[tsiLjdAﻩStopTime;
ﻩﻩ }
}ﻩﻩ
;—-muNytiCﻩ }ﻩ return 1; } int InsertTrain(char *train, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)
{ _e,etunim_s+06*ruoh_s,ytic_e,ytic_s,eman(niarTtresnI// ;j ,i tniﻩhour*60+e_minute,cost);
i = SeekCity(StartCity);
j = SeekCity(EndCity);
AdjList[i]、Train[AdjList[i]、TrainNum]、Cost = cost;
AdjList[i]、Train[AdjList[i]、TrainNum]、EndCity = j;
emiTtratS、]muNniarT、]i[tsiLjdA[niarT、]i[tsiLjdAﻩ= StartTime;
AdjList [i]、Train[AdjList [i]、TrainNum]、StopTime = EndTime;
;)niart ,eman、]muNniarT、]i[tsiLjdA[niarT、]i[tsiLjdA(ypcrtsﻩ AdjList[i]、TrainNum++; //火车得数加 1
return 1; } int InsertFlight(char *flight, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost) {
;j ,i tniﻩ i = SeekCity(StartCity);
j = SeekCity(EndCity);
AdjList[i]、Flight[AdjList[i]、FlightNum]、Cost = cost;
;j = ytiCdnE、]muNthgilF、]i[tsiLjdA[thgilF、]i[tsiLjdAﻩ ;emiTtratS = emiTtratS、]muNthgilF、]i[tsiLjdA[thgilF、]i[tsiLjdAﻩ AdjList[i]、Flight[AdjList[i]、FlightNum]、StopTime = EndTime;
;)thgilf ,eman、]muNthgilF、]i[tsiLjdA[niarT、]i[tsiLjdA(ypcrtsﻩ ;++muNthgilF、]i[tsiLjdAﻩ return 1; } int DelPath(char *name)
{
;0 = galf ,j ,i tniﻩ )++i ;muNytiC<i ;0 = i( rofﻩ {
从是就j意注// )++j ;muNthgilF、]i[tsiLjdA〈j ;0 = j( rofﻩ0 开始得
)0 == )eman ,eman、]j[thgilF、]i[tsiLjdA(pmcrts( fiﻩﻩ {ﻩﻩ
;kaerb ;1 = galfﻩﻩ
}ﻩ
)galf( fiﻩ
{
ﻩ
for (; j<AdjList[i]、FlightNum — 1; j++) //把删除得航班后得每个航班向前移一位
ﻩﻩ {
ﻩ
AdjList[i]、Flight[j]、Cost = AdjList[i]、Flight[j + 1]、Cost;
ﻩﻩ AdjList[i]、Flight[j]、EndCity = AdjList[i]、Flight[j + 1]、EndCity;
ﻩ;)eman、]1 + j[ thgilF、]i[ tsiLjdA ,eman、]j[thgilF、]i[tsiLjdA(ypcrtsﻩ ﻩ、]1 + j[thgilF、]i[tsiLjdA = emiTtratS、]j[thgilF、]i[tsiLjdAﻩStartTime;
ﻩﻩ
AdjList[i]、Flight[j]、StopTime = AdjList[i]、Flight[j + 1]、StopTime;
}ﻩﻩ
;kaerb ;-—muNthgilF、]i[tsiLjdAﻩ
}ﻩ
for (j = 0; j<AdjList[i]、TrainNum; j++)
)0 == )eman ,eman、]j[niarT、]i[tsiLjdA(pmcrts( fiﻩﻩ ﻩ {
;kaerb ;1 = galfﻩﻩ ﻩ }
ﻩ if (flag)
{
得后车列得除删把// )++j ;1 - muNniarT、]i[tsiLjdA<j ;( rofﻩﻩ每个列车车次都前移一位
{ ;tsoC、]1 + j[niarT、]i[tsiLjdA = tsoC、]j[niarT、]i[tsiLjdAﻩﻩ ﻩ
ﻩ AdjList[i]、Train[j]、EndCity = AdjList[i]、Train[j + 1]、EndCity;
ﻩ iarT、]i[tsiLjdA ,eman、]j[niarT、]i[tsiLjdA(ypcrtsﻩn[j + 1]、name);
ﻩﻩ
AdjList[i]、Train[j]、StartTime = AdjList[i]、Train[j + 1]、StartTime;
ﻩﻩ AdjList[i]、Train[j]、StopTime = AdjList[i]、Train[j + 1]、StopTime;
}
ﻩ
AdjList[i]、TrainNum—-; break;
}ﻩﻩ }
;1 nruterﻩ} //==============================================Check Info================================================
void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], int PreCity[Dij_MAXN], int p_end, int TravelType) {
;]NXAM_jiD[kcart tniﻩ ;0 = tsoc ,dne ,pmt ,nim ,k ,j ,0 = i tniﻩ j = p_end; track[i++] = j;
while (PreCity[j] 〉= 0)
{
;]j[]]j[ytiCerP[xtam =+ tsocﻩﻩ ﻩ track[i++] = j = PreCity[j];
}
printf("\nTrack Way:");
if (!TravelType)
{ﻩ ﻩ for (i——; i〉0; i--)
{ﻩﻩ ﻩ
;)]]i[kcart[emaNytiC ,":s%n\”(ftnirpﻩﻩ;76723 = nim ;]1 - i[kcart = dneﻩ ﻩ
)++k ;muNniarT、]]i[kcart[tsiLjdA〈k ;0 = k( rofﻩ
if (AdjList[track[i]]、Train[k]、EndCity == end&&min〉AdjList[track[i]]、Train[k]、Cost)
ﻩ
{
ﻩﻩ
min = AdjList[track[i]]、Train[k]、Cost;
;k = pmtﻩ ﻩ
}
ﻩ
printf(”%s”, AdjList[track[i]]、Train[tmp]、name);
ﻩ
printf("%2d:%2d-%2d:%2d", AdjList[track[i]]、Train[tmp]、StartTime / 60, AdjList[track[i]]、Train[tmp]、StartTime % 60, AdjList[track[i]]、Train[tmp]、StopTime / 60, AdjList[track[i]]、Train[tmp]、StopTime % 60);
}ﻩ }
esleﻩ {ﻩ
for (i——; i>0; i--)
{ﻩﻩ ﻩ
printf("\n%s:", CityName[track[i]]);
;76723 = nim ;]1 — i[kcart = dneﻩﻩﻩ)++k ;muNthgilF、]]i[kcart[tsiLjdA<k ;0 = k( rofﻩ ﻩ
if (AdjList[track[i]]、Train[k]、EndCity == end&&min〉AdjList[track[i]]、Flight[k]、Cost)
{ﻩﻩ
;tsoC、]k[thgilF、]]i[kcart[tsiLjdA = nimﻩﻩ ﻩ
;k = pmtﻩﻩ
}
ﻩ printf(”%s", AdjList[track[i]]、Flight[tmp]、name);
ﻩ
printf ("%2d:%2d—%2d:%2d”, AdjList[track[i]]、Flight [tmp]、StartTime / 60, AdjList[track[i]]、Flight[tmp]、StartTime % 60, AdjList[track[i]]、Flight[tmp]、StopTime / 60, AdjList[track[i]]、Flight[tmp]、StopTime % 60);
}
}
printf("\n%s: DESTINATION!”, CityName[track[0]]);
printf(”\nMin Cost : %d\n", cost); } void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType)
{
int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used;
//
i ytiC fo yticerp eht,0>ytiCerPﻩ ;sop ,erp ,nim ,j ,i tniﻩ for (i = 0; i<CityNum; i++)
{ﻩ ;1- = ]i[ytiCerPﻩﻩ }
;2- = ]trats_p[ytiCerPﻩ
)1— == ]dne_p[ytiCerP( elihwﻩ {ﻩ
min = —1;
ﻩ for (i = 0; i<CityNum; i++)
ﻩ if (PreCity[i] != —1)
ﻩ {
ﻩﻩ for (j = 0; j〈CityNum; j++)
ﻩﻩ if (PreCity[j] == —1 && matx[i][j]〉0 && (min〈0 || matx[i][j]<min))
{ﻩ ﻩ
;]j[]i[xtam = nim ;j = sop ;i = erpﻩﻩ
}ﻩﻩ
}ﻩ
PreCity[pos] = pre;
}
Dijkstra_Output(matx, PreCity, p_end, TravelType); } int InitSysData() {
;pf* ELIFﻩ ;tsoc ,mun ,etunim ,ruoh ,j ,i tniﻩ char stmp1[MAX_STRING_NUM];
;]MUN_GNIRTS_XAM[2pmts rahcﻩ ;]MUN_GNIRTS_XAM[3pmts rahcﻩ fp = fopen(CityFile, ”r");
)pf!( fiﻩ {ﻩ ﻩ printf("\nError:Cannot Open City File、、、\n");
return —1;
}
fscanf(fp, ”%d”, &CityNum);
)++i ;muNytiC<i ;0 = i( rofﻩ {
;)]i[emaNytiC& ,"s%" ,pf(fnacsfﻩﻩ
;i = ytic、]i[tsiLjdAﻩ ;0 = muNniarT、]i[tsiLjdAﻩﻩ ﻩ AdjList[i]、FlightNum = 0;
}
fclose(fp);
fp = fopen(TrainFile, "r");
)pf!( fiﻩ {ﻩ
printf("\nError:Cannot Open Train File、、、\n");
ﻩ return -1;
}
fscanf(fp, "%d", &num);
for (i = 0; i〈num; i++)
{ﻩ
fscanf(fp, ”%s", &stmp1); //列车得车次
站发始得车列// ;)2pmts& ,"s%" ,pf(fnacsfﻩﻩ
fscanf(fp, "%s”, &stmp3); //列车得终点站
;)2pmts(ytiCkeeS = jﻩtiCkeeS = ytiCdnE、]muNniarT、]j[tsiLjdA[niarT、]j[tsiLjdAﻩﻩy(stmp3); //将列车得车次、始发站、终点站、出发时间、到达时间读出
,eman、]muNniarT、]j[tsiLjdA[niarT、]j[tsiLjdA(ypcrtsﻩstmp1);
fscanf(fp, "%d:%d", &hour, &minute);
ﻩ AdjList[j]、Train[AdjList[j]、TrainNum]、StartTime = hour * 60 + minute;
;)etunim& ,ruoh& ,”d%:d%” ,pf(fnacsfﻩﻩ 06 * ruoh = emiTpotS、]muNniarT、]j[tsiLjdA[niarT、]j[tsiLjdAﻩﻩ+ minute;
fscanf(fp, ”%d", &cost);
AdjList[j]、Train[AdjList[j]、TrainNum]、Cost = cost;
AdjList[j]、TrainNum++;
}ﻩ ;)pf(esolcfﻩ ;)"r” ,eliFthgilF(nepof = pfﻩ )pf!( fiﻩ {
ﻩ printf("\nError:Cannot Open Flight File、、、\n");
ﻩ return -1;
}ﻩ fscanf(fp, ”%d”, &num);
)++i ;mun〈i ;0 = i( rofﻩ {ﻩ
fscanf(fp, ”%s”, &stmp1); //飞机得车次
站发始得机飞// ;)2pmts& ,"s%” ,pf(fnacsfﻩﻩ
站点终得机飞// ;)3pmts& ,”s%" ,pf(fnacsfﻩ
j = SeekCity(stmp2); eeS = ytiCdnE、]muNthgilF、]j[tsiLjdA[thgilF、]j[tsiLjdAﻩﻩkCity(stmp3); mts ,eman、]muNthgilF、]j[tsiLjdA[thgilF、]j[tsiLjdA(ypcrtsﻩﻩp1);
;)etunim& ,ruoh& ,”d%:d%" ,pf(fnacsfﻩﻩ
* ruoh = emiTtratS、]muNthgilF、]j[tsiLjdA[thgilF、]j[tsiLjdAﻩ60 + minute;
;)etunim& ,ruoh& ,"d%:d%" ,pf(fnacsfﻩ ﻩ AdjList[j]、Flight[AdjList[j]、FlightNum]、StopTime = hour * 60 + minute;
fscanf(fp, "%d", &cost);
AdjList[j]、Flight[AdjList[j]、FlightNum]、Cost = cost;
AdjList[j]、FlightNum++;
}
fclose(fp); return 1; } int SearchMinTime(CityType City, CityType EndCity, int CurTime, int curPathNo, int TravelType) { //CityType 就是一种短整形函数,SearchMinTime共有5个参数
;i tniﻩ if (City == EndCity)
{ﻩ
if (MinTime>CurTime — StartTime)
{ﻩﻩ
ﻩ for (i = 0; i <= curPathNo; i++)
{ﻩ ﻩ;ytiC、]i[htaP = ytiC、]i[htaPniMﻩ;oNarT、]i[htaP = oNarT、]i[htaPniMﻩﻩ ﻩﻩ
;oNhtaPruc = htaPrucﻩ
}ﻩﻩ;emiTtratS - emiTruC = emiTniMﻩ ﻩ }
}
else
{
;++oNhtaPrucﻩ
;ytiC = ytiC、]oNhtaPruc[htaPﻩ
)epyTlevarT!( fiﻩ
{
ﻩ
)++i ;muNniarT、]ytiC[tsiLjdA<i ;0 = i( rofﻩ ﻩ
{
% emiTruC( => emiTtratS、]i[niarT、]ytiC[tsiLjdA(( fiﻩ1440))
&& (AdjList[City]、Train[i]、StopTime + (CurTime / 1440)
* 1440 — StartTime<MinTime))
ﻩ
{ﻩ
ﻩ
;i = oNarT、]oNhtaPruc[htaPﻩﻩ ﻩ ﻩdnE ,ytiCdnE、]i[niarT、]ytiC[tsiLjdA(emiTniMhcraeSﻩCity, AdjList[City]、Train[i]、StopTime + (CurTime / 1440)
* 1440, curPathNo, TravelType);
ﻩ
}
% emiTruC(〈emiTtratS、]i[niarT、]ytiC[tsiLjdA(( fiﻩﻩ1440)) && (AdjList[City]、Train[i]、StopTime + (CurTime / 1440)
* 1440 — StartTime〈MinTime))
ﻩ
{
ﻩ
;i = oNarT、]oNhtaPruc[htaPﻩﻩ
ﻩ
SearchMinTime(AdjList[City]、Train[i]、EndCity, EndCity, AdjList[City]、Train[i]、StopTime + (CurTime / 1440 + 1)
* 1440, curPathNo, TravelType);
ﻩﻩ
}ﻩ
ﻩ }
}ﻩ
else
{ﻩﻩ
ﻩﻩ for (i = 0; i<AdjList[City]、FlightNum; i++)
ﻩ
{
ﻩ
if ((AdjList[City]、Flight[i]、StartTime >= CurTime) && (AdjList[City]、Flight[i]、StopTime + (CurTime / 1440) * 1440 — StartTime<MinTime))
ﻩ
{ﻩ
ﻩ
;i = oNarT、]oNhtaPruc[htaPﻩﻩ ﻩﻩ
SearchMinTime(AdjList[City]、Flight[i]、EndCity, EndCity, AdjList[City]、Flight[i]、StopTime + (CurTime / 1440)
* 1440, curPathNo, TravelType);
ﻩ
}ﻩ ﻩﻩ
if ((AdjList[City]、Flight[i]、StartTime<CurTime) && (AdjList[City]、Flight[i]、StopTime + (CurTime / 1440)
* 1440 — StartTime<MinTime))
ﻩ
{
ﻩ
;i = oNarT、]oNhtaPruc[htaPﻩﻩ
ﻩ,ytiCdnE、]i[thgilF、]ytiC[tsiLjdA(emiTniMhcraeSﻩEndCity, AdjList[City]、Flight[i]、StopTime + (CurTime / 1440 + 1) * 1440, curPathNo, TravelType);
ﻩﻩ
}ﻩ ﻩ
}
}ﻩﻩ }
return 1; } int CalcMinTime(int StartCity, int EndCity, int TravelType)
{
int i;
;0 = htaPruc ;76723 = emiTniMﻩ
Path[0]、City = StartCity;
)epyTlevarT!( fiﻩ {ﻩ
)++i ;muNniarT、]ytiCtratS[tsiLjdA<i ;0 = i( rofﻩ {ﻩﻩ
ﻩ Path[0]、TraNo = i;
ﻩ StartTime = AdjList[StartCity]、Train[i]、StartTime;
ﻩ A ,ytiCdnE ,ytiCdnE、]i[niarT、]ytiCtratS[tsiLjdA(emiTniMhcraeSﻩdjList[StartCity]、Train[i]、StopTime, 0, TravelType);
}ﻩﻩ }
else
{
for (i = 0; i<AdjList[StartCity]、FlightNum; i++)
{ﻩ ﻩﻩ Path[0]、TraNo = i;
StartTime = AdjList[StartCity]、Flight[i]、StartTime;
,ytiCdnE、]i[thgilF、]ytiCtratS[tsiLjdA(emiTniMhcraeSﻩEndCity, AdjList[StartCity]、Flight[i]、StopTime, 0, TravelType);
}ﻩ }
if (MinTime == 32767)
{ﻩ ;)"!noitanitsed taht ot ssecca oNn\"(ftnirpﻩﻩ ﻩ return 0;
}
// if (!TravelType)
// StartTime=AdjList[StartCity]、Train[MinPath[0]、TraNo]、StartTime;
//
esleﻩ // StartTime=AdjList[StartCity]、Flight[MinPath[0]、TraNo]、StartTime;
;)"n\:htaPn\"(ftnirpﻩ )++i ;htaPruc =< i ;0 = i( rofﻩ {
)epyTlevarT!( fiﻩﻩﻩPniM[tsiLjdA ,]ytiC、]i[htaPniM[emaNytiC ,"s% :
s%"(ftnirpﻩath[i]、City]、Train[MinPath[i]、TraNo]、name);
esleﻩ ﻩ iM[tsiLjdA ,]ytiC、]i[htaPniM[emaNytiC ,”s% :
s%”(ftnirpﻩnPath[i]、City]、Flight[MinPath[i]、TraNo]、name);
printf(" %2d:%2d—%2d:%2d\n”, AdjList[MinPath[i]、City]、Train[MinPath[i]、TraNo]、StartTime / 60, AdjList [MinPath[i]、City]、Train[MinPath[i]、TraNo]、StartTime % 60, AdjList[MinPath[i]、City]、Train[MinPath[i]、TraNo]、StopTime / 60, AdjList[MinPath[i]、City]、Train[MinPath[i]、TraNo]、StopTime % 60);
}
;)]ytiCdnE[emaNytiC ,"!NOITANITSED :s%”(ftnirpﻩ % emiTniM ,06 / emiTniM ,"d2%:d2% :tsoC emiTn\"(ftnirpﻩ60);
return 1; } int CalcMinCost(int StartCity, int EndCity, int TravelType) {
;]NXAM_jiD[]NXAM_jiD[am tniﻩ ;dne ,nim ,j ,i tniﻩ for (i = 0; i〈CityNum; i++)
for (j = 0; j<CityNum; j++)
;1— = ]j[]i[amﻩﻩ if (TravelType == 0)
{
)++i ;muNytiC〈i ;0 = i( rofﻩ
{ ﻩ;0 = j ;76723 = nimﻩ
)muNniarT、]i[tsiLjdA<j( elihwﻩ ﻩﻩ {
;76723 = nimﻩﻩ;ytiCdnE、]j[niarT、]i[tsiLjdA = dneﻩﻩ
while (end == AdjList[i]、Train[j]、EndCity&&j<AdjList[i]、TrainNum)
ﻩﻩ
{
ﻩ if (AdjList[i]、Train[j]、Cost<min)
ﻩ
{
ﻩ ;tsoC、]j[niarT、]i[tsiLjdA = nimﻩﻩ ﻩ
ﻩ
}ﻩ ﻩ
ﻩ j++;
ﻩ
}ﻩ
ﻩ ma[i][end] = min;
}ﻩ
}
}ﻩ esleﻩ {ﻩ
)++i ;muNytiC<i ;0 = i( rofﻩ
{ﻩ ﻩ
min = 32767; j = 0;
while (j<AdjList[i]、FlightNum)
{
min = 32767;
ﻩ
;ytiCdnE、]j[thgilF、]i[tsiLjdA = dneﻩ
ﻩ while (end == AdjList[i]、Flight[j]、EndCity&&j〈AdjList[i]、FlightNum)
ﻩ {
ﻩ)nim<tsoC、]j[thgilF、]i[tsiLjdA( fiﻩ
ﻩﻩ {
ﻩ
min = AdjList[i]、Flight[j]、Cost;
ﻩﻩﻩ }
ﻩ
j++;
ﻩ
}ﻩﻩ ﻩ
ma[i][end] = min;
}ﻩﻩﻩ ﻩ }
}
Dijkstra(ma, StartCity, EndCity, TravelType);
return 1; } //========================================Main ()=================================================
int main() {
名市城// ;]MUN_GNIRTS_XAM[eman rahcﻩ 站发始// ;]MUN_GNIRTS_XAM[ytic_s rahcﻩ
char e_city[MAX_STRING_NUM]; //终点站
;tsoc ,dnam tniﻩ int startcity, endcity, traveltype;
int s_hour, s_minute, e_hour, e_minute;
)1( elihwﻩ {
息信权版//;)(thgiRypoCﻩﻩ 单菜主// ;)(uneMwohSﻩﻩ
scanf("%d", &mand);//输入选择
ﻩ switch (mand)
//对菜单得内容进行选择
ﻩ {
ﻩ case 0:
//退出
;0 nruterﻩ ﻩ case 1: //添加城市
ﻩ
InitSysData(); //读出文档中已存得信息
ﻩ
printf(”\n 输入城市名:"); ﻩ名市城入输// ;)eman& ,"s%"(fnacsﻩﻩ中组数到入插市城将// ;)eman(ytiCtresnIﻩ ﻩﻩ SaveSysInfo(); //把城市得信息写入文档中
ﻩ printf("System Info Save OK!\n");
;kaerbﻩﻩ ﻩ case 2:
//删除城市
InitSysData(); //读出文档中已有得信息
ﻩ
printf(”\n 输入城市名:”);
;)eman& ,”s%"(fnacsﻩ ﻩﻩ DelCity(name); //将城市删除
中档文入写息信得过理处将// ;)(ofnIsySevaSﻩ
;)"n\!KO evaS ofnI metsyS"(ftnirpﻩ ﻩ
break;
线路加添// :3 esacﻩﻩ
;)(ataDsyStinIﻩﻩ;)":名市城站始起”(ftnirpﻩﻩ站始起// ;)ytic_s& ,"s%”(fnacsﻩ
ﻩ printf(”终点站城市名:”);
ﻩﻩ scanf(”%s", &e_city); //终点站
ﻩ printf("类型(列车 0,航班1):”);
ﻩ
scanf("%d", &traveltype);
ﻩﻩ printf("输入列车/飞机班次:");
ﻩ
;)eman& ,”s%"(fnacsﻩ ﻩﻩ printf("起始时刻(00:00,24 小时制):");
ﻩ scanf(”%2d:%2d", &s_hour, &s_minute);
ﻩﻩ printf("到达时刻(00:00,24 小时制):"); ﻩ;)etunim_e& ,ruoh_e& ,"d2%:d2%"(fnacsﻩ ﻩ
;)”:价票"(ftnirpﻩ ﻩﻩ scanf("%d", &cost);
)epytlevart( fiﻩﻩ
{
ﻩ im_s + 06 * ruoh_s ,ytic_e ,ytic_s ,eman(thgilFtresnIﻩﻩnute, e_hour * 60 + e_minute, cost);
}ﻩﻩﻩ
ﻩ else
ﻩ
{
ruoh_e ,etunim_s + 06 * ruoh_s ,ytic_e ,ytic_s ,eman(niarTtresnIﻩﻩ* 60 + e_minute, cost);
ﻩ }
;)(ofnIsySevaSﻩﻩ ﻩ
printf(”System Info Save OK!\n"); ﻩ;kaerbﻩ
ﻩ case 4: //删除路线
ﻩ;)(ataDsyStinIﻩ ﻩ
;)":次班入输"(ftnirpﻩ ﻩﻩ scanf(”%s", &name);
ﻩ
DelPath(name); //将路线进行删除
;)(ofnIsySevaSﻩﻩ ﻩ
;)"n\!KO evaS ofnI metsyS"(ftnirpﻩ ﻩ
;kaerbﻩ ﻩ case 5:
//最小耗费
InitSysData(); ﻩ;)”:市城始起n\"(ftnirpﻩ ﻩﻩ scanf("%s”, &name);
;)eman(ytiCkeeS = ytictratsﻩ ﻩ
)0<ytictrats( fiﻩ
ﻩ {
ﻩ
ﻩ printf("Error City Name:No such city!\n”); ;kaerbﻩﻩ
ﻩ }
ﻩ
printf("终点城市:”);
ﻩﻩ scanf("%s”, &name);
ﻩ endcity = SeekCity(name);
ﻩ
if (endcity<0)
{ﻩﻩ
;)"n\!ytic hcus oN:emaN ytiC rorrE”(ftnirpﻩﻩ ﻩ
break;
}ﻩﻩﻩ
ﻩ printf("类型(列车 0,航班 1) :");
ﻩﻩ scanf("%d”, &traveltype);
if (traveltype != 0 && traveltype != 1)
ﻩﻩ {
ﻩﻩ
;)”!tupnI rorrE"(ftnirpﻩ ﻩﻩ
;kaerbﻩ ﻩ
}
费花得少最算计// ;)epytlevart ,yticdne ,ytictrats(tsoCniMclaCﻩﻩ
ﻩ printf(”\n”);
ﻩ
;kaerbﻩ
线路间时短最// :6 esacﻩ ﻩﻩ InitSysData();
ﻩ printf("\n 起始城市:");
;)eman& ,”s%”(fnacsﻩﻩ
ﻩ startcity = SeekCity(name);
ﻩ
if (startcity〈0)
{
ﻩ;)”n\!ytic hcus oN:emaN ytiC rorrE”(ftnirpﻩ ﻩ
;kaerbﻩ ﻩ
}ﻩ
;)":市城点终"(ftnirpﻩ
;)eman& ,"s%"(fnacsﻩ ﻩ
endcity = SeekCity(name);
)0<yticdne( fiﻩﻩ
{ﻩﻩ
ﻩ printf("Error City Name:No such city!\n”);
ﻩ;kaerbﻩ
}
;)”:
)1 班航,0 车列(型类"(ftnirpﻩﻩ ﻩ
;)epytlevart& ,"d%"(fnacsﻩ
)1 =!
epytlevart && 0 =!
epytlevart( fiﻩ ﻩ
{ﻩ
ﻩ printf("Error Input!");
;kaerbﻩ ﻩﻩ }
ﻩﻩ CalcMinTime(startcity, endcity, traveltype); //计算最少得时间
ﻩ
printf("\n");
ﻩﻩ break;
case 7:system("cls");//清除屏幕
}ﻩ }ﻩ}
下一篇:公路工程审计方法与流程