问题重述

处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

目标:

  1. 提供对城市信息进行编辑(如添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达和最省钱到达。全程只考虑一种交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具。输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

(6)对全国城市交通图和列车时刻表及飞机航班表进行编辑,应该提供文件形式输入和键盘输入两种方式。飞机航班表的信息应包括:起始站的出发时间、终点站的到达时间和票价;列车时刻表则需根据交通图给出各个路段的详细信息,例如:对从北京到上海的火车,需给出北京至天津、天津至徐州及徐州至上海各段的出发时间、到达时间及票价等信息。

(7)以邻接表作交通图的存储结构,表示边的结构内除含有邻接点的信息外,还应包括交通工具、路程中耗费的时间和花费以及出发和到达的时间等多种属性。

(8)*可考虑增加旅途中转次数最少的最优决策。

分析过程

  1. 全国交通图中数据量较多,顶点为城市,而边上的信息非常丰富,包括两城市间的路程,两种交通工具的发车时间,费用,交通工具的车牌号或者航班号等信息。
  2. 首先将咨询者分为两类,管理员和用户,管理员可以对交通图进行编辑,而用户只能进行查询,所以设置不同的界面,界面里面包括不同的功能。

主界面

管理员界面

用户界面

  1. 对管理员界面分析:
  1. 创建交通网络图:通过从外部文本文件中导入信息然后用邻接表存储,创建完成交通网络图。包含两个文件,一个导入城市,一个导入边上的信息。(下面展示部分数据)

(数据说明:出发城市号 目的城市号 距离 费用 一天内有几趟车 第一趟车的出发时间(655表示6:55)第一趟车的车牌号 第二趟…)

(航班表未进行展示)

2)增添城市:在存储城市节点的数组中添加新城市即可。

3)删除城市:删除一个城市同时要删除与它相关的边,时间复杂度为O(V+E)。

4)增添指定路线:找到要出发点节点,然后遍历其邻接表,找到相应位置,修改里面的数据,但是作者的火车,飞机出发时间都是有序的,所以还需要再进行一次遍历,插入到出发时间链表的相应位置。时间复杂度与出发节点后的链表长度和时间信息链表相关。

5)删除指定路线:找到要删除路线的起始城市,然后遍历其后的链表,找到相应的表节点,然后进行删除即可。时间复杂度与起始节点后的链表长度有关,最坏为O(V)。

6)查看所有的火车和航班:遍历整个表,时间复杂度为O(V+E),但是实际时间还要加上遍历每条边上存储的时间链的时间。

(展示部分)

  1. 用户界面分析:旅客出行出于不同目的:提供了“距离最短”,“费用最少”和“转站最少”3种选项,让乘客可以选择适合自己的路径;这里作者全部采用了Floyd算法,没有使用Dijkstra算法,因为在用户界面,只能进行查询操作,不能进行编辑,所以在用户进行第一次加载交通图时,直接进行Floyd算法,将所有点的最短路径等信息全部保存在Path和dis数组中,后面不用重复Floyd,只用通过Path和dis数组查询即可以。而Dijkstra每次查询都要运行,不具有存储功能。Floyd算法的时间复杂度为O(n^3),空间复杂度为O(n^2).
  1. 距离最短:对于所带“路径长度”的权值采用floyd算法,计算最短路径也就是最短时间的乘车方案;因为floyd算法可以把各个顶点之间的最低路径得到,要要查询哪两个点,直接通过dis和Path数组,便可以直接获得所要求两点的最低路径。
  2. 费用最少:思路同求最短路径一致,只是将权值换成费用即可。
  3. 转站最少:换一个思维,假设在所有边上加上同一个权值—1,然后依据此权值同样进行Floyd算法,就可以求得中转次数最少的方案。 当然,作者还使用修改过DFS算法,也可以完成了这一功能。DFS时间复杂度为O(V+E),空间复杂度也为O(V)。

用DFS解决中转次数--具体代码如下:

1.   void DFS(ALGraph G,int u)
2.  {
3.      //d[i]表示从u到i节点的最短路径
4.      for (int i = 0; i < G.vexnum; ++i)
5.      {
6.          d[i] = INF; //初始化长度
7.      }
8.      visited[u] = TRUE;
9.      d[u] = 0;
10.     EnQueue(Q, u);
11.     while (!IsEmpty(Q)) {
12.         DeQueue(Q, u);
13.         for (w = FirstNeighour(G, u); w >= 0; w = NextNeighbor(G, u, w))
14.         {
15.             if (!visited[w])
16.             {
17.                 visited[w] = TRUE;
18.                 d[w] = d[u] + 1;    //中转站加1
19.                 EnQueue(Q, w);
20.             }
21.         }//if
22.     }//while
23. }

测试

  1. 管理员主界面:

  1. 用户主界面:

  1. 初始化交通图和列车时刻表:

  1. 查看已有的城市:

  1. 增添城市和路径:

  1. 删除城市和路径:

                              

  1. 最快到达:

  1. 最省钱到达:略
  2. 转站最少:略

源代码

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<memory.h>#define MAXCITYNUM 20        //定义城市数量//交通工具速度
#define train_speed 400.0
#define plane_speed 800.0//状态变量
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1#define  DataType int#define MAX_NAME 10 /* 顶点字符串的最大长度 */
#define MAX_INFO 10 /* 相关信息字符串的最大长度 */#define MAXV 100
#define INF 10000#define VexNum 5int t_distance_Path[MAXCITYNUM][MAXCITYNUM];
int p_distance_Path[MAXCITYNUM][MAXCITYNUM];
int t_price_Path[MAXCITYNUM][MAXCITYNUM];
int p_price_Path[MAXCITYNUM][MAXCITYNUM];
int t_distance_dis[MAXCITYNUM][MAXCITYNUM];
int p_distance_dis[MAXCITYNUM][MAXCITYNUM];
int t_price_dis[MAXCITYNUM][MAXCITYNUM];
int p_price_dis[MAXCITYNUM][MAXCITYNUM];int t_transfer_Path[MAXCITYNUM][MAXCITYNUM];
int p_transfer_Path[MAXCITYNUM][MAXCITYNUM];
int t_transfer_dis[MAXCITYNUM][MAXCITYNUM];
int p_transfer_dis[MAXCITYNUM][MAXCITYNUM];//全局变量用来计算价格,路程,中转次数
int s_price = 0;
int s_distance = 0;
int s_transfer = 0;//全局变量当前时间
char now_time[10] = { '\0' };typedef char VertexType[MAX_NAME];typedef struct Time {char set_off_time[10]; //出发时间char tag[MAX_INFO]; //火车号或者航班号struct Time* next;
}Time;typedef struct InfoType {int distance;          //距离int price;             //该段距离的票价    Time* time;            //时间结构
}InfoType;typedef struct ArcNode {int adjvex;                //该边所指向的节点位置struct ArcNode* nextarc;   //指向下一个结点的指针InfoType* info;            //边上的数据
}ArcNode;typedef struct {VertexType city;          //城市名ArcNode* firstarc;
}VNode, AdjList[MAXCITYNUM];typedef struct {AdjList plane_vertices;     //飞机邻接表AdjList train_vertices;     //火车邻接表int vexnum;   //图上的顶点数
}ALGraph;//队列结构typedef struct {DataType data[MAXCITYNUM];int front;int rear;
}Queue;//全局队列
Queue s_queue;//界面函数
void Run_Process(void);            //运行函数
void Main_InterFace(void);         //主界面函数
void Administrator_Command(void);  //管理员操作提示界面
void Ordinary_Command(char* str);  //用户操作提示界面//创建交通图
Status CreateGraph(ALGraph* G);//Floyd算法 求最短路径 flag为交通变量标识
Status Floyd_price(ALGraph* G, int flag);
Status Floyd_price(ALGraph* G, int flag);
Status Floyd_transfer(ALGraph* G, int flag);//交通图编辑函数
Status Insert_Vex(ALGraph* G, char* v);
Status DeleteVex(ALGraph* G, char* v);
Status DeleteArc(ALGraph* G, char* v, char* w, int flag);
Status InsertArc(ALGraph* G, char* v, char* w, int flag);//交通图相关其他函数
int Locate_City_Num(ALGraph G, char* s);
int Is_Next_City(ALGraph G, int i, int j, int flag);
void Display_City(ALGraph G);
Status Judge_City_Exist(ALGraph G, char* str);
void Print_All_Arc(ALGraph G,int flag);//时间处理函数
void Time_Convert(char* t, int n);
void Convert_To_Str(char* str, int n, int m);
void Time_Standard(char* s, int total_second);
int Convert_To_Second(char* s);//核心代码  flag--交通工具  ctr--控制打印
void Print_Choice_Distance_Path(ALGraph G, int i, int j, int flag);
void Print_Choice_Price_Path(ALGraph G, int i, int j, int flag);
void Print_Choice_Transfer_Path(ALGraph G, int i, int j, int flag);void Print_Price_Path(ALGraph G, int i, int j, int flag,int ctr);
void Print_Distance_Path(ALGraph G, int i, int j, int flag,int ctr);
void Print_Transfer_Path(ALGraph G, int i, int j, int flag, int ctr);void Screen_Traffic_Table_Distance(ALGraph G, int from, int to, int flag);
void Screen_Traffic_Table_Price(ALGraph G, int from, int to, int flag);
void Screen_Traffic_Table_Transfer(ALGraph G, int from, int to, int flag);Status Total_Price(ALGraph G, int i, int j, int flag);
Status Total_Distance(ALGraph G, int i, int j, int flag);
Status Total_Distance_And_Price(ALGraph G, int i, int j, int flag);Status Detail(ALGraph G, int from, int to, char* set_off_time, int flag);//队列相关函数
Status InitQueue(Queue* q);
Status EnQueue(Queue* q, DataType data);
DataType DeQueue(Queue* q);                   //出队//测试函数
void Command(char* str);
//void Adminstrator_InterFace(ALGraph G); //管理员
//void Ordinary_InterFace(ALGraph G);     //用户
void Test3(void);
void Test4(void);
void Test5(void);int main()
{printf("温馨提示:请保证vexnum与文件提供的城市数一致!!!\n");system("pause");Run_Process();/*int p = 600;float k = (float)p / train_speed;return;*///printf("%d", k);//Main_InterFace();//Administrator_Command();//Test3();//Test4();//ALGraph G;//CreateGraph(&G);//Print_All_Arc(G, 0);//Test5();return 0;
}void Run_Process(void)
{ALGraph Traffic_Graph;int choice;   //主页面选择int choice1;  //管理员选择int choice2;  //用户选择int tag = 1;  //操纵主界面int tag1;     //操纵管理员界面int tag2 = 1; //操纵用户界面int flag;     //区分交通工具  0代表高铁 1代表飞机char f_city[12] = { '\0' };   //出发城市char t_city[12] = { '\0' };   //目的城市char new_city[10] = { '\0' }; //新城市int city_num1;int city_num2;Status state;       //状态变量int creation = 0;     //用来标识当前图是否创建int f_creation = 0;   //二重标识while (tag == 1){/*主界面设置*/Main_InterFace();scanf_s("%d", &choice);while (choice > 3 || choice < 1){printf("Cmd Error!请输入正确的命令!\nCmd:");scanf_s("%d", &choice);}switch (choice) //主界面设置{case 1:printf("正在登录管理员界面,请稍后...\n\n");//Adminstrator_InterFace(&Traffic_Graph);////////////////// /// /// tag1 = 1;printf("登录成功!\n");while (tag1 == 1){Administrator_Command();scanf_s("%d", &choice1);while (choice1 > 8 || choice1 < 1){printf("Cmd Error!请输入正确的操作命令!\nCmd:");scanf_s("%d", &choice1);}switch (choice1){case 1:if (creation == 1){printf("当前交通网络已创建!\n");break;}if (creation == 0){CreateGraph(&Traffic_Graph);creation = 1;}printf("交通网络创建成功!\n");break;case 2:if (creation == 0){printf("请先创建交通网络!\n");break;}Display_City(Traffic_Graph);break;case 3:if (creation == 0){printf("请先创建交通网络!\n");break;}printf("请输入新的城市名:");(void)scanf("%s", new_city);if (Locate_City_Num(Traffic_Graph, new_city) != -1){printf("当前交通网络已存在%s!\n", new_city);break;}state = Insert_Vex(&Traffic_Graph, new_city);if (state == OK) printf("城市增添成功!\n");break;case 4:if (creation == 0){printf("请先创建交通网络!\n");break;}printf("请输入要删除的城市名:");(void)scanf("%s", new_city);if (Locate_City_Num(Traffic_Graph, new_city) == -1){printf("当前交通网络不存在%s!\n", new_city);break;}state = DeleteVex(&Traffic_Graph, new_city);if (state == OK) printf("城市删除成功!\n");break;case 5:if (creation == 0){printf("请先创建交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);printf("请输入增添路径的起始城市:");(void)scanf("%s", f_city);printf("请输入增添路径的结束城市:");(void)scanf("%s", t_city);if (strcmp(f_city, t_city) == 0){printf("起止城市相同!\n");break;}state = InsertArc(&Traffic_Graph, f_city, t_city, flag);if (state == OK) printf("路线增添成功!\n");break;case 6:if (creation == 0){printf("请先创建交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);printf("请输入删除路径的起始城市:");(void)scanf("%s", f_city);printf("请输入删除路径的结束城市:");(void)scanf("%s", t_city);if (strcmp(f_city, t_city) == 0){printf("起止城市相同!\n");break;}//Judge_City_Exist(G, f_city);state = DeleteArc(&Traffic_Graph, f_city, t_city, flag);if (state == OK) printf("路线删除成功!\n");else printf("城市删除失败!\n");break;case 7:if (creation == 0){printf("请先创建交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);Print_All_Arc(Traffic_Graph, flag);break;case 8:tag1 = 0;break;default:tag1 = 0;printf("管理员系统崩溃!请重新登录...\n\n\n");break;}}//while////// ////////////f_creation = 0;printf("正在返回主界面,请稍后...\n\n\n");break;case 2:printf("正在登录用户界面,请稍后...\n\n");//////// /// /// /// /// printf("登录成功!\n");tag2 = 1;while (tag2 == 1){Ordinary_Command(now_time);scanf_s("%d", &choice2);while (choice2 > 6 || choice2 < 1){printf("Cmd Error!请输入正确的操作命令!\nCmd:");scanf_s("%d", &choice2);}switch (choice2){case 1:if (creation == 0 && f_creation == 0)//防止管理员修改交通网络之后刷新{CreateGraph(&Traffic_Graph);creation = 1;}/*加载完最短路径和最少费用,后面只做简单查询,不用再修改,避免反复加载,增加复杂度*/Floyd_distance(&Traffic_Graph, 0);Floyd_distance(&Traffic_Graph, 1);Floyd_price(&Traffic_Graph, 0);Floyd_price(&Traffic_Graph, 1);Floyd_transfer(&Traffic_Graph, 0);Floyd_transfer(&Traffic_Graph, 1);f_creation = 1;printf("交通网络加载成功!\n");break;case 2:if (f_creation == 0){printf("请先加载交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);printf("请输入出发城市----");(void)scanf("%s", f_city);printf("请输入目的城市----");(void)scanf("%s", t_city);city_num1 = Locate_City_Num(Traffic_Graph, f_city);city_num2 = Locate_City_Num(Traffic_Graph, t_city);if (city_num1 == -1){printf("当前交通网络中不存在%s城市\n", f_city);break;}if (city_num2 == -1){printf("当前交通网络中不存在%s城市\n", t_city);break;}if (city_num1 == city_num2){printf("出发地址与目的地址一样!\n");break;}Screen_Traffic_Table_Distance(Traffic_Graph, city_num1, city_num2, flag);break;case 3:if (f_creation == 0){printf("请先加载交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);printf("请输入出发城市----");(void)scanf("%s", f_city);printf("请输入目的城市----");(void)scanf("%s", t_city);city_num1 = Locate_City_Num(Traffic_Graph, f_city);city_num2 = Locate_City_Num(Traffic_Graph, t_city);if (city_num1 == -1){printf("当前交通网络中不存在%s城市\n", f_city);break;}if (city_num2 == -1){printf("当前交通网络中不存在%s城市\n", t_city);break;}if (city_num1 == city_num2){printf("出发地址与目的地址一样!\n");break;}Screen_Traffic_Table_Price(Traffic_Graph, city_num1, city_num2, flag);break;case 4:if (f_creation == 0){printf("请先加载交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);printf("请输入出发城市----");(void)scanf("%s", f_city);printf("请输入目的城市----");(void)scanf("%s", t_city);city_num1 = Locate_City_Num(Traffic_Graph, f_city);city_num2 = Locate_City_Num(Traffic_Graph, t_city);if (city_num1 == -1){printf("当前交通网络中不存在%s城市\n", f_city);break;}if (city_num2 == -1){printf("当前交通网络中不存在%s城市\n", t_city);break;}if (city_num1 == city_num2){printf("出发地址与目的地址一样!\n");break;}Screen_Traffic_Table_Transfer(Traffic_Graph, city_num1, city_num2, flag);break;case 5:if (f_creation == 0){printf("请先加载交通网络!\n");break;}printf("请输入交通工具:0.高铁 1.飞机\nCmd:");scanf_s("%d", &flag);Print_All_Arc(Traffic_Graph, flag);break;case 6:tag2 = 0;printf("正在返回主界面,请稍后...\n\n\n");break;default:printf("用户界面崩溃!请重新登录...\n\n\n");tag2 = 0;break;}}//while//////////// break;case 3:printf("正在退出交通咨询系统,请稍后...\n\n\n");tag = 0;break;default:printf("系统崩溃!即将退出系统...\n\n");tag = 0;break;}}//whileprintf("退出成功!\n");return;
}void Main_InterFace(void)
{printf("**********************************Welcome to全国交通咨询系统**********************************\n");printf("||                                 请选择你的身份或退出系统                                 ||\n");printf("||                            1.管理员        2.用户     3.退出                             ||\n");printf("**********************************************************************************************\nCmd:");
}void Administrator_Command(void)
{printf("***********************************************交通网络管理员操作界面***************************************************\n");printf("请输入你的操作命令:1.创建交通网络 2.查看当前交通网中已有的城市 3.增添城市 4.删除城市 5.增添指定交通路线 6.删除指定交通路线 7.查看全部列车或者航班 8.返回主界面\n");printf("**********************************************************************************************************************\nCmd:");
}void Ordinary_Command(char* str)
{time_t now;time(&now);struct tm* tm_now;tm_now = localtime(&now);printf("*********************************************全国交通网络咨询用户界面*********************************************\n");printf("当前时间:%d-%d-%d %d:%d\n", tm_now->tm_year + 1900, tm_now->tm_mon + 1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min);printf("请输入咨询业务:1.加载交通网络 2.查询两城市之间距离最短的交通路线 3.查询两城市之间最少费用的交通路线 4.查询两城市之间中转次数最少的交通路线 5.查看全部列车或者航班 6.返回主界面\n");Convert_To_Str(str, tm_now->tm_hour, tm_now->tm_min);printf("****************************************************************************************************************\n");printf("Cmd:");
}void Display_City(ALGraph G)
{printf("当前交通网络中的城市有:\n");for (int i = 0; i < G.vexnum; i++){printf("%s ", G.train_vertices[i].city);}printf("\n");return;
}Status CreateGraph(ALGraph* G)
{FILE* fp;FILE* fp1;FILE* fp2;ArcNode* p;(*G).vexnum = VexNum;if ((fp = fopen("city.txt", "r")) == NULL) {perror("the file fail to read");system("pause");//暂停显示exit(1);}if ((fp1 = fopen("train.txt", "r")) == NULL) {perror("the file fail to read");system("pause");//暂停显示exit(1);}if ((fp2 = fopen("plane.txt", "r")) == NULL) {perror("the file fail to read");system("pause");//暂停显示exit(1);}int n = 0;while (!feof(fp) && !ferror(fp)) {fscanf(fp, "%s", (*G).train_vertices[n].city);strcpy((*G).plane_vertices[n].city, (*G).train_vertices[n].city);(*G).train_vertices[n].firstarc = NULL;(*G).plane_vertices[n].firstarc = NULL;n++;}int t1, t2;char str_time[20] = { '\0' };int itime;int distance;int price;int num;char icon[10] = { '\0' };  //用来缓存车牌号Time* ptr, * ptr1;while (!feof(fp1) && !ferror(fp1)) {//文件读取结束或出错则退出fscanf_s(fp1, "%d%d%d%d%d", &t1, &t2, &distance, &price, &num);p = (ArcNode*)malloc(sizeof(ArcNode));if (p == NULL) {return;}p->adjvex = t2;p->info = (InfoType*)malloc(sizeof(InfoType));p->info->distance = distance;p->info->price = price;p->info->time = (Time*)malloc(sizeof(Time));/*单独处理第一个元素*/ptr1 = p->info->time;fscanf(fp1, "%d%s", &itime,icon);Time_Convert(str_time, itime);strcpy(ptr1->set_off_time, str_time);strcpy(ptr1->tag, icon);/*处理除去其他元素*/for (int i = 1; i < num; i++){fscanf(fp1, "%d%s", &itime,icon);Time_Convert(str_time, itime);ptr = (Time*)malloc(sizeof(Time));strcpy(ptr->set_off_time, str_time);strcpy(ptr->tag, icon);/*插入到最后,让时间从小到大*/ptr1->next = ptr;ptr1 = ptr1->next;}/*将最后的指针置空*/ptr1->next = NULL;/* 插在表头 */p->nextarc = (*G).train_vertices[t1].firstarc;(*G).train_vertices[t1].firstarc = p;}while (!feof(fp2) && !ferror(fp2)) {fscanf_s(fp2, "%d%d%d%d%d", &t1, &t2, &distance, &price, &num);p = (ArcNode*)malloc(sizeof(ArcNode));if (p == NULL) {return;}p->adjvex = t2;p->info = (InfoType*)malloc(sizeof(InfoType));p->info->distance = distance;p->info->price = price;p->info->time = (Time*)malloc(sizeof(Time));/*单独处理第一个元素*/ptr1 = p->info->time;fscanf(fp2, "%d%s", &itime, icon);Time_Convert(str_time, itime);strcpy(ptr1->set_off_time, str_time);strcpy(ptr1->tag, icon);/*处理除去其他元素*/for (int i = 1; i < num; i++){fscanf(fp2, "%d%s", &itime, icon);Time_Convert(str_time, itime);ptr = (Time*)malloc(sizeof(Time));strcpy(ptr->set_off_time, str_time);strcpy(ptr->tag, icon);/*插入到最后,让时间从小到大*/ptr1->next = ptr;ptr1 = ptr1->next;}/*将最后的指针置空*/ptr1->next = NULL;/* 插在表头 */p->nextarc = (*G).plane_vertices[t1].firstarc;(*G).plane_vertices[t1].firstarc = p;}return OK;
}int Locate_City_Num(ALGraph G, char* s)
{int n;int flag = 0;for (n = 0; n < (G.vexnum); n++){if (strcmp(s, G.train_vertices[n].city) == 0){flag = 1;break;}}return flag == 1 ? n : -1;
}Status Judge_City_Exist(ALGraph G, char* str)
{if (Locate_City_Num(G, str) == -1){printf("当前交通网络中不存在%s城市\n", str);return FALSE;}return TRUE;
}Status Floyd_distance(ALGraph* G, int flag)
{if (flag == 0){/*flag==0代表是火车*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {t_distance_dis[i][j] = 0;}else {t_distance_dis[i][j] = INF;}}}memset(t_distance_Path, -1, sizeof(t_distance_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).train_vertices[i].firstarc;while (s != NULL) {t_distance_dis[i][s->adjvex] = s->info->distance;s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (t_distance_dis[i][k] + t_distance_dis[k][j] < t_distance_dis[i][j]) {t_distance_dis[i][j] = t_distance_dis[i][k] + t_distance_dis[k][j];t_distance_Path[i][j] = k;}//if}//for j}//for i}//for k}else {/*飞机*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {p_distance_dis[i][j] = 0;}else {p_distance_dis[i][j] = INF;}}}memset(p_distance_Path, -1, sizeof(p_distance_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).plane_vertices[i].firstarc;while (s != NULL) {p_distance_dis[i][s->adjvex] = s->info->distance;s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (p_distance_dis[i][k] + p_distance_dis[k][j] < p_distance_dis[i][j]) {p_distance_dis[i][j] = p_distance_dis[i][k] + p_distance_dis[k][j];p_distance_Path[i][j] = k;}//if}//for j}//for i}//for k}return OK;
}Status Floyd_price(ALGraph* G, int flag)
{if (flag == 0) {/*火车*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {t_price_dis[i][j] = 0;}else {t_price_dis[i][j] = INF;}}}memset(t_price_Path, -1, sizeof(t_price_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).train_vertices[i].firstarc;while (s) {t_price_dis[i][s->adjvex] = s->info->price;s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (t_price_dis[i][k] + t_price_dis[k][j] < t_price_dis[i][j]) {t_price_dis[i][j] = t_price_dis[i][k] + t_price_dis[k][j];t_price_Path[i][j] = k;}//if}//for j}//for i}//for k}else {/*飞机*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {p_price_dis[i][j] = 0;}else {p_price_dis[i][j] = INF;}}}memset(p_price_Path, -1, sizeof(p_price_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).plane_vertices[i].firstarc;while (s) {p_price_dis[i][s->adjvex] = s->info->price;s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (p_price_dis[i][k] + p_price_dis[k][j] < p_price_dis[i][j]) {p_price_dis[i][j] = p_price_dis[i][k] + p_price_dis[k][j];p_price_Path[i][j] = k;}//if}//for j}//for i}//for k}}Status Floyd_transfer(ALGraph* G, int flag)
{if (flag == 0) {/*火车*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {t_transfer_dis[i][j] = 0;}else {t_transfer_dis[i][j] = INF;}}}memset(t_transfer_Path, -1, sizeof(t_transfer_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).train_vertices[i].firstarc;while (s) {t_transfer_dis[i][s->adjvex] = 1; //代表中转一次s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (t_transfer_dis[i][k] + t_transfer_dis[k][j] < t_transfer_dis[i][j]) {t_transfer_dis[i][j] = t_transfer_dis[i][k] + t_transfer_dis[k][j];t_transfer_Path[i][j] = k;}//if}//for j}//for i}//for k}else {/*飞机*/int i, j, k;for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (i == j) {p_transfer_dis[i][j] = 0;}else {p_transfer_dis[i][j] = INF;}}}memset(p_transfer_Path, -1, sizeof(p_transfer_Path));ArcNode* s;for (i = 0; i < (*G).vexnum; i++) {s = (*G).plane_vertices[i].firstarc;while (s) {p_transfer_dis[i][s->adjvex] = 1;s = s->nextarc;}}for (k = 0; k < (*G).vexnum; k++) {for (i = 0; i < (*G).vexnum; i++) {for (j = 0; j < (*G).vexnum; j++) {if (p_transfer_dis[i][k] + p_transfer_dis[k][j] < p_transfer_dis[i][j]) {p_transfer_dis[i][j] = p_transfer_dis[i][k] + p_transfer_dis[k][j];p_transfer_Path[i][j] = k;}//if}//for j}//for i}//for k}return OK;
}void Print_Choice_Distance_Path(ALGraph G, int i, int j, int flag)
{if (flag == 0) {if (t_distance_dis[i][j] == INF) {printf("无法从%s乘坐高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);}else {printf("最短路径方案为:%s->", G.train_vertices[i].city);Print_Distance_Path(G, i, j, flag, 1);printf("%s\n", G.train_vertices[j].city);EnQueue(&s_queue, j);}}else {if (p_distance_dis[i][j] == INF) {printf("无法从%s乘坐飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);}else {printf("最短路径方案为:%s->", G.plane_vertices[i].city);Print_Distance_Path(G, i, j, flag, 1);printf("%s\n", G.plane_vertices[j].city);EnQueue(&s_queue, j);}}//else}void Print_Distance_Path(ALGraph G, int i, int j, int flag,int ctr)
{if (flag == 0) {int k = t_distance_Path[i][j];if (k == -1){ArcNode* p = G.train_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_price += p->info->price;return;}Print_Distance_Path(G, i, k, flag, ctr);if (ctr == 1) {printf("%s->", G.train_vertices[k].city);EnQueue(&s_queue, k);}Print_Distance_Path(G, k, j, flag, ctr);}//if_trainelse {int k = p_distance_Path[i][j];if (k == -1){ArcNode* p = G.plane_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_price += p->info->price;return;}Print_Distance_Path(G, i, k, flag, ctr);if (ctr == 1) {printf("%s->", G.plane_vertices[k].city);EnQueue(&s_queue, k);}Print_Distance_Path(G, k, j, flag, ctr);}//if_plane}void Print_Choice_Price_Path(ALGraph G, int i, int j, int flag)
{if (flag == 0) {if (t_price_dis[i][j] == INF) {printf("无法从%s乘坐高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);}else {printf("最少费用路径方案为:%s->", G.train_vertices[i].city);Print_Price_Path(G, i, j, flag,1);printf("%s\n", G.train_vertices[j].city);EnQueue(&s_queue, j);}}else {if (p_price_dis[i][j] == INF) {printf("无法从%s乘坐飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);}else {printf("最少费用路径方案为:%s->", G.plane_vertices[i].city);Print_Price_Path(G, i, j, flag,1);printf("%s\n", G.plane_vertices[j].city);EnQueue(&s_queue, j);}}//else
}void Print_Price_Path(ALGraph G, int i, int j, int flag,int ctr)
{if (flag == 0) {int k = t_price_Path[i][j];if (k == -1){ArcNode* p = G.train_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;return;}Print_Price_Path(G, i, k, flag,ctr);if (ctr == 1) {printf("%s->", G.train_vertices[k].city);EnQueue(&s_queue, k);}Print_Price_Path(G, k, j, flag,ctr);}//if_trainelse {int k = p_price_Path[i][j];if (k == -1){ArcNode* p = G.plane_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;return;}Print_Price_Path(G, i, k, flag, ctr);if (ctr == 1) {printf("%s->", G.plane_vertices[k].city);EnQueue(&s_queue, k);}Print_Price_Path(G, k, j, flag, ctr);}//if_plane}void Print_Choice_Transfer_Path(ALGraph G, int i, int j, int flag)
{if (flag == 0) {if (t_transfer_dis[i][j] == INF) {printf("无法从%s乘坐高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);}else {printf("最少中转路径方案为:%s->", G.train_vertices[i].city);Print_Transfer_Path(G, i, j, flag, 1);printf("%s\n", G.train_vertices[j].city);EnQueue(&s_queue, j);}}else {if (p_transfer_dis[i][j] == INF) {printf("无法从%s乘坐飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);}else {printf("最少中转路径方案为:%s->", G.plane_vertices[i].city);Print_Transfer_Path(G, i, j, flag, 1);printf("%s\n", G.plane_vertices[j].city);EnQueue(&s_queue, j);}}//else
}void Print_Transfer_Path(ALGraph G, int i, int j, int flag, int ctr)
{if (flag == 0) {int k = t_transfer_Path[i][j];if (k == -1){ArcNode* p = G.train_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;s_price += p->info->price;return;}Print_Transfer_Path(G, i, k, flag, ctr);if (ctr == 1) {printf("%s->", G.train_vertices[k].city);EnQueue(&s_queue, k);}Print_Transfer_Path(G, k, j, flag, ctr);}//if_trainelse {int k = p_transfer_Path[i][j];if (k == -1){ArcNode* p = G.plane_vertices[i].firstarc;while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;s_price += p->info->price;return;}Print_Transfer_Path(G, i, k, flag, ctr);if (ctr == 1) {printf("%s->", G.plane_vertices[k].city);EnQueue(&s_queue, k);}Print_Transfer_Path(G, k, j, flag, ctr);}//if_plane}void Screen_Traffic_Table_Distance(ALGraph G, int from, int to, int flag)
{ArcNode* p;Time* ptr;int time;char str_time[10] = { '\0' };int tag;int distance;int set_time;Status B;if (flag == 0) {InitQueue(&s_queue);p = G.train_vertices[from].firstarc;s_price = 0;distance = t_distance_dis[from][to];ptr = p->info->time;B = Total_Price(G, from, to, flag);if (B == FALSE) {//无法到达return;}printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的高铁!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:高铁 出发时间:%s 费用:%d 最短路径:%d\n", str_time, s_price, distance);Print_Choice_Distance_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}//ifelse{InitQueue(&s_queue);p = G.plane_vertices[from].firstarc;s_price = 0;distance= p_distance_dis[from][to];ptr = p->info->time;B = Total_Price(G, from, to, flag);if (B == FALSE) {//无法到达return;}printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的航班!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:飞机 出发时间:%s 费用:%d 最短路径:%d\n", str_time, s_price,distance);Print_Choice_Distance_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}
}void Screen_Traffic_Table_Price(ALGraph G, int from, int to, int flag)
{ArcNode* p;Time* ptr;int time;char str_time[10] = { '\0' };int tag;int cost;int set_time;//用户选择出发时间Status B;   if (flag == 0) {InitQueue(&s_queue);p = G.train_vertices[from].firstarc;s_distance = 0;// float k;cost = t_price_dis[from][to];ptr = p->info->time;B = Total_Distance(G, from, to, flag);if(B==FALSE){//无法到达return;}/*  k = (float)s_distance / train_speed;k = (int)(k * 3600);*/printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的高铁!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:高铁 出发时间:%s 最少费用:%d 路径:%d\n", str_time,cost,s_distance);Print_Choice_Price_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from,DeQueue(&s_queue),ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}//ifelse{InitQueue(&s_queue);p = G.plane_vertices[from].firstarc;s_distance = 0;// float k;cost = p_price_dis[from][to];ptr = p->info->time;B = Total_Distance(G, from, to, flag);if (B == FALSE) {//无法到达return;}/* k = (float)s_distance / plane_speed;k = (int)(k * 3600);*/printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的航班!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:飞机 出发时间:%s 最少费用:%d 路径:%d\n", str_time, cost,s_distance);Print_Choice_Price_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}//elsereturn;}void Screen_Traffic_Table_Transfer(ALGraph G, int from, int to, int flag)
{ArcNode* p;Time* ptr;int time;char str_time[10] = { '\0' };int tag;int transfer;int set_time;//用户选择出发时间Status B;if (flag == 0) {InitQueue(&s_queue);p = G.train_vertices[from].firstarc;s_distance = 0;s_price = 0;// float k;transfer = t_transfer_dis[from][to];ptr = p->info->time;B = Total_Distance_And_Price(G, from, to, flag);if (B == FALSE) {//无法到达return;}/*  k = (float)s_distance / train_speed;k = (int)(k * 3600);*/printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的高铁!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:高铁 出发时间:%s 最少中转次数:%d 费用:%d 路径:%d\n", str_time,transfer, s_price, s_distance);Print_Choice_Transfer_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}//ifelse {InitQueue(&s_queue);p = G.plane_vertices[from].firstarc;s_distance = 0;s_price = 0;// float k;transfer = p_transfer_dis[from][to];ptr = p->info->time;B = Total_Distance_And_Price(G, from, to, flag);if (B == FALSE) {//无法到达return;}/* k = (float)s_distance / plane_speed;k = (int)(k * 3600);*/printf("请输入你的出发时间:(格式eg:600代表6:00)\nYour set off time:");scanf_s("%d", &set_time);Time_Convert(str_time, set_time);while (ptr != NULL && strcmp(ptr->set_off_time, str_time) < 0) {ptr = ptr->next;}if (ptr == NULL){printf("-----------------------------------------------------------------------------------\n");printf("没有合适的航班!\n");printf("-----------------------------------------------------------------------------------\n\n");return;}printf("-----------------------------------------------------------------------------------\n");printf("交通工具:高铁 出发时间:%s 最少中转次数:%d 费用:%d 路径:%d\n", str_time, transfer, s_price, s_distance);Print_Choice_Transfer_Path(G, from, to, flag);printf("\n具体情况:\n");Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);printf("-----------------------------------------------------------------------------------\n\n");}//elsereturn;}Status Detail(ALGraph G, int from,int to,char* set_off_time,int flag)
{if (flag == 0) {printf("%s->%s", G.train_vertices[from].city, G.train_vertices[to].city);for (int i = 0; i < 10 - strlen(G.train_vertices[to].city); i++){printf(" ");}ArcNode* p = G.train_vertices[from].firstarc;while (p->adjvex != to) {p = p->nextarc;}float k = (float)p->info->distance / train_speed;k = (int)(k * 3600);int time = k + Convert_To_Second(set_off_time);char str_time[10] = { '\0' };Time_Standard(str_time, time);printf("高铁号:%s  时间:%s----%s  费用:%d  路程:%d\n", p->info->time->tag, p->info->time->set_off_time, str_time, p->info->price, p->info->distance);int temp = DeQueue(&s_queue);if (temp == -1) {return;}char new_set_off[10] = { '\0' };Time* q = G.train_vertices[to].firstarc->info->time;//printf("%p", q->next);/*if (q->next == 00000000) {printf("好看!");}*/while (q != NULL&&strcmp(q->set_off_time, str_time) < 0) {q = q->next;}if (q == NULL) {printf("你到达%s的时间是%s,当天已经没有从%s开往%s的高铁!\n",G.train_vertices[to].city,str_time,G.train_vertices[to].city,G.train_vertices[temp].city);return;}Detail(G, to,temp,q->set_off_time, flag);}//ifelse {printf("%s->%s", G.plane_vertices[from].city, G.plane_vertices[to].city);for (int i = 0; i < 10 - strlen(G.plane_vertices[to].city); i++){printf(" ");}ArcNode* p = G.plane_vertices[from].firstarc;while (p->adjvex != to) {p = p->nextarc;}float k = (float)p->info->distance / plane_speed;k = (int)(k * 3600);int time = k + Convert_To_Second(set_off_time);char str_time[10] = { '\0' };Time_Standard(str_time, time);printf("航班号:%s  时间:%s----%s  费用:%d  路程:%d\n", p->info->time->tag, p->info->time->set_off_time, str_time,p->info->price,p->info->distance);int temp = DeQueue(&s_queue);if (temp == -1) {return;}char new_set_off[10] = { '\0' };Time* q = G.plane_vertices[to].firstarc->info->time;while (q != NULL && strcmp(q->set_off_time, str_time) < 0) {q = q->next;}if (q == NULL) {printf("你到达%s的时间是%s,当天已经没有从%s飞往%s的飞机!\n", G.plane_vertices[to].city, str_time, G.plane_vertices[to].city, G.plane_vertices[temp].city);return;}Detail(G, to, temp, q->set_off_time, flag);}return OK;}/*使用全局变量计算全程中的费用*/
Status Total_Price(ALGraph G, int i, int j, int flag)
{ArcNode* p = G.train_vertices[i].firstarc;if (flag == 0) {int k = t_distance_Path[i][j];if (k == -1)//直达{if (t_distance_dis[i][j] == INF) {printf("无法从%s乘高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_price += p->info->price;return TRUE;}}Print_Distance_Path(G, i, k, flag, 0);Print_Distance_Path(G, k, j, flag, 0);}//ifelse {int k = p_distance_Path[i][j];if (k == -1)//直达{if (p_distance_dis[i][j] == INF) {printf("无法从%s乘飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_price += p->info->price;return TRUE;}}Print_Distance_Path(G, i, k, flag, 0);Print_Distance_Path(G, k, j, flag, 0);}//else_planereturn OK;
}Status Total_Distance(ALGraph G, int i, int j, int flag)
{ArcNode* p= G.train_vertices[i].firstarc;if (flag == 0) {int k = t_price_Path[i][j];if (k == -1)//直达{if (t_price_dis[i][j] == INF) {printf("无法从%s乘高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;return TRUE;}}Print_Price_Path(G, i, k, flag,0);Print_Price_Path(G, k, j, flag,0);}//if_trainelse {int k = p_price_Path[i][j];if (k == -1)//直达{if (p_price_dis[i][j] == INF) {printf("无法从%s乘飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;return TRUE;}}Print_Price_Path(G, i, k, flag, 0);Print_Price_Path(G, k, j, flag, 0);}return TRUE;
}Status Total_Distance_And_Price(ALGraph G, int i, int j, int flag)
{ArcNode* p = G.train_vertices[i].firstarc;if (flag == 0) {int k = t_transfer_Path[i][j];if (k == -1)//直达{if (t_transfer_dis[i][j] == INF) {printf("无法从%s乘高铁到达%s\n", G.train_vertices[i].city, G.train_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;s_price += p->info->price;return TRUE;}}Print_Transfer_Path(G, i, k, flag, 0);Print_Transfer_Path(G, k, j, flag, 0);}//if_trainelse {int k = p_distance_Path[i][j];if (k == -1)//直达{if (p_distance_dis[i][j] == INF) {printf("无法从%s乘飞机到达%s\n", G.plane_vertices[i].city, G.plane_vertices[j].city);return FALSE;}else {while (p->adjvex != j) {p = p->nextarc;}s_distance += p->info->distance;s_price += p->info->price;return TRUE;}}Print_Transfer_Path(G, i, k, flag, 0);Print_Transfer_Path(G, k, j, flag, 0);}return TRUE;
}Status Insert_Vex(ALGraph* G, char* v)
{ /* 初始条件: 图G存在,v和图中顶点有相同特征 *//* 操作结果: 在图G中增添新顶点v(不增添与顶点相关的弧,留待InsertArc()去做) */strcpy((*G).train_vertices[(*G).vexnum].city, v);strcpy((*G).plane_vertices[(*G).vexnum].city, v);(*G).train_vertices[(*G).vexnum].firstarc = NULL;(*G).plane_vertices[(*G).vexnum].firstarc = NULL;(*G).vexnum++;return OK;
}Status DeleteVex(ALGraph* G, char* v)
{ /* 初始条件: 图G存在,v是G中某个顶点 *//* 操作结果: 删除G中顶点v及其相关的弧 */int i, j;ArcNode* p, * q, * s,*t;j = LocateVex(*G, v); /* j是顶点v的序号 */if (j < 0) /* v不是图G的顶点 */return ERROR;p = (*G).train_vertices[j].firstarc; /* 删除以v为出度的弧或边 */s= (*G).plane_vertices[j].firstarc;while (p){q = p;p = p->nextarc;free(q);}//whilewhile (s) {t = s;s = s->nextarc;free(t);//(*G).arcnum--; /* 弧或边数减1 */}(*G).vexnum--; /* 顶点数减1 *///改变顶点数组for (i = j; i < (*G).vexnum; i++) /* 顶点v后面的顶点前移 */{(*G).train_vertices[i] = (*G).train_vertices[i + 1];(*G).plane_vertices[i] = (*G).plane_vertices[i + 1];}//改变邻接表for (i = 0; i < (*G).vexnum; i++) /* 删除以v为入度的弧或边且必要时修改表结点的顶点位置值 */{p = (*G).train_vertices[i].firstarc; /* 指向第1条弧或边 */s= (*G).plane_vertices[i].firstarc;while (p) /* 有弧 */{if (p->adjvex == j){if (p == (*G).train_vertices[i].firstarc) /* 待删结点是第1个结点 */{(*G).train_vertices[i].firstarc = p->nextarc;free(p);p = (*G).train_vertices[i].firstarc;/*指针回归表头节点*/// (*G).arcnum--; /* 弧或边数减1 */}}else{if (p->adjvex > j)p->adjvex--; /* 修改表结点的顶点位置值(序号) */q = p;p = p->nextarc;}//else}//whilewhile (s) /* 有弧 */{if (s->adjvex == j){if (s == (*G).plane_vertices[i].firstarc) /* 待删结点是第1个结点 */{(*G).plane_vertices[i].firstarc = s->nextarc;free(s);s = (*G).plane_vertices[i].firstarc;/*指针回归表头节点*/// (*G).arcnum--; /* 弧或边数减1 */}}else{if (s->adjvex > j)s->adjvex--; /* 修改表结点的顶点位置值(序号) */t = s;s = s->nextarc;}//else}//while}//forreturn OK;
}Status DeleteArc(ALGraph* G, char* v, char* w,int flag)
{ /* 初始条件: 图G存在,v和w是G中两个顶点 *//* 操作结果: 在G中删除弧<v,w>,若G是无向的,则还删除对称弧<w,v> */if (flag == 0) {/*火车*/ArcNode* p, * q;int i, j;i = LocateVex(*G, v); /* i是顶点v(弧尾)的序号 */j = LocateVex(*G, w); /* j是顶点w(弧头)的序号 */if (i < 0 || j < 0 || i == j)return ERROR;p = (*G).train_vertices[i].firstarc; /* p指向顶点v的第一条出弧 */q = p;while (p && p->adjvex != j) /* p不空且所指之弧不是待删除弧<v,w> */{ /* p指向下一条弧 */q = p;p = p->nextarc;}if (p && p->adjvex == j) /* 找到弧<v,w> */{if (p == (*G).train_vertices[i].firstarc) /* p所指是第1条弧 */(*G).train_vertices[i].firstarc = p->nextarc; /* 指向下一条弧 */else {q->nextarc = p->nextarc;}//free(p);}}//ifelse {ArcNode* p, * q;int i, j;i = LocateVex(*G, v); /* i是顶点v(弧尾)的序号 */j = LocateVex(*G, w); /* j是顶点w(弧头)的序号 */if (i < 0 || j < 0 || i == j)return ERROR;p = (*G).plane_vertices[i].firstarc; /* p指向顶点v的第一条出弧 */q = p;while (p && p->adjvex != j) /* p不空且所指之弧不是待删除弧<v,w> */{ /* p指向下一条弧 */q = p;p = p->nextarc;}if (p && p->adjvex == j) /* 找到弧<v,w> */{if (p == (*G).plane_vertices[i].firstarc) /* p所指是第1条弧 */(*G).plane_vertices[i].firstarc = p->nextarc; /* 指向下一条弧 *///free(p); /* 释放此结点 */else {q->nextarc = p->nextarc;}}//if}return OK;
}Status InsertArc(ALGraph* G, char* v, char* w,int flag)
{ /* 初始条件: 图G存在,v和w是G中两个顶点 *//* 操作结果: 在G中增添弧<v,w>,若G是无向的,则还增添对称弧<w,v> */char str_time[10] = { '\0' };int i, j;int elem;//缓存数据int itime;i = LocateVex(*G, v);j = LocateVex(*G, w);if (i < 0 || j < 0)return ERROR;if (flag == 0) {/*火车*/if (Is_Next_City(*G, i, j, flag)==0)//不是相邻城市,新表节点{ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));p->info = (InfoType*)malloc(sizeof(InfoType));p->info->time = (Time*)malloc(sizeof(Time));p->adjvex = j;printf("请输入两城市之间的距离:");(void)scanf_s("%d", &p->info->distance);printf("请输入来两城市之间高铁的费用:");(void)scanf_s("%d", &p->info->price);printf("请输入要添加高铁的高铁车号:");(void)scanf("%s", p->info->time->tag);printf("请输入高铁的出发时间:(格式)eg:1020代表10:20)");(void)scanf_s("%d", &itime);Time_Convert(str_time, itime);strcpy(p->info->time->set_off_time, str_time);p->info->time->next = NULL;p->nextarc = (*G).train_vertices[i].firstarc;(*G).train_vertices[i].firstarc = p;}//ifelse {//已经是相邻城市,只用添加发车时间就可以Time* q = (*G).train_vertices[i].firstarc->info->time;Time* s=q;Time* p = (Time*)malloc(sizeof(Time));printf("请输入要添加高铁的高铁车号:");(void)scanf("%s", p->tag);printf("请输入高铁的出发时间:(格式)eg:1020代表10:20)");(void)scanf_s("%d", &itime);Time_Convert(str_time, itime);strcpy(p->set_off_time, str_time);//p->next = NULL;if (strcmp(p->set_off_time, q->set_off_time) < 0){(*G).train_vertices[i].firstarc->info->time = p;p->next = q;}else {while (q != NULL && strcmp(p->set_off_time, q->set_off_time) > 0) {s = q;q = q->next;}p->next = s->next;s->next = p;}}//else}else {/*飞机*/if (Is_Next_City(*G, i, j, flag) == 0)//不是相邻城市,新表节点{ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));p->info = (InfoType*)malloc(sizeof(InfoType));p->info->time = (Time*)malloc(sizeof(Time));p->adjvex = j;printf("请输入两城市之间的距离:");(void)scanf_s("%d", &p->info->distance);printf("请输入来两城市之间飞机的费用:");(void)scanf_s("%d", &p->info->price);printf("请输入要添加航班号:");(void)scanf("%s", p->info->time->tag);printf("请输入飞机的起飞时间:(格式)eg:1020代表10:20)");(void)scanf_s("%d", &itime);Time_Convert(str_time, itime);strcpy(p->info->time->set_off_time, str_time);p->info->time->next = NULL;p->nextarc = (*G).plane_vertices[i].firstarc;(*G).plane_vertices[i].firstarc = p;}//ifelse {//已经是相邻城市,只用添加发车时间就可以Time* q = (*G).plane_vertices[i].firstarc->info->time;Time* s = q;Time* p = (Time*)malloc(sizeof(Time));printf("请输入要添加航班号:");(void)scanf("%s", p->tag);printf("请输入飞机的起飞时间:(格式)eg:1020代表10:20)");(void)scanf_s("%d", &itime);Time_Convert(str_time, itime);strcpy(p->set_off_time, str_time);//p->next = NULL;if (strcmp(p->set_off_time, q->set_off_time) < 0){(*G).train_vertices[i].firstarc->info->time = p;p->next = q;}else {while (q != NULL && strcmp(p->set_off_time, q->set_off_time) > 0) {s = q;q = q->next;}p->next = s->next;s->next = p;}}//else}return OK;
}Status InitQueue(Queue* q)
{for (int i = 0; i < MAXCITYNUM; i++) {(*q).data[i] = -1;}(*q).front = (*q).rear = 0;return OK;
}Status EnQueue(Queue* q, DataType data) {//尾插法q->data[q->rear] = data;q->rear++;return OK;
}DataType DeQueue(Queue* q)
{DataType temp = q->data[q->front];q->front++;return temp;
}int Is_Next_City(ALGraph G, int i, int j, int flag)
{if (flag == 0){ArcNode* p = G.train_vertices[i].firstarc;while (p != NULL && p->adjvex != j){p = p->nextarc;}return p == NULL ? 0 : 1;}else {ArcNode* p = G.plane_vertices[i].firstarc;while (p != NULL && p->adjvex != j){p = p->nextarc;}return p == NULL ? 0 : 1;}
}void Time_Convert(char* t, int n)
{int i = 4;while (i >= 0) {if (i == 2) t[i] = ':';else {t[i] = n % 10 + '0';n = n / 10;}//elsei--;}//while
}void Convert_To_Str(char* str, int n, int m)
{str[0] = n / 10 + '0';str[1] = n % 10 + '0';str[2] = ':';str[3] = m / 10 + '0';str[4] = m % 10 + '0';return str;
}int Convert_To_Second(char* s)
{return (s[0] - '0') * 10 * 3600 + (s[1] - '0') * 3600 + (s[3] - '0') * 10 * 60 + (s[4] - '0') * 60;
}void Time_Standard(char* s, int total_second)
{int hour = (total_second / 3600) % 24;int minute = (total_second % 3600) / 60;hour / 10 == 0 ? (s[0] = '0') : (s[0] = hour / 10 + '0');s[1] = hour % 10 + '0';s[2] = ':';minute / 10 == 0 ? (s[3] = '0') : (s[3] = minute / 10 + '0');s[4] = minute % 10 + '0';
}void Print_All_Arc(ALGraph G,int flag)
{ArcNode* p;Time* t;char str_time[12] = { '\0' };float k;int time;if (flag == 0) {for (int i = 0; i < (G.vexnum); i++){p = G.train_vertices[i].firstarc;printf("-----------------------------------------------------------------------------------\n");while (p != NULL){k = (float)p->info->distance / train_speed;k = (int)(k * 3600);printf("                         %s→%s || 距离:%d || 票价:%d\n", G.train_vertices[i].city, G.train_vertices[p->adjvex].city, p->info->distance, p->info->price);t = p->info->time;printf("              高铁号******************************************出发时间→到达时间\n");while (t != NULL){time= k + Convert_To_Second(t->set_off_time);Time_Standard(str_time, time);printf("              %s                                             %s    %s\n", t->tag, t->set_off_time,str_time);t = t->next;}p = p->nextarc;}//while pprintf("-----------------------------------------------------------------------------------\n");}//for}else {for (int i = 0; i < (G.vexnum); i++){p = G.plane_vertices[i].firstarc;printf("-----------------------------------------------------------------------------------\n");while (p != NULL){k = (float)p->info->distance / train_speed;k = (int)(k * 3600);printf("                         %s→%s || 距离:%d || 票价:%d\n", G.plane_vertices[i].city, G.plane_vertices[p->adjvex].city, p->info->distance, p->info->price);t = p->info->time;printf("              航班号******************************************起飞时间→到达时间\n");while (t != NULL){time = k + Convert_To_Second(t->set_off_time);Time_Standard(str_time, time);printf("              %s                                             %s    %s\n", t->tag, t->set_off_time, str_time);t = t->next;}p = p->nextarc;}//while pprintf("-----------------------------------------------------------------------------------\n");}//for}
}//测试函数
void Test5(void)
{ALGraph G;CreateGraph(&G);Floyd_transfer(&G, 0);Screen_Traffic_Table_Transfer(G, 0, 6, 0);
}void Test4(void)
{ALGraph g;CreateGraph(&g);char new_city[5] = { '\0' };//printf("请输入新的城市名:");//(void)scanf("%s", new_city);//Insert_Vex(&g, new_city);//DeleteVex(&g, "杭州");//DeleteArc(&g, "汉中", "西安",0);InsertArc(&g, "汉中", "北京", 0);Floyd_price(&g, 0);Screen_Traffic_Table_Price(g, Locate_City_Num(g, "汉中"), Locate_City_Num(g, "北京"), 0);DeleteArc(&g, "汉中", "西安", 0);Floyd_price(&g, 0);Screen_Traffic_Table_Price(g, Locate_City_Num(g, "汉中"), Locate_City_Num(g, "西安"), 0);return;
}void Test3(void)
{int i, j, k, n;VertexType v1, v2;ALGraph g;char f_city[12] = { '\0' };char t_city[12] = { '\0' };printf("请输入出发城市----");(void)scanf("%s", f_city);printf("请输入出发城市----");(void)scanf("%s", t_city);CreateGraph(&g);int city_num1 = Locate_City_Num(g, f_city);int city_num2 = Locate_City_Num(g, t_city);if (city_num1 == -1){printf("当前交通网络中不存在%s城市\n", f_city);return;}if (city_num2 == -1){printf("当前交通网络中不存在%s城市\n", t_city);return;}Floyd_distance(&g, 0);//Floyd_price(&g, 0);Screen_Traffic_Table_Distance(g, city_num1, city_num2, 0);
}void Command(char* str)
{time_t now;time(&now);struct tm* tm_now;tm_now = localtime(&now);//printf("now time:%d-%d-%d %d:%d", tm_now->tm_year + 1900, tm_now->tm_mon + 1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min);printf("*********************全国交通网络咨询****************\n");printf("当前时间:%d-%d-%d %d:%d\n", tm_now->tm_year + 1900, tm_now->tm_mon + 1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min);printf("请输入咨询业务:1.创建交通网络 2.最短距离 3.最少费用 4.退出\n");Convert_To_Str(str, tm_now->tm_hour, tm_now->tm_min);printf("Cmd:");
}int LocateVex(ALGraph G, char* u)
{ /* 初始条件: 图G存在,u和G中顶点有相同特征 *//* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */int i;for (i = 0; i < G.vexnum; ++i)if (strcmp(u, G.train_vertices[i].city) == 0)return i;return -1;
}//
//void Adminstrator_InterFace(ALGraph* G)
//{
//    int choice1; //管理员选择
//    int tag1 = 1; //操纵管理员界面
//    int flag;   //区分交通工具  0代表高铁 1代表飞机
//    char f_city[12] = { '\0' };  //出发城市
//    char t_city[12] = { '\0' };  //目的城市
//    char new_city[12] = { '\0' };
//    Status state;
//    int city_num;
//
//    printf("登录成功!\n");
//    while (tag1 == 1)
//    {
//        Administrator_Command();
//        scanf_s("%d", &choice1);
//        while (choice1 > 7 || choice1 < 1)
//        {
//            printf("Cmd Error!请输入正确的操作命令!\nCmd:");
//            scanf_s("%d", &choice1);
//        }
//        switch (choice1)
//        {
//        case 1:
//            if (creation == 0)
//            {
//                CreateGraph(&G);
//                creation = 1;
//            }
//            printf("交通网络创建成功!\n");
//            break;
//        case 2:
//            if (creation == 0)
//            {
//                printf("请先创建交通网络!\n");
//                break;
//            }
//            Display_City(&G);
//            break;
//        case 3:
//            if (creation == 0)
//            {
//                printf("请先创建交通网络!\n");
//                break;
//            }
//            printf("请输入新的城市名:");
//            (void)scanf("%s", new_city);
//            if (Locate_City_Num2(&G, new_city) != -1)
//            {
//                printf("当前交通网络已存在%s!\n", new_city);
//                break;
//            }
//            state = Insert_Vex(&G, new_city);
//            if (state == OK) printf("城市增添成功!\n");
//            break;
//        case 4:
//            if (creation == 0)
//            {
//                printf("请先创建交通网络!\n");
//                break;
//            }
//            printf("请输入要删除的城市名:");
//            (void)scanf("%s", new_city);
//            state = DeleteVex(&G, new_city);
//            if (state == OK) printf("城市删除成功!\n");
//            break;
//        case 5:
//            if (creation == 0)
//            {
//                printf("请先创建交通网络!\n");
//                break;
//            }
//            printf("请输入交通工具:0.高铁 1.飞机\n");
//            scanf_s("%d", &flag);
//            printf("请输入增添路径的起始城市:\n");
//            scanf("%s", f_city);
//            printf("请输入增添路径的结束城市:\n");
//            scanf("%s", t_city);
//            state = InsertArc(&G, f_city, t_city, flag);
//            if (state == OK) printf("路线增添成功!\n");
//            break;
//        case 6:
//            if (creation == 0)
//            {
//                printf("请先创建交通网络!\n");
//                break;
//            }
//            printf("请输入交通工具:0.高铁 1.飞机\n");
//            scanf_s("%d", &flag);
//            printf("请输入删除路径的起始城市:\n");
//            scanf("%s", f_city);
//            printf("请输入删除路径的结束城市:\n");
//            scanf("%s", t_city);
//            //Judge_City_Exist(G, f_city);
//            state = DeleteArc(&G, f_city, t_city, flag);
//            if (state == OK) printf("路线删除成功!\n");
//            break;
//        case 7:
//            tag1 = 0;
//            break;
//        default:
//            tag1 = 0;
//            printf("管理员系统崩溃!请重新登录...\n\n\n");
//            break;
//        }
//    }//while
//
//}
//
//int Locate_City_Num2(ALGraph* G, char* s)
//{
//    int n;
//    int flag = 0;
//    for (n = 0; n < ((*G).vexnum); n++)
//    {
//        if (strcmp(s, (*G).train_vertices[n].city) == 0)
//        {
//            flag = 1;
//            break;
//        }
//    }
//
//    return flag == 1 ? n : -1;
//}
//
//ALGraph Ordinary_InterFace(ALGraph G)
//{
//    int choice2; //用户选择
//    int tag2 = 1; //用户界面控制
//    int flag;   //区分交通工具  0代表高铁 1代表飞机
//    char f_city[12] = { '\0' };  //出发城市
//    char t_city[12] = { '\0' };  //目的城市
//    char new_city[12] = { '\0' };
//    int city_num1;
//    int city_num2;
//    Status state;
//    while (tag2 == 1)
//    {
//        Ordinary_Command(now_time);
//        scanf_s("%d", &choice2);
//        while (choice2 > 4 || choice2 < 1)
//        {
//            printf("Cmd Error!请输入正确的操作命令!\nCmd:");
//            scanf_s("%d", &choice2);
//        }
//        switch (choice2)
//        {
//        case 1:
//            if (creation == 0)//防止管理员修改交通网络之后刷新
//            {
//                CreateGraph(&G);
//                creation = 1;
//            }
//            /*加载完最短路径和最少费用,后面只做简单查询,不用再修改,避免反复加载,增加复杂度*/
//            Floyd_distance(&G, 0);
//            Floyd_price(&G, 0);
//            printf("交通网络加载成功!\n");
//            break;
//        case 2:
//            if (creation == 0)
//            {
//                printf("请先加载交通网络!\n");
//                break;
//            }
//            printf("请输入交通工具:0.高铁 1.飞机\n");
//            scanf_s("%d", &flag);
//            printf("请输入出发城市----");
//            (void)scanf("%s", f_city);
//            printf("请输入出发城市----");
//            (void)scanf("%s", t_city);
//            city_num1 = Locate_City_Num(G, f_city);
//            city_num2 = Locate_City_Num(G, t_city);
//            if (city_num1 == -1)
//            {
//                printf("当前交通网络中不存在%s城市\n", f_city);
//                break;
//            }
//            if (city_num2 == -1)
//            {
//                printf("当前交通网络中不存在%s城市\n", t_city);
//                break;
//            }
//            //Floyd_distance(G, 0);
//            //Floyd_price(&g, 0);
//            Screen_Traffic_Table_Distance(G, city_num1, city_num2, 0);
//            break;
//        case 3:
//            if (creation == 0)
//            {
//                printf("请先加载交通网络!\n");
//                break;
//            }
//            printf("请输入交通工具:0.高铁 1.飞机\n");
//            scanf_s("%d", &flag);
//            printf("请输入出发城市----");
//            (void)scanf("%s", f_city);
//            printf("请输入出发城市----");
//            (void)scanf("%s", t_city);
//            city_num1 = Locate_City_Num(G, f_city);
//            city_num2 = Locate_City_Num(G, t_city);
//            if (city_num1 == -1)
//            {
//                printf("当前交通网络中不存在%s城市\n", f_city);
//                break;
//            }
//            if (city_num2 == -1)
//            {
//                printf("当前交通网络中不存在%s城市\n", t_city);
//                break;
//            }
//            //Floyd_distance(G, 0);
//            //Floyd_price(&g, 0);
//            Screen_Traffic_Table_Price(G, city_num1, city_num2, 0);
//            break;
//        case 4:
//            tag2 = 0;
//            printf("正在返回主界面,请稍后...\n\n\n");
//            break;
//        default:
//            printf("用户界面崩溃!请重新登录...\n\n\n");
//            tag2 = 0;
//            break;
//        }
//    }//while
//    return G;
//}//void Screen_Traffic_Table_Price(ALGraph G, int from, int to, int flag)
//{
//    ArcNode* p;
//    Time* ptr;
//    int time;
//    char str_time[10] = { '\0' };
//    int tag;
//    int cost;
//    Status B;
//
//
//    if (flag == 0) {
//        InitQueue(&s_queue);
//        p = G.train_vertices[from].firstarc;
//        s_distance = 0;
//        tag = 0;
//        float k;
//        cost = t_price_dis[from][to];
//        ptr = p->info->time;
//        while (ptr) {
//
//            B = Total_Distance(G, from, to, flag);
//
//            if (B == FALSE) {//无法到达
//                break;
//            }
//
//            if (tag == 0) {
//                k = (float)s_distance / train_speed;
//                k = (int)(k * 3600);
//                tag = 1;
//            }
//            time = k + Convert_To_Second(ptr->set_off_time);
//            Time_Standard(str_time, time);
//            printf("-----------------------------------------------------------------------------------\n");
//            printf("交通工具:高铁");
//                Print_Choice_Price_Path(G, from, to, flag);
//            printf("具体情况:\n");
//            Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);
//            printf("\n交通工具:高铁 出发时间:%s 达到时间:%s 费用:%d\n", ptr->set_off_time, str_time, cost);
//
//            printf("-----------------------------------------------------------------------------------\n\n");
//            ptr = ptr->next;
//        }
//    }//if
//
//    else {
//        InitQueue(&s_queue);
//        p = G.plane_vertices[from].firstarc;
//        s_distance = 0;
//        tag = 0;
//        float k;
//        cost = p_price_dis[from][to];
//        ptr = p->info->time;
//        while (ptr) {
//
//            B = Total_Distance(G, from, to, flag);
//
//            if (B == FALSE) {//无法到达
//                break;
//            }
//
//            if (tag == 0) {
//                k = (float)s_distance / plane_speed;
//                k = (int)(k * 3600);
//                tag = 1;
//            }
//            time = k + Convert_To_Second(ptr->set_off_time);
//            Time_Standard(str_time, time);
//            printf("-----------------------------------------------------------------------------------\n");
//            Print_Choice_Price_Path(G, from, to, flag);
//            printf("具体情况:\n");
//            Detail(G, from, DeQueue(&s_queue), ptr->set_off_time, flag);
//            printf("\n交通工具:飞机 出发时间:%s 达到时间:%s 费用:%d\n", ptr->set_off_time, str_time, cost);
//
//            printf("-----------------------------------------------------------------------------------\n\n");
//            ptr = ptr->next;
//        }
//    }//plane
//
//
//}//void DFS(ALGraph G,int u)
//{
//    //d[i]表示从u到i节点的最短路径
//    for (int i = 0; i < G.vexnum; ++i)
//    {
//        d[i] = INF; //初始化长度
//    }
//    visited[u] = TRUE;
//    d[u] = 0;
//    EnQueue(Q, u);
//    while (!IsEmpty(Q)) {
//        DeQueue(Q, u);
//        for (w = FirstNeighour(G, u); w >= 0; w = NextNeighbor(G, u, w))
//        {
//            if (!visited[w])
//            {
//                visited[w] = TRUE;
//                d[w] = d[u] + 1;    //中转站加1
//                EnQueue(Q, w);
//            }
//        }//if
//    }//while
//}
city txt
汉中 西安 北京 上海 南昌
train txt
0 1 400 96 8 650 D0101 655 D0311 950 D0102 1250 D0103 1255 D0312 1550 D0104 1850 D0105 1855 D0313
0 3 1600 773 5 650 D0301 950 D0302 1250 D0303 1550 D0404 1855 D0505
0 4 1200 574 5 650 D0401 950 D0402 1250 D0403 1550 D0404 1855 D0405
1 0 400 96 5 650 D1001 950 D1002 1250 D1003 1550 D1004 1855 D1005
1 2 800 515 8 650 D1201 810 D0311 950 D1202 1250 D1203 1410 D0312 1550 D1204 1855 D1205 2010 D0313
1 3 800 712 5 650 D1301 950 D1302 1250 D1303 1550 D1304 1855 D1305
1 4  800 576 5 650 D1401 950 D1402 1250 D1403 1550 D1404 1855 D1405
2 1 800 515 5 650 D2101 950 D2102 1250 D2103 1550 D2104 1855 D2105
2 3 600 631 5 650 D2301 950 D2302 1250 D2303 1550 D2304 1855 D2305
3 0 1600 773 5 650 D3001 950 D3002 1250 D3003 1550 D3004 1855 D5005
3 1 800 712 5 650 D3101 950 D3102 1250 D3103 1550 D3104 1855 D3105
3 2 600 631 5 650 D3201 950 D3202 1250 D3203 1550 D3204 1855 D3205
3 4 400 336 5 650 D3401 950 D3402 1250 D3403 1550 D3404 1855 D3405
4 0 1200 574 5 650 D4001 950 D4002 1250 D4003 1550 D4004 1855 D4005
4 1 800 576 5 650 D4101 950 D4102 1250 D4103 1550 D4104 1855 D4105
4 3 400 336 5 650 D4301 950 D4302 1250 D4303 1550 D4304 1855 D4305
plane txt
0 3 1200 1500 4 600 F0301 800 F0302 1000 F0303 1200 F0304
3 0 1200 1500 4 600 F3001 800 F3002 1000 F3003 1200 F3004
0 1 900 1000 4 700 F0101 800 F0102 900 F0103 1000 F0104
1 0 900 1000 4 700 F1001 800 F1002 900 F1003 1000 F1004
0 2 800 900 4 850 F0201 950 F0202 1050 F0203 1120 F0204
2 0 800 900 4 850 F2001 950 F2002 1050 F2003 1220 F2004
1 3 500 450 4 750 F1301 850 F1302 950 F1303 1050 F1304
3 1 500 450 4 750 F3101 850 F3102 950 F3103 1050 F3104
1 2 600 520 4 650 F120 1850 F1202 1050 F1203 1250 F1204
2 1 600 520 4 650 F2101 850 F2102 1050 F2103 1250 F2104
1 4 1000 1200 3 820 F1401 940 F1402 1030 F1403
4 1 1000 1200 3 820 F4101 940 F4102 1030 F4103
2 3 1100 1250 4 640 F2301 840 F2302 1040 F2303 1240 F2304
3 2 1100 1250 4 640 F3201 840 F3202 1040 F3203 1240 F3204
2 4 1300 1650 3 740 F2401 850 F2402 930 F2403
4 2 1300 1650 3 740 F4201 850 F4202 930 F4203
3 4 1500 1800 3 820 F3401  930 F3402 1040 F3403
4 3 1500 1800 3 820 F4301 930 F4302 1040 F4303

数据结构--全国交通咨询系统(C语言)相关推荐

  1. 基于C++的全国交通咨询系统

    一. 设计目的 全国交通咨询模拟.处于不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅游的游客则期望旅费尽可能省,而老年旅客则需要中转次数最少.编制一个全 ...

  2. 店铺咨询系统c语言,交通咨询系统数据结构c语言word文档良心出品

    <交通咨询系统数据结构c语言word文档良心出品>由会员分享,可在线阅读,更多相关<交通咨询系统数据结构c语言word文档良心出品(22页珍藏版)>请在人人文库网上搜索. 1. ...

  3. 交通咨询系统的设计(数据结构 C语言)

    一.实验目的 1)熟悉并掌握图的存储结构: 2)熟悉并掌握单个最短路径算法: 3)熟悉并掌握任意两个顶点之间的最短路径算法. 二.实验内容 设计一个交通咨询系统,能让乘客咨询从一个城市顶点到另一个城市 ...

  4. C语言课程设计 全国交通咨询模拟,全国交通咨询模拟系统C++实现(课程设计报告).doc...

    全国交通咨询模拟系统C实现(课程设计报告) 全国交通咨询模拟 一.设计目的 掌握线性表.栈.图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储 ...

  5. 交通咨询系统(数据结构课设)

    目录 前言 选题题目 系统展示 写代码过程中出现的bug 我认为的存在的无关紧要的bug 源代码 参考文献 结语 前言 这学期做了一个数据结构的课设, 我的选题是交通咨询系统.硬性要求是组队完成,但是 ...

  6. 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc

    交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...

  7. 基于C语言的全国交通咨询系统模拟(设计报告+代码+运行说明)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85672858 资源下载地址:https://download.csdn.net/downl ...

  8. 数据结构与算法——课程设计报告(全国交通咨询模拟)

    C++ 全国交通咨询模拟 源文件点击此处下载⏬ 1 要求 [问题描述] 全国交通咨询模拟** 处于对不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客 ...

  9. 太原理工大学2021数据结构课程设计(交通咨询系统(最短路径问题))

    太原理工大学数据结构课程设计(交通咨询系统(最短路径问题)) 声明:这里只是给出核心代码 核心代码指程序的计算部分,不是完整程序 背景题目 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环 ...

最新文章

  1. zookeeper 分布式协调服务
  2. 前端性能优化篇——浏览器同域名并发请求对限制
  3. 【今日CV 视觉论文速览】05 Dec 2018
  4. 两个getchar,一个getchar,getch的不同点 出现的不同情况
  5. IDC发布2017年中国智慧城市IT十大预测
  6. c#连mysql的latin1编码乱码问题
  7. 【杂项】2020年年度报告
  8. Star Schema完全参考手册读书笔记二
  9. ssis 列转换_SSIS中的术语提取转换
  10. 验证手机号码的JS方法
  11. 微型计算机三级项目,微机原理三级项目.doc
  12. AngularJS Directive 命名规则
  13. 2015WPE封包刷Q币图文教程
  14. 您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX AVX2
  15. 如何加载和保存AutoCAD DXF文件(七参数法)
  16. coreldraw橙子怎么画_cdr怎么画一杯橙汁?CorelDRAW简单绘制的一杯满满的橙汁教程...
  17. ipv4和计算机地址是什么意思,ipv6是什么意思?我们怎么查看电脑iPv6地址
  18. The Beer House 终于运行起来了
  19. 【Java例题】3.6 计算arcsin(x)的值
  20. unity tilemap

热门文章

  1. 【图像格式】关于YUV格式的一些总结
  2. 网络计算机显示器接口,显示器的接口都有什么用
  3. 关于opa2381放大器芯片
  4. 3500x架构_3500x和 区别有多大 Ryzen 5 3500x Vs 3600
  5. Java类加载过程简述
  6. 个人ajax原理练习
  7. ch05与游戏世界交互——鼠标打飞碟小游戏
  8. UC发布电影大数据 IP改编电影最受观众青睐
  9. 安防运营服务市场现状及所遇问题的解决
  10. liunx禁ping 详解traceroute的不同用法