交通咨询系统设计
- 格式:doc
- 大小:58.50 KB
- 文档页数:4
课程设计报告课程名称数据结构课题名称交通咨询系统设计专业信息管理与信息系统班级学号姓名指导教师2013 年12月31 日一、设计内容与设计要求1设计内容[问题描述] 在交通网络非常发达的今天,人们出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也很感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示城市,边表示城市之间的交通关系。
设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到达另外一个城市顶点之间的最短路径(里程)的问题。
[基本功能]1).根据实际情况,先建立交通网络图的存储结构。
2).求某个城市到达其余各城市的最短路径。
3).任一输入两个城市,要求求出他们之间的最短路径。
2设计要求:1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:设计总结及心得体会。
6).上机演示。
二、进度安排第 17 周星期二 8时:00分——11时:30分星期三 8时:00分——11时:30分星期四 14时:00分——17时:30分星期五 8时:00分——11时:30分第 18 周星期一 8时:00分——11时:30分星期二 8时:00分——11时:30分附:课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序源代码)。
榆林学院数据结构课程设计报告题目城市交通咨询系统作者杨朝专业信息管理与信息系统学号指导老师张慧答辩时间目录1 .系统需求分析 (1)用户需求分析 (1)功能需求分析 (2)数据需求分析 (2)小结 (3)2.系统设计 (3)系统设计功能 (3)每个模块的具体功能。
(4)采用C语言定义相关数据类型 (4)建立邻接矩阵交通网络: (4)查询指定城市到其他城市自己建的最短路程: (6)查询任意两个城市之间的一条最短路径: (7)主函数的调用关系图 (8)3.系统测试 (9)操作说明 (9)测试数据 (10)用户进入界面: (10)、具体功能的实现 (11)、结束程序 (12)4.总结 (13)5.致谢 (13)6.附录 (14)1.系统需求分析现如今网络非常发达,无论人们出差,旅游或者做其他的出行之时,都会想到道路问题,切不仅仅关心的是交通费用,而且对于里程和所需要的时间等的问题也是同样的关心,在此系统中,完全面向用户,可以用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
且在图中,顶点表示城市,边表示城市之间的交通关系。
设计一个交通咨询系统,能够让旅客咨询从任一城市顶点到达另外一个城市之间顶点的最短路径问题(最短里程问题)。
对系统分析,主要从以下几个方面进行分析。
1.用户需求分析2.功能需求分析3.数据需求分析用户需求分析现如今网络非常发达,无论人们出差,旅游或者做其他的出行之时,都会想到道路问题,切不仅仅关心的是交通费用,而且对于里程和所需要的时间等的问题也是同样的关心,在此系统中,完全面向用户,可以用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
且在图中,顶点表示城市,边表示城市之间的交通关系。
设计一个交通咨询系统,能够让旅客咨询从任一城市顶点到达另外一个城市之间顶点的最短路径问题(最短里程问题)。
当要查询某两个城市之间的最短交通路线或者其中一个城市到达其余城市的最短路线时,是一个很繁琐的过程。
设计题目<二>:交通咨询系统设计P160 一、设计要求 1 .问题描述根据不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。
模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。
2.需求分析二、概要设计1.主界面设计(图“交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息typedef struct TrafficNodetmp = k;}printf("%s", AdjList[track[i]].Train[tmp].name);pri ntf("%2d:%2d-%2d:%2d",AdjList[track[i]].Trai n[tmp].StartTime / 60,AdjList[track[i]].Train[tmp].StartTime % 60,AdjList[track[i]].Trai n[tmp].StopTime / 60,AdjList[track[i]].Trai n[tmp].StopTime % 60);else{for (i--; i>0; i--) um;[k++)ghar name[MAX_STRlNG_NUM];jajnN{printf("\n%s:", CityName[track[i]]);end = track[i - 1]; min = 32767;for (k = 0; k<AdjList[track[i]].FlightNum; k++)if (AdjList[track[i]].Train[k].EndCity ==end&&min>AdjList[track[i]].Flight[k].Cost){min = AdjList[track[i]].Flight[k].Cost;tmp = k;}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]; 添加城市在主菜单下,用户输入 1,添加城市名称(图添加城市)2.删除城市在主菜单下,用户输入2,删除已添加城市名称(图删除城市)3.添加交通路线在主菜单下,用户输入3,已添加城市名称。
CHINA交通咨询系统目录一、需求分析 (2)1、程序的功能及设计要求 (2)2、输入输出的要求 (2)二、环境说明 (2)三、详细设计 (3)1、模块设计 (3)2、画出各函数的调用关系图、主要函数的流程图。
(3)2、详细代码 (4)四、调试分析 (4)1、测试数据: (4)2、借鉴的资料 (5)五、课程总结 (6)六、附录 (6)一、需求分析1、程序的功能及设计要求在交通网络非常发达、交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也感兴趣.对于这样一个人们关心的问题,通过建立交通网络图的存储结构图,提供用户查询的功能,功能一:通过输入城市名及任意两个城市的距离,查询任意两个城市之间的最短距离,从而达到最省目的;功能二:通过输入城市名以及任意两个程序的距离,查询中转路线最少。
程序所具有的功能特色本程序主要目的是为了给用户提供路径咨询,可以通过输入设置,延续程序的拓展性。
设计要求及分析设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的中转次数最少问题或最低花费或最少时间(最短路径)问题。
该设计共分三个部分:一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现任意两个城市顶点之间的最短路径问题。
1。
建立交通网络图的存储结构要实现设计要求,首先要定义交通图的存储结构:邻接链表和邻接矩阵;2。
解决任意两个城市顶点之间的中转次数最少的问题;3. 解决任意两个城市顶点之间的最短路径(最低花费或最少时间)问题。
2、输入输出的要求定义变量类型应该保持类型一致,通过键盘输入,确保输入输出一致,使最短路径途径以及最短路径能够简单明了的输出,同时保持程序简洁美观,效果明显。
输入要求为输入界面直观、亲切;有利于快速输入;有利于准确输入;有利于输入、修改;方便操作。
输出要求:输出要求应简单、直观,一目了然,尽量符合用户的习惯,便于用户阅读、理解与使用.输出内容应尽量汉字化,从而使输出格式醒目;各种输出设计要长考虑以利于系统发展和输出项目扩充、变动的需要;输出操作方便二、环境说明系统:WINDOS7开发软件:vc6+三、详细设计1、模块设计交通咨询系统模块图如下由模块图可知,该设计共分三个部分:一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现任意两个城市顶点之间的最短路径问题。
交通咨询系统(一)需求分析设计、实现一个全国大城市间的交通咨询程序,为旅客提供三种最优决策方案:一是建立交通网络图的存储结构,二实现两个城市间的最短路经问题。
本程序主要目的是为了给用户提供路径咨询。
实现了帮助用户了解全国各大城市间往来的最短路径问题,可以提供用户查询各大城市的相关信息。
本程序最大的特点是支持用户自己添加城市信息及城市,或添加城市的路径,既有可扩展性。
该程序所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
此程序规定:(1)在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。
(2)程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
(3)程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
.1题目分析1.由题目的分析知全国交通咨询管理系统是有对城市信息的增加、删除、修改、保存、查询、有错时提示出错信息等功能,最后对数据进行保存并退出操作系统。
由此可知需要将函数模块化,将它做为一个独立的函数体去实现它的功能。
它可以分为四大功能模块,每个模块需要去各个击破。
2.根据这些功能和基本要求,可充分运用我们所学的数据结构的基本知识和技能去逐步的解决。
其中将函数进行模块化。
在数据结构中,通过队列,栈,图的声明来实现系统的各种功能的存储各城市之间乘火车的消耗价格,时间,乘飞机的价格,时间,以及中转站最少。
利用指针和结点来实现城市与城市之间各种操作,而这些知识点都是我们学习数据结构必须掌握和学会运用的。
数据结构课程设计全国交通咨询系统数据结构课程设计全国交通咨询系统随着交通工具的快速发展,现代人的出行方式更加灵活便捷,交通行业也变得越来越重要。
然而,随之而来的交通拥堵、安全问题和出行效率等问题亟待解决。
因此,交通咨询系统的开发应运而生。
本文介绍一个数据结构课程设计项目——全国交通咨询系统,该系统旨在为用户提供便捷、全面的交通出行信息和服务。
该系统主要包括以下方面的功能:1. 城市选择及路线查询功能用户可选择目的地城市,系统将返回该城市的基本信息,以及从用户当前位置到目的地的交通路线和方案,并提供相应的时间和费用信息。
2. 交通工具查询功能用户可在系统中查询各种交通工具的班次、价格、车次和到达时间等相关信息,以便用户做出最优出行方案。
3. 路况信息查询该系统可实时获取交通状况信息,并展示给用户最新的路况信息。
此外,当用户选择出行方式时,系统可根据实时路况为用户提供最佳出行方案。
4. 预订和购票该系统可为用户提供方便的预订和购票服务。
用户可在线预订和购买机票、火车票和长途汽车票等交通工具,并选择合适的座位和时间。
5. 旅游景点推荐功能该系统可根据用户的出行方案提供适宜的旅游景点推荐。
用户可在系统中了解这些景点的详细信息和交通时间,以便更好地规划自己的行程。
该全国交通咨询系统的实现需要多种数据结构的支持,例如图、树、堆栈、链表、哈希表等。
下面分别讨论每个功能的实现方法和相关数据结构。
1. 城市选择及路线查询功能城市选择及路线查询功能需要通过图的遍历来实现。
图是由顶点和边组成的集合,可以用来表示城市及它们之间的相互关系。
在本系统中,每个城市可以看做一个顶点,每条连接两个城市的路径被视为一条边。
为了实现城市选择及路线查询功能,需要对图进行遍历。
在这个系统中,广度优先搜索算法(BFS)是最佳选择,因为BFS可以给出最近的解决方案。
2. 交通工具查询功能交通工具查询功能需要通过树来实现。
树是由节点和边组成的集合,可以用来表示各种结构化数据。
交通咨询模拟系统课程设计一、课程目标知识目标:1. 让学生掌握交通咨询模拟系统的基本原理和功能。
2. 引导学生了解交通咨询模拟系统在实际生活中的应用。
3. 帮助学生理解并掌握交通流量的数据分析方法。
技能目标:1. 培养学生运用所学知识设计和搭建简单的交通咨询模拟系统的能力。
2. 提高学生分析交通数据,提出合理解决方案的能力。
3. 培养学生团队协作和沟通表达的能力。
情感态度价值观目标:1. 激发学生对交通咨询模拟系统相关领域的兴趣,培养探究精神。
2. 培养学生关注社会交通问题,认识到科技在解决交通问题中的重要性。
3. 引导学生树立正确的价值观,关注交通安全,提高社会责任感。
课程性质:本课程为实践性较强的课程,以项目式教学为主,结合理论讲解和实际操作。
学生特点:学生为初中生,具备一定的信息技术基础,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:教师需关注学生个体差异,提供针对性的指导,鼓励学生积极参与讨论和实践,注重培养学生的学习兴趣和动手能力。
通过本课程的学习,使学生能够将所学知识应用于实际生活中,提高解决实际问题的能力。
二、教学内容1. 交通咨询模拟系统概述- 交通咨询模拟系统的定义与作用- 交通咨询模拟系统的发展与应用2. 交通咨询模拟系统的基本原理- 交通流量的基本概念- 交通流量的数据分析方法- 交通咨询模拟系统的构建原理3. 交通咨询模拟系统的设计与实现- 系统设计的基本流程与方法- 系统实现的工具与技术- 系统测试与优化4. 实践项目:设计一个简单的交通咨询模拟系统- 项目目标与要求- 项目实施步骤与方法- 项目成果展示与评价5. 交通咨询模拟系统在实际生活中的应用案例- 城市交通拥堵解决方案- 公共交通优化- 紧急救援路径规划教学内容安排与进度:第1课时:交通咨询模拟系统概述第2课时:交通咨询模拟系统的基本原理第3课时:交通咨询模拟系统的设计与实现(上)第4课时:交通咨询模拟系统的设计与实现(下)第5课时:实践项目:设计一个简单的交通咨询模拟系统第6课时:交通咨询模拟系统在实际生活中的应用案例教学内容与教材关联性:本教学内容紧密结合教材中关于信息技术应用、数据分析、系统设计等相关章节,确保学生能够学以致用,提高解决实际问题的能力。
/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
**建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
* */#defi ne MAX_VERTEX_NUM 18#defi ne NULL 0#defi ne MAX_ARC_SIZE 100#defi ne MAX_ROUTE_NUM 5#i nclude"stdio.h"#i nclude"stdlib.h"#i nclude"stri ng.h"#defi ne False 0#defi ne True 1#define INFINITY 10000 /* 预定义*/ typedef struct {int nu mber;float expe nditure;int begi ntime[2];int arrivetime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}in folist;typedef struct ArcNode {int adjvex;struct ArcNode *n extarc;in folist info;}ArcNode;typedef struct VNode {char cit yn ame[10];ArcNode *pla nefirstarc,*tra in firstarc; }VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vex nu m,pla nearc nu m,tra inarcnum; }ALGraph;typedef struct Node {int adjvex;int route;struct Node *n ext;}Node;typedef struct QNode {int adjvex;struct QNode *n ext;}QNode;typedef struct {QNode *front;QNode *rear;}Lin kQueue;typedef struct TimeNode {int adjvex;int route;int begi ntime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM];}TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /* 数据结构定义*/ char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];in t c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /* 变量定义*//*各种操作说明*/void Disp();void Admi nister(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q); void createcityfile();void CreateGraph(ALGraph *G);void createpla nefile();void CreateTimeTree(TimeTree p,i nt i,i nt j,L in kQueue *Q,i nfolist (*arcs)[MAX_VERTEX_NUM]);void createtra in file();int Deletepla neArc(ALGraph *G);void DeleteQueue(Li nkQueue *Q,i nt *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void Dema ndDispose(i nt n ,ALGraph G);void DestoryTimeTree(TimeTree p);void En terpla neArc(ALGraph *G);void En terQueue(L in kQueue *Q,i nt x);void En tertrainArc(ALGraph *G);void En terVertex(ALGraph *G);void Expe nditureDispose(i nt k,i nfolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,i nt vO,i nt v1,float *M,i nt *fin al);void flightedit(ALGraph *G);void in itgraph(ALGraph *G);void In itQueue(L in kQueue *Q);int IsEmpty(L in kQueue *Q);int LocateVertex(ALGraph *G,char *v);void Min Expe nditure(i nfolist arcs,float *expe nditure,i nt *route);void Mi nTime(i nfolist arcs,i nt *time,i nt *route);void Prin tGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(i nt k,i nfolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,i nt v0,i nt v1,i nt (*T)[2],i nt *fin al);void TimeTreeDispose(Node *head,i nfolist (*arcs)[MAX_VERTEX_NUM]);void trai nedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraphG,int v0,i nt v1);void UserDema nd(ALGraph G);void VisitTimeTree(TimeTree p);void Disp() /* 软件入口,显示函数*/{textbackgro un d(7);textcolor(5);gotoxy(20,10);printf(" ------------------------------ \n");gotoxy(20,11);printf("| 交通咨询系统Version 1.0 |\n"); gotoxy(20,12); prin tf("| |\n");gotoxy(20,13);printf("| 一叶方舟|\n");gotoxy(20,14);prin tf("| |\n");gotoxy(20,15);printf(" ------------------------------ \n");gotoxy(40,20);printf("A_A欢迎使用A_A");sleep(3);clrscr();}int main()/* 主函数,程序入口*//*显示程序功能选择界面*/ {ALGraph G;int i;textbackgro un d(7); textcolor(5); clrscr();Disp();printf(" 请选择程序功能:\n");printf( “*************************************\n"); printf("** 1= 管理员管理**\n");printf("** 2= 用户咨询**\n");printf("** 3= 显示交通系统**\n");printf("** 4= 退出**\n");printf( H************************************ *\n"); printf("请选择?");sca nf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G); break;case 3:PrintGraph(&G);break;prin tf("\n 请选择程序功能:\n");printf( H************************************* \n");printf("** 1= 管理员管理**\n");printf("** 2= 用户咨询**\n");printf("** 3= 显示交通系统**\n");prin tf("** 4= 退出**\n");printf( H************************************* \n");prin tf("选择?");sca nf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf(" ------------------------------ \n");gotoxy(20,11);prin tf("| 指导老师:夏汉民老师|\n");gotoxy(20,12);prin tf("| |\n");gotoxy(20,13);printf("| 制作:李济舟|\n");gotoxy(20,14);prin tf("| |\n");gotoxy(20,15);printf(" ------------------------------ \n");gotoxy(40,20);printf(" 谢谢使用");sleep(1);gotoxy(40,20);printf(" 正在退出");for(i=0;i<3;i++){ pri ntf(".");sleep(i);}return 0;void Admi nister(ALGraph *G) /* 显示管理员管理项目选择界面*/{int i,j=O;char password[5];be:clrscr();gotoxy(20,10);printf(" ----------------------------------- \n");gotoxy(20,11);prin tf("| 管理员管理项目|\n");gotoxy(20,13);printf("| 1. 初始化交通系统|\n");gotoxy(20,15);printf("| 2. 城市编辑|\n");gotoxy(20,17);printf("| 3. 飞机航班编辑|\n");gotoxy(20,19);printf("| 4. 列车车次编辑|\n");gotoxy(20,20);printf(" ----------------------------------- \n");gotoxy(40,25);printf(”请输入登陆密码(admin): ”);for(i=0;i<5;i++){password[i]=getch();prin tf("*");} if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i'||password[4]!=' n') {gotoxy(50,25);printf(" 输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n 请选择管理项目:\n");printf("1= 初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5= 返回上一级菜单\n");printf("选择?");sca nf("%d",&i);while(i!=5)printf ("1= 初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑 \n5=返回上一级菜单\n");printf (” 选择?");sca nf("%d",&i);}}void initgraph(ALGraph *G) /* 初始化交通系统 *//*初始化交通系统方式选择界面 */{int i;printf("\n 请选择初始化方式:\n");prin tf("1=键盘 \n2=文档 \n");printf("选择?");sca nf("%d",&i);getchar();switch(i){case 1:createcityfile();createpla nefile();createtrai nfile();CreateGraph(G);break;case 2:CreateGraph(G); switch(i)case 1:i nitgraph(G); /* case 2:cityedit(G); /* case 3:flightedit(G); /* case 4:trai nedit(G); /* 初始化交通系统*/ break城市编辑*/ break;飞机航班编辑*/ break;列车车次编辑*/ break;}printf ("\n 请选择管理项目:\n");printf( H************************************* \n");printf("** 1= 初始化交通系统 **\n"); printf("** 2= printf("** 3= 飞机航班编辑 **\n");printf("** 4= 列车车次编辑 **\n");printf("** 5= 返回上一级菜单 **\n");城市编辑**\n");printf( H ************************************ *\n");break;}}void createcityfile()/* 创建城市名称文档*/{int i=0;int j;char flag二'y:FILE *fp;prin tf("\n 请输入城市名称的信息:\n");while(flag=='y'||flag=='Y'){printf(" 城市名称:");gets(city[i]);i++;printf("继续输入?(Y/N)");sca nf("%c", &flag);getchar();}prin tf("\n");if((fp=fope n( "city.txt","wb"))==NULL){printf(" 无法打开文件!\n");return;}for(j=0;j<i;j++)fprin tf(fp,"%10s",city[j]);fclose(fp);}void createpla nefile() /* 创建飞机航班文档*/ {in t code,bt[2],at[2]; /*code float mon ey;int i;int count;char vt[10],vh[10],flag; /*vt FILE *fp;flag二'y';coun t=0;while(flag=='Y '||flag=='y') /*flag 航班编号,bt出发时间,at到达时间*/起始城市,vh目标城市*/为标志位,初值为1*/{prin tf(" 请输入飞机航班的信息::");/* 输入航班code*/ 输入航班的出发城市vt*/ 输入航班的到达城市vh*/ 输入机票价格 money*/ 输入航班的出发时间bt*/ sca nf("%d:%d",&bt[O],&bt[1]); getchar(); while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n 时间输入有误,请重新输入\n");sca nf("%d:%d",&bt[0],&bt[1]);getchar();}printf (” 到达时间:");/* 输入航班的到达时间at*/ sca nf("%d:%d",&at[0], &at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n 时间输入有误,请重新输入\n");sca nf("%d:%d",&at[0], &at[1]);getchar();}a[count].co 二code; /*a 为程序头部定义的结构体*/ strcpy(a[co un t].vt,vt);strcpy(a[co un t].vh,vh);a[cou nt].bt[0]=bt[0];a[cou nt].bt[1]=bt[1];a[cou nt].at[0]=at[0];a[cou nt].at[1]=at[1];a[co un t].mo 二mon ey;count++; /* 计数值 count+1*/printf(" 继续输入?(Y/N)"); /* 提示"是否要继续输入航班信息: sca nf("%c", &flag);getchar();prin tf("\n"); /*提示"输入航班信息"*/ prin tf(" 飞机航班编号sea nf("%d",&code);getchar(); printf("起始城市:");/*gets(vt);getchar(); printf("目的城市:");/*gets(vh); printf("航班费用:");/* seanf("%f",&mon ey); getchar(); printf("起飞时间:");/*"*/if((fp二fope n("pla ne.txt","wb"))==NULL) /* 航班文件不能以读写形式打开*/ printf("\n 无法打开文件!\n"); /* 提示"无法打开文件"*/fprintf(fp,"%d",count); /* 将计数值count写入航班车文件*/for(i=0;i<co un t;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) /* 无法将a[i]写入航班文件*/ printf("\n 文件写入错误!\n"); /* 提示"文件无法写入"*/fclose(fp); /* 关闭航班文件*/}void createtrai nfile() /* 创建列车车次文档*/{in t code,bt[2],at[2];float mon ey;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';coun t=0;while(flag=='y'||flag=='Y'){printf(" 请输入列车车次的信息:\n");printf(" 列车车次编号:");sca nf("%d",&code);getchar();printf(" 起始城市:");gets(vt);getchar();printf(" 目的城市:");gets(vh);printf(" 车次费用:");sca nf("%f",&mon ey);getchar();printf(" 发车时间:");sca nf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n 时间输入有误,请重新输入\n");sca nf("%d:%d",&bt[0],&bt[1]);getchar();}printf(" 到达时间:");sca nf("%d:%d", &at[0], &at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]v0||at[1]>=60){printf("\n 时间输入有误,请重新输入\n");sca nf("%d:%d",&at[0], &at[1]);getchar();}a[co un t].co二code;strcpy(a[co un t].vt,vt);strcpy(a[co un t].vh,vh);a[cou nt].bt[0]=bt[0];a[cou nt].bt[1]=bt[1];a[cou nt].at[0]=at[0];a[cou nt].at[1]=at[1];a[co un t].mo 二mon ey;coun t++;printf("继续输入?(Y/N)");sca nf("%c", &flag);getchar();prin tf("\n");}if((fp=fope n("trai n. txt","wb"))==NULL)printf("\n 无法打开文件!\n");fprin tf(fp,"%d",co un t); for(i=0;i<co un t;i++)if(fwrite (&a[i],sizeof(struct arc),1,fp)!=1)printf("\n 文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置*/{int j,k;j=_1;for(k=0;k<G->vex nu m;k++)if(strcmp(G->vertices[k].cityname,v)==0) /* 第k 个结点中的城市名与传过来的城市名相同*/{j=k; /* 记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用 city , plan , train 三个文档创建城市交通 系统*/ {int i,j,k;int arc_num;int coun t1,co un t2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fope n("city.txt","rb"))二二NULL)/* */{printf("\n无法打开文件!\n"); return;}while(!feof(fp))/* 文件不为空 */ {fsca nf(fp,"%1Os",city[i]);i++;}fclose(fp); /* 关闭文件 */j=0;while(j<i){strcpy(G->vertices[j].cit yn ame,city[j]);/* 结构体的结点数组中;*/G->vertices[j].pla nefirstarc 二NULL; /*G->vertices[j].tra in firstarc=NULL; j++;}G->vex num 二i;if((fp=fope n( "pla ne.txt","rb"))==NULL)printf("\n 无法打开文件!\n");k=0;fscanf(fp,"%d",&count1); /*打开航班信息文件"plane.txt"*/ while(k<co un t1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n 文件读入错误!\n");k++;}fclose(fp); /* 关闭文件 */k=0; /*a 的计数变量k=0*/arc_num=O; /* 弧的计数变量 arc_num 二0*/ while(k<co un t1){i 二LocateVertex(G,a[k].vt); 打开城市文件,文件指针返回值为空将city[i] 中的内容复制到图的 图的结构体其他项赋初值;*//*调用函数LocateVertex(G,a[k].vt) 得到起始结点的位置i*/j=LocateVertex(G,a[k].vh);/*调用函数LocateVertex(G,a[k].vh) 得到起始结点的位置j*/q=G->vertices[i].pla nefirstarc;m=0;while(q匸NULL){if(q->adjvex==j) /* 弧q中的邻接顶点与j相等*/{t=q->st+1; /* 将数组a[i] 中的内容都复制到弧q中*/q->i nfo.stata[t]. nu mber二a[k].co;q->i nfo.stata[t].expe nditure二a[k].mo;q->i nfo.stata[t].begi ntime[0]=a[k].bt[0];q->i nfo.stata[t].begi ntime[1]=a[k].bt[1];q->i nfo.stata[t].arrivetime[0]=a[k].at[0];q->i nfo.stata[t].arrivetime[1]=a[k].at[1];q->i nfo.l ast=t;m=1;break;}q二q_>n extarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); /* 开辟一个弧结点*/p->adjvex=j;/*将数组a[i]中的内容都复制到新的弧结点中*/p->i nfo.stata[0]. nu mber二a[k].co;p->i nfo.stata[0].expe nditure二a[k].mo;p->i nfo.stata[0].begi ntime[0]=a[k].bt[0];p->i nfo.stata[0].begi ntime[1]=a[k].bt[1];p->i nfo.stata[0].arrivetime[0]=a[k].at[0];p->i nfo.stata[0].arrivetime[1]=a[k].at[1];p->i nfo.l ast=0;p->n extarc=G->vertices[i].pla nefirstarc;G->vertices[i].pla nefirstarc二p; /* 将弧结点连接到适当的位置中去*/ arc_ nu m++;}k++;}G->pla nearc num 二arc_ num;if((fp二fope n("trai n. txt","rb"))==NULL){printf("\n 无法打开文件!\n");return;}k=0;fscanf(fp,"%d",&count2); /* 打开列车信息文件"plane.txt"*/ while(k<cou nt2){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n 文件读入错误!\n");k++;}fclose(fp); /* 关闭文件*/k=0; /*a 的计数变量k=0;*/arc_num=0; /* 弧的计数变量arc_num=0;*/while(k<cou nt2){i=LocateVertex(G,a[k].vt);/*调用函数LocateVertex(G,a[k].vt) 得到起始结点的位置i*/ j=LocateVertex(G,a[k].vh);/*调用函数LocateVertex(G,a[k].vh) 得到起始结点的位置j*/ q=G->vertices[i].tra in firstarc;m=0;while(q!=NULL){if(q->adjvex==j) /* 弧q中的邻接顶点与j相等*/{t=q->st+1; /* 将数组a[i] 中的内容都复制到弧q中*/ q->i nfo.stata[t]. nu mber二a[k].co;q->i nfo.stata[t].expe nditure二a[k].mo;q->i nfo.stata[t].begi ntime[0]=a[k].bt[0];q->i nfo.stata[t].begi ntime[1]=a[k].bt[1];q->i nfo.stata[t].arrivetime[0]=a[k].at[0];q->i nfo.stata[t].arrivetime[1]=a[k].at[1];q->i nfo.l ast=t;m=1;break;}q二q_>n extarc;}if(m==0){ p=(ArcNode*)malloc(sizeof(ArcNode)); /* 开辟一个弧结点*/ p->adjvex二j; /* 将数组a[i]中的内容都复制到新的弧结点中*/p->i nfo.stata[O]. nu mber二a[k].co;p->i nfo.stata[0].expe nditure二a[k].mo;p->i nfo.stata[0].begi ntime[0]=a[k].bt[0];p->i nfo.stata[0].begi ntime[1]=a[k].bt[1];p->i nfo.stata[0].arrivetime[0]=a[k].at[0];p->i nfo.stata[0].arrivetime[1]=a[k].at[1];p->i nfo.l ast=0;p->n extarc=G->vertices[i].tra in firstarc;G->vertices[i].trai nfirstarc二p; /* 将弧结点连接到适当的位置中去*/arc_ nu m++;}k++;}G->tra inarcnum 二arc_ num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档*/{int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(j<G->vex num){strcpy(city[j],G->vertices[j].city name);j++;}i=0;if((fp=fope n("city.txt","wb"))==NULL)printf("\n 错误,无法打开文件!\n");while(i<G->vex num){fprin tf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0;i<G->vex nu m;i++){q=G->vertices[i].pla nefirstarc;while(q!=NULL){for(t=0;t<二q->i nfo.l ast;t++){strcpy(a[k].vt,G->vertices[i].cit yn ame); strcpy(a[k].vh,G->vertices[q->adjvex].city name);a[k].co=q->i nfo.stata[t]. nu mber;a[k].mo=q->i nfo.stata[t].expe nditure; a[k].bt[0]=q->i nfo.stata[t].begi ntime[0]; a[k].bt[1]=q->i nfo.stata[t].begi ntime[1]; a[k].at[0]=q->i nfo.stata[t].arrivetime[0]; a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q二q_>n extarc;}}if((fp=fope n("pla ne.txt","wb"))==NULL){printf("\n 无法打开文件!\n");return 0;}i=0;fprin tf(fp,"%d",k);while(i<k){if(fwrite (&a[i],sizeof(struct arc),1,fp)!=1) printf("\n 文件写入错误!\n");i++;} fclose(fp);k=0;for(i=0;i<G->vex nu m;i++){q=G->vertices[i].tra in firstarc;while(q!=NULL){for(t=0;t<=q->i nfo.l ast;t++){strcpy(a[k].vt,G->vertices[i].cit yn ame); strcpy(a[k].vh,G->vertices[q->adjvex].city name);a[k].co=q->i nfo.stata[t]. nu mber;a[k].mo=q->i nfo.stata[t].expe nditure; a[k].bt[0]=q->i nfo.stata[t].begi ntime[0]; a[k].bt[1]=q->i nfo.stata[t].begi ntime[1];a[k].at[O]=q->i nfo.stata[t].arrivetime[0];a[k].at[1]=q->i nfo.stata[t].arrivetime[1];k++;}q二q_>n extarc;}}if((fp=fope n("trai n.txt","wb"))==NULL){printf("\n 无法打开文件!\n");return 0;}i=0;fprin tf(fp,"%d",k);while(ivk){if(fwrite (&a[i],sizeof(struct arc),1,fp)!=1)printf("\n 文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面*/ {int i;printf("\n 请选择城市编辑项目:\n");printf("1= 增加城市\n2=删除城市\n");printf(”选择?");sca nf("%d",&i);getchar();if(i==1)En terVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市*/{char v[10],c;int i;printf("\n 请输入新增城市的名称:");gets(v);i二LocateVertex(G,v);if(i>=0&&i<G->vex num){printf("\n 错误!此城市已存在\n");return;}else{prin tf("\n 确认?(Y/N)");c=getchar();getchar();if(c=='Y '||c二二y){i=G->vex num;strcpy(G->vertices[i].city name,v);G->vertices[i].pla nefirstarc二NULL; G->vertices[i].tra in firstarc=NULL; G->vex num 二i+1; save(G);}else return;}} void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//*删除城市*/{int i,j,k, n;char v[10],c;ArcNode *p,*q,*m;printf("\n 请输入删除的城市:");/* 提示”输入删除城市名"*/gets(v);printf("\n 确认?(Y/N)"); /* 提示"是否确定要删除(Y/N) "*/c=getchar();getchar();if(c=='Y '||c二二y){n=0; /*0是记数标志,控制循环次数*/while (n< G->vex num&&strcmp(G->vertices [n ].cit yn ame,v)!=0)/*n<图G表头接点总个数&&图G的存储城市名与v不同,G表头结点总个数比实际大1*/n++;/*记数值n+1*/if(n==G->vexnum) /*n== 图G表头结点总个数*/printf("\n 错误!无法找到此城市!\n"); /* 提示”无法找到此城市"*/else{i=LocateVertex(G,v); /* 利用G函数找到此城市名所处在G中位置*/p=G->vertices[i].pla nefirstarc;while(p匸NULL){q=p;p=p->n extarc;free(q); /* 删除从此结点出发的所有航班弧*/}p=G->vertices[i].tra in firstarc;while(p!=NULL){q=p;p=p->n extarc;free(q); /* 删除从此结点出发的所有列车弧*/}for(j=i;j<G->vex nu m_1;j++){strcpy(G->vertices[j].cit yn ame,G->vertices[j+1].cit yn ame);/*将G第j个结点的信息依前移1位*/G->vertices[j].pla nefirstarc二G->vertices[j+1].pla nefirstarc;G->vertices[j].tra in firstarc=G->vertices[j+1].tra in firstarc;}G->vertices[j].planefirstarc二NULL; /* 将G第j 个结点的信息置空*/G->vertices[j].tra in firstarc=NULL;for(k=0;k<G->vex nu m-1;k++) /* 以下是删除所有指向此结点的航班弧*/{p=G->vertices[k].pla nefirstarc;while(p!=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;p=p->nextarc; /*p 指向下一条飞机弧*/}Elseif(p->adjvex==i) /* 该弧指向的顶点位置(p->adjvex )== i*/{if(p==G->vertices[k].planefirstarc)/*p 指向图G中k 结点的第一条飞机弧*/ {m=p;G->vertices[k].pla nefirstarc二p->n extarc;/*将图G中k结点的第二条飞机弧改为第一弧*/p=p->nextarc; /*p 指向下一条飞机弧*/free(m); /* 释放(m)*/}Else{q->nextarc二p->nextarc; /* 将p的下一条弧赋给q的下一条弧*/m=p;p=p->nextarc; /*p 指向下一条飞机弧*/free(q); /* 释放(q)*/}Else{q=p;p=p->nextarc; /*p 指向下一条飞机弧*/}}}for(k=0;k<G->vex nu m-1;k++) /* 以下是删除所有指向此结点的列车弧*/{p=G->vertices[k].trainfirstarc; /*p 指向图G中k 结点的第一条列车弧*/while(p匸NULL){if(p->adjvex>i) /* 该弧指向的顶点位置(p->adjvex)>i */{p->adjvex=p->adjvex-1; /* 将该弧指向顶点位置-1*/q=p;p=p->nextarc; /*p 指向下一条列车弧*/}Elseif(p->adjvex==i) /* 该弧指向的顶点位置(p->adjvex)==i*/{if(p==G->vertices[k].trainfirstarc)/*p 指向图G中k 结点的第一条列车*/ {m=p;G->vertices[k].tra in firstarc=p->n extarc;/*将图G中k结点的第二条列车弧改为第一弧*/p=p->n extarc;free(m);}Else{q->n extarc二p->n extarc;m=p;p=p->n extarc;free(q);}}else{q=p;p=p->n extarc;}}}G->vex nu m--;save(G);}else return;}void flightedit(ALGraph *G) /* 飞机航班编辑项目选择界面*/ {int i; /* char q; */prin tf("\n 请选择飞机航班编辑项目:\n");printf("1= 新增航班\n2=删除航班\n");printf(”选择?");sca nf("%d",&i);getchar();if(i==1)En terpla neArc(G);if(i==2)Deletepla neArc(G);}void trai nedit(ALGraph *G) /* 列车车次编辑项目选择界面*/ {int i; /* char q; */prin tf("\n 请选择列车车次编辑项目:\n");printf("1= 新增车次\n2=删除车次\n");printf(”选择?");sca nf("%d",&i);getchar();if(i==1)En tertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G) /* 增加飞机航班*/ {int i,j,bt[2],at[2];int code;float mon ey;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;prin tf("\n 请输入新增飞机航班的信息:\n");printf(" 飞机航班编号:");sca nf("%d", &code);getchar();printf(" 起始城市:");gets(vt);getchar();printf(" 目的城市:");gets(vh);printf(" 航班费用:");sca nf("%f",&mon ey);getchar();printf(" 起飞时间:");sca nf("%d:%d",&bt[O],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {printf("\n 时间输入有误,请重新输入\n"); sca nf("%d:%d",&bt[0],&bt[1]);getchar();}printf(" 到达时间:");sca nf("%d:%d", &at[0], &at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n 时间输入有误,请重新输入\n"); sca nf("%d:%d",&at[0], &at[1]);getchar();}prin tf("\n 确认?(Y/N)");c=getchar();getchar();if(c=='Y '||c二二y){i二LocateVertex(G,vt);j二LocateVertex(G,vh);if(i==-1){prin tf("\n 错误!无法找到起始城市\n"); return; }if(j==-1){prin tf("\n 错误!无法找到到达城市\n"); return;}q=G->vertices[i].pla nefirstarc;m=0;while(q匸NULL){if(q->adjvex==j){t二q->info.l ast+1;q->i nfo.stata[t]. nu mber二code;q->i nfo.stata[t].expe nditure二 mon ey;q->i nfo.stata[t].begi ntime[O]=bt[O];q->i nfo.stata[t].begi ntime[1]=bt[1];q->i nfo.stata[t].arrivetime[0]=at[0];q->in fo.stata[t].arrivetime[1]=at[1];q->i nfo.l ast=t;m=1;break;}q二q_>n extarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j;p->in fo.stata[0]. nu mber二code;p->i nfo.stata[0].expe nditure二 mon ey;p->i nfo.stata[0].begi ntime[0]=bt[0];p->i nfo.stata[0].begi ntime[1]=bt[1];p->i nfo.stata[0].arrivetime[0]=at[0];p->i nfo.stata[0].arrivetime[1]=at[1];p->i nfo.l ast=0;p->n extarc=G->vertices[i].pla nefirstarc;G->vertices[i].pla nefirstarc二p; G->pla nearc nu m++; }save(G);}else return;}void EntertrainArc(ALGraph *G) /* 增加列车车次*/ {int i,j,bt[2],at[2];int code;float mon ey;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;prin tf("\n 请输入新增列车车次的信息:\n");printf(" 列车车次编号:");sca nf("%d",&code);getchar();printf(" 起始城市:");gets(vt);getchar();printf(" 目的城市:");gets(vh);printf(" 车次费用:");sca nf("%f",&mon ey);getchar();printf(" 发车时间:");sca nf("%d:%d",&bt[O],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {printf("\n 时间输入有误,请重新输入\n");sca nf("%d:%d",&bt[0],&bt[1]);getchar();}printf(" 到达时间:");sca nf("%d:%d", &at[0], &at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n 时间输入有误,请重新输入\n");sea nf("%d:%d", &at[O], &at[1]);getchar();}prin tf("\n 确认?(Y/N)");c=getchar();getchar();if(c=='Y '||c二二y){i=LocateVertex(G,vt);j二LocateVertex(G,vh);if(i==-1){prin tf("\n 错误!无法找到起始城市\n"); return;}if(j==-1){prin tf("\n 错误!无法找到到达城市\n"); return;}q=G->vertices[i].tra in firstarc;m=0;while(q匸NULL){if(q->adjvex==j){t二q->info.l ast+1;q->in fo.stata[t]. nu mber二code;q->i nfo.stata[t].expe nditure二 mon ey; q->i nfo.stata[t].begi ntime[0]=bt[0];q->i nfo.stata[t].begi ntime[1]=bt[1];q->i nfo.stata[t].arrivetime[0]=at[0];q->in fo.stata[t].arrivetime[1]=at[1];q->info.l ast=t;m=1;break;}q二q_>n extarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->i nfo.stata[0]. nu mber二code;p->i nfo.stata[0].expe nditure二 mon ey; p->i nfo.stata[0].begi ntime[O]=bt[O];p->i nfo.stata[0].begi ntime[1]=bt[1];p->i nfo.stata[0].arrivetime[0]=at[0];p->i nfo.stata[0].arrivetime[1]=at[1];p->i nfo.l ast=0;p->n extarc二G->vertices[i].tra in firstarc; G->vertices[i].tra in firstarc=p;G->tra inarcnu m++;}save(G);}else return;}int DeleteplaneArc(ALGraph *G) /* 删除飞机航班*/ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n 请输入删除飞机航班的信息:\n");printf(" 飞机航班的编号:");sca nf("%d",&code);getchar();printf(" 起始城市:");gets(vt);getchar();printf(" 目的城市:");gets(vh);prin tf("\n 确认?(Y/N)");c=getchar();getchar();if(c=='Y '||c二二y){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){prin tf("\n 错误!无法找到起始城市\n");return 0;}if(j==-1){prin tf("\n 错误!无法找到目的城市\n");return 0;}p二G->vertices[i].pla nefirstarc;q=p;while(p匸NULL)。
交通咨询系统设计实验目的和要求1. 掌握最短路径的算法;2. 编写实验报告;实验内容本设计要求一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一个城市顶点之间的最短路径、最低花费或最少时间等问题。
对于不同的咨询要求,可输入城市间的路程、所需时间或所需费用。
实验步骤1、问题分析该设计分为三个部分:建立交通网络图的存储结构解决单源最短路径问题实现两个城市顶点之间的最短路径问题2、问题求解2.1建立交通网络图的存储结构图的邻接矩阵#define MVNum 50Typedef struct{VertexType vexs[MVNum];〃顶点信息Adjmatrix arcs[MVNum][MVNum];〃邻接矩阵边的信息}MGraph2.2单源最短路径Dijkstra 算法按路径长度递增产生诸顶点的最短路径2.3任意两个顶点之间的最短路径Floyd算法3、完整的程序清单4、程序运行测试#include "stdafx.h"#i nclude <stdio.h>#in clude <stri ng.h>#defi ne MVNum 50#defi ne Dij_MAXN 33#defi ne MAX_VERTEX_NUM 31#defi ne MAX_STRING_NUM 10#defi ne MAX_TRAFFIC_NUM 10typedef 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<<"\t 选择序号错误 ! 请重新选择 !\n";int InitSystem()void User()void Administrators()int DelCity(char *Name) // 删除城市{//删除城市。
《数据结构课程设计》实验报告
编号实验五实验项目名称交通咨询系统设计
学时数3课时指导教师冯韵班
级
计科一班
学
号
33
姓
名
周兴
实验日期2010-10-16 成绩
一、实验目的:设计一个交通咨询系统能让旅客咨询从任意一个城市顶点到另一城市顶点之间的最短路径或最低花费或最少时间等问题。
二、内容与设计思想:(设计思想、主要数据结构、主要代码结构、主要代码段分析)
1.设计思想:一是用有向图的邻接矩阵建立交通网络图的存储结构;二是是用迪杰斯特拉(Dijkstra)算法解决源点到所有点的最短路径问题;三是用费罗伊德(Floyd)算法算出任意两点之间的最短路径。
2.主要数据结构:1.建立有向图的存储结构
2.迪杰斯特拉算法
3.费罗伊德算法
4.主框架函数的实现
3.主要代码结构:
{//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数
int i,j,k,w;
for(i=1;i<=n;i++)
G->vexs[i]=(char)i;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
G->arcs[i][j]=Maxint;
printf("输入%d条边的i,j及w:\n",e);
for(k=1;k<=e;k++){
scanf("%d,%d,%d",&i,&j,&w);
G->arcs[i][j]=w;
}
printf("有向图的存储结构建立完毕!\n");
}
void Dijkstra(MGraph*G,int v1,int n)
{ int D2[MVNum],P2[MVNum];
int v,i,w,min;
enum boolean S[MVNum];
for(v=1;v<=n;v++){
S[v]=FALSE;
D2[v]=G->arcs[v1][v];
if(D2[v]<Maxint)
P2[v]=v1;
else
P2[v]=0;}
D2[v1]=0;S[v1]=TRUE;
for(i=2;i<n;i++){
min=Maxint;
for(w=1;w<=n;w++)
if(!S[w]&&D2[w]<min)
{v=w;min=D2[w];}
S[v]=TRUE;
for(w=1;w<=n;w++)
if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){
D2[w]=D2[v]+G->arcs[v][w];
P2[w]=v;}
}
printf("路径长度路径\n");
for(i=1;i<=n;i++){
printf("%5d",D2[i]);
printf("%5d",i);v=P2[i];
while(v!=0){
printf("<-%d",v);
v=P2[v];}
printf("\n");}
}
void Floyd(MGraph*G,int n)
{ int i,j,k,v,w;
for(i=i;i<=n;i++)
for(j=1;j<=n;j++)
{
if(G->arcs[i][j]!=Maxint)
P[i][j];
else
P[i][j]=0;
D[i][j]=G->arcs[i][j];}
for(k=1;k<=n;k++)
{ for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
P[i][j]=P[i][k];}
}
}
}
void main()
{ MGraph*G;
int n,e,v,w,k;
int xz=1;
G=(MGraph*)malloc(sizeof(MGraph));
printf("输入图中顶点个数和边数n,e:");
scanf("%d,%d",&n,&e);
CreateMGraph(G,n,e);
while(xz!=0){
printf("******求城市之间的最短路径******\n");
printf("===============================\n");
printf("1.求一个城市到所有城市的最短路径\n");
printf("2.求任意的两个城市之间的最短路径\n");
printf("===============================\n");
printf(" 请选择:1或2,选择0退出: \n");
scanf("%d",&xz);
if(xz==2){
Floyd(G,n);
printf("输入源点(或称起点)和终点:v,w:");
scanf("%d,%d",&v,&w);
k=P[v][w];
if(k==0)
printf("顶点%d到%d无路径!\n",v,w);
else
{ printf("从顶点%d到%d的最短路径是:%d",v,w,v);
while(k!=w){
printf("→%d",w);
k=P[k][w]; }
printf("→%d",w);
printf(" 路径长度:%d\n",D[v][w]);}
}
else
if(xz==1){
printf("求单源路径,输入源点v:");
scanf("%d",&v);
Dijkstra(G,v,n); }
}
printf("结束求最短路径,再见!\n");
}
三、调试过程(测试数据设计与测试结果分析)
按要求输入图中的定点个数和边数n,e:4,5
i,j是图中边的顶点编号,w是边的权值
按要求输入:
按enter键选择1,求单源路径,输入1(求顶点1到其它点的最短路径)
此为源点1到其它点的最短路径
然后选择2后,程序调用Floyd算法
输入源点和终点v,w:2,3
顶点2到顶点3无路径,选择0退出。
四、总结
1、设计中遇到的问题及解决过程
在输入i,j,w的值时对数据的输入规则不够清楚,有向图的认识不熟悉,多看几遍实验程序了解输入数据的有向单一性。
2、设计中产生的错误及原因分析
在Floyd算法中v,w是无效引用的局部变量,将i=1错输为i=i让程序在求最短路径是发生错误
3、设计体会和收获
对于图的认识更深入了解,了解迪杰斯特拉算法和费罗伊德算法的数据结构。
五、评阅意见:。