1、 数据结构课程设计交通咨询系统设计 设计题目<二>: 7.3.4交通咨询系统设计P160 一、 设计要求 1.问题描述 根据不同目的的旅客对交通工具有不同的要求。例如, 因公出差的旅客希望在旅途中的时间尽可能的短, 出门旅行的旅客希望旅费尽可能的少, 而老年人则要求中转次数少。模拟一个全国城市之间的咨询交通程序, 为旅客提供两种或三种最优的交通路线。 2.需求分析 二、 概要设计 1.主界面设计 ( 图2.1”交通咨询系统”主菜单) 2.存储结构设计 本系统采用图结构类型存储抽象交通咨询系统的信息。 typedef st
2、ruct TrafficNode { char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10 int StartTime, StopTime; //起止时间 int EndCity; //该有向边指向的顶点在数组中的位置, 即该城市编号 int Cost; //票价 } TrafficNodeDat; typedef struct VNode { CityType city; int TrainNum, FlightNum; //标记下面Train数组和Flight数组里元素个数 TrafficN
3、odeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体, 记录了到达城市、 起止时间、 票价和班次 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费( 时间或者费用) } VNodeDat; typedef struct PNode { int City; int TraNo; } PNodeDat; 3.系统功能设计 ( 1) 添加城市。添加一个城市的名称 ( 2) 删除城市。输入一个城市名称, 删除该城市。 ( 3) 添加交通路线。输入起始城
4、市、 终点城市、 航班或火车、 车次、 起始时间、 终点时间和票价 ( 4) 删除交通路线。输入火车或飞机的班次删除该交通路线。 ( 5) 查询最小费用路线。输入起始城市、 终点城市、 航班或火车、 车次、 起始时间、 终点时间查询最小费用路线。 三、 模块设计 1.模块设计 无向网操作模块 工作区模块 主程序模块 ( 图2.2 模块调用示意图) 2.系统子程序及功能设计 ( 1) int ShowMenu()//主菜单 ( 2) void CopyRight() ( 3) int SeekCity(char *nam
5、e) //寻找城市 ( 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 *EndCit
6、y, 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 Tra
7、velType)//查询最短时间 ( 13) int CalcMinTime(int StartCity, int EndCity, int TravelType) //显示最短时间 ( 14) int CalcMinCost(int StartCity, int EndCity, int TravelType)//最少花费 ( 15) int main()//主函数 3.函数主要调用关系图 15main( ) 8 9 1 12 7 5 4 13 6 3 6 1 2 2 3 7 1 6 ( 图2.3函数
8、主要调用关系图) 四、 详细设计 1.数据类型定义 ( 1) 全局变量的定义 typedef short int CityType;//CityType 定义短整形的变量 typedef struct TrafficNode { char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10 int StartTime, StopTime; //起止时间 int EndCity; //该有向边指向的顶点在数组中的位置, 即该城市编号 int Cost; //票价 } TrafficNodeDat; type
9、def struct VNode { CityType city; int TrainNum, FlightNum; //标记下面Train数组和Flight数组里元素个数 TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体, 记录了到达城市、 起止时间、 票价和班次 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费( 时间或者费用) } VNodeDat; typedef struct PNode { int City;
10、 int TraNo; } PNodeDat; 2.系统主要子程序详细设计 ( 1) 用户工作区模块的设计 int ShowMenu() { printf("\n|******************欢迎使用交通咨询系统*******|\n"); printf("\n|------------------1: 添加城市----------------|"); printf("\n|------------------2: 删除城市----------------|"); printf("\n|------------------3: 添加交通路线-------
11、"); printf("\n|------------------4: 删除交通路线------------|"); printf("\n|------------------5: 查询最小费用路线--------|"); printf("\n|------------------6: 查询最快路线------------|"); printf("\n|------------------7: 清除屏幕----------------|"); printf("\n|------------------0: 退出--------------------|\n")
12、 printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n"); printf("\n请输入你的选择:"); return 1; } ( 2) 用Dijkstra算法求两段路程的最短距离 void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], int PreCity[Dij_MAXN], int p_end, int TravelType) { int track[Dij_MAXN]; int i = 0, j, k, min, tmp, end, cost = 0
13、 j = p_end; track[i++] = j; while (PreCity[j] >= 0) { cost += matx[PreCity[j]][j]; track[i++] = j = PreCity[j]; } printf("\nTrack Way:"); if (!TravelType) { for (i--; i>0; i--) { printf("\n%s:", CityName[track[i]]); end = track[i - 1]; min = 32767; for (k = 0;
14、k






