数据结构课程设计-全国铁路交通咨询模拟
数据结构课程设计全国交通咨询系统

.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
数据结构课程设计全国交通咨询系统

.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
数据结构课程设计全国交通咨询系统方案

工业应用技术学院课程设计任务书题目全国交通资询系统主要容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 春葆.数据结构程序设计[M].:清华大学,2002,03[2] 王黎,袁永康战略[M].:清华大学,2002,01[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
数据结构课程设计全国交通模拟

数据结构课程设计报告班级:191113学号:20111000611姓名:黄建钊指导老师:朱晓莲日期:2013年3月7.全国交通咨询模拟出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
要求:(1)提供对城市信息进行编辑(如添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
1.需求分析1、设计最短路径的算法及其需要信息的存储:本设计中最短路径的算法利用迪杰斯特拉算法,存储方法利用邻接矩阵存储。
2、该程序所做的工作的是模拟全国交通咨询,为旅客提供种最优决策的交通咨询。
此程序规定:在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个字符串类型;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入一个整型数据,在选择功能时,应输入与所选功能对应的一个整型数据。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,说明在途中经过的城市名称;程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。
2.设计2.1设计思想本系统整体上分为存储系统和求最短路径两部分,存储系统运用到数组和结构体。
该系统分别存储火车列次,航班,出发点与目的地以及所需要走的路程和所用费用。
最短路径使用迪杰斯特拉算法编程求算得出最近或最便宜路径。
该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。
数据结构课程设计-全国交通咨询模拟系统程序设计源代码

数据结构课程设计-全国交通咨询模拟系统程序设计源代码一、程序界面A.关于程序1. 该程序以C语言为开发工具,运行该程序前请确保你的机器上已安装tc或turboc ,否则系统会提示:BGI Error: Graphics not initialized (use 'initgraph')而无法使用该程序。
遇到此情况请安装tc ,建议将其安装到C:目录下,以确保程序运行万无一失。
2. 该软件完全支持鼠标,请放心使用。
3. 该程序能将您输入的城市转换为象素坐标,显示在屏幕上,操作直观方便,选择城市时,用时标一点该城市即可,省去了输入的麻烦。
如果您选择的两个城市间有路径的话,程序除了给您信息输出外,还会在地图上将此路径以不同颜色画出,更加直观。
4. 该程序附带三个数据文件(num.txt,vex.t xt,len.txt --此文件由系统默认)以供用户调试,用户还可自己创建文件,以备实验查询使用.B. 程序的使用用户打开程序,会看到命令行: FILE CHANGE SHORTWAY MAP HELP ABOUT QUIT CLRSCR用户将鼠标放于某命令上会看到屏幕最下面有一行字在闪动,这是对命令的解释,如当鼠标访于FILE上时其下解释"press this button to open/creat a file" ,当鼠标空闲时在下面显示:"Please Enter Your Choice With Mouse Or Keyboard" ,提示用户进行命令选择.单机鼠标就会将某一功能打开从而进行某一操作2.用户运行程序时请先打开 FILE 菜单,该菜单有4个命令选项:[ 信息提示 ]1. 调用已存信息库文件(由用户提供)2. 创建新的信息库文件3. 调用演示信息库文件4. 退出程序[ 请输入你的选择(1/2/3/4) ]此时程序等待用户输入选择.输入正确后程序会自动打开地图由用户进行下一步操作.3. 对于其他命令,用户可由显示于屏幕下面的提示进行相关操作.二.程序内部设计及数据结构A. 数据的存放格式1.火车信息数据结构定义:typedef struct inf{ int num;/*车次*/int stt1;int stt2;/*出发时间*/int endt1;int endt2;/*到达时间*/int waitt;/*等待时间*/int allt;/*两站之间总耗时*/int money;/*票价*/}inf2.车站信息数据结构定义:typedef struct ArcCell{int ff;/*ff=1 表示两点有信息*/int adj;/*路程长度*/inf two;/*火车信息* /}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 3.图的数据结构定义typedef struct Mgraph{ char vexs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];/*顶点名*/AdjMatrix arcs;/* 车站信息*/int vexsx[MAX_VERTEX_NUM];/*该顶点的X坐标*/int vexsy[MAX_VERTEX_NUM]; /*该顶点的Y坐标*/int vexnum,arcnum; /* vexnum:顶点的数目,arcnum:路线数目*/}Mgraph;4.基于以上数据结构的数据存储举例:(以下为部分顶点信息)wulumuqi 49 59(表示城市wulumuqi 在640X480的屏幕中位于坐标49,59处,下同)xining 97 155lanzhou 121 174(以下为部分路线信息)wulumuqi lanzhou 1 1892 1001 1 0 12 0 10 670 150(表示从城市wulumuqi 到城市lanzhou 有信息…1?,路线长度为1892,车次为1001,从城市wulumuqi开出时间为1:00,到lanzhou站时间为12:00,在lanzhou 停留10分钟,总耗时670分钟(总耗时由系统自动计算出),车票报价150元。
交通咨询模拟数据结构课程设计

数据结构课程设计报告题目:全国交通咨询模拟一.需求分析1.程序设计任务:从中国地图平面图中选取部分城市,抽象为程序所需要图的结点,并以城市间的列车路线和飞机路线,作为图结点中的弧信息,设计一个全国交通咨询模拟系统。
利用该系统实现两种最优决策:最快到达或最省钱到达。
2. 明确规定:(1)输入形式和输入值的范围:每条飞机弧或者火车弧涉及的信息量很多,包括:起始城市、目的城市、出发时间、到达时间、班次以及费用。
作为管理员要输入的信息包括以上信息,而作为用户或者客户,要输入的信息有起始城市和目的城市,并选择何种最优决策。
(2)输出形式:按用户提供的最优决策的不同而输出不同的信息,其中输出的所搭飞机或火车的班次及其起始地点和终点、起始时间和出发时间还有相关的最优信息,比如最快经多少时间到达、最省钱多少钱到达和最少经多少中转站到达。
(3)程序所能达到的功能a.该系统有供用户选择的菜单和交互性。
可以对城市、列车车次和飞机航班进行编辑,添加或删除。
b.建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通的最短路径和最少花费及中转次数最少等功能。
c.初始化交通系统有两种方式,键盘和文档。
二.设计概要1. 算法设计(1)、总体设计(1) 数据存储:城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构:根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构:采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
(完整word版)数据结构课程设计-全国交通咨询系统

X X 学院计算机系《数据结构》课程设计报告书全国交通咨询模拟系统的设计与实现学生姓名:学号:年级专业及班级:指导老师及职称:讲师专业:计算机科学与技术专业提交日期:2011年6月全国交通咨询模拟系统的设计与实现学生:指导老师:(怀化学院计算机系,怀化418008)摘要:该课程设计主要实现了对全国火车及飞机信息的修改和查询,其中主要包括:管理员对火车、飞机信息的操作,其中又包含对两种交通方式的增加和删除操作.旅客用户对两种交通信息的查询,其中飞机信息和火车信息都包含了对两个站点间最短路径方式的查询、最少花费方式的查询以及城市中所有的交通信息的查询.关键词:全国交通咨询;1前言为了完成数据结构的课程设计,为了巩固自己数据结构的知识,也是为了提高自己的编程能力和逻辑思维能力,我选了这道全国交通咨询模拟系统的设计与实现一题。
在对其需求进行分析之后,按照需求分析,逐步完成其各部分的功能实现.对于总的方面来讲,管理员功能实现并不难,而难点在于用户功能中的算法及数据结构中的知识以及编程的细微方面,下面将详细介绍本课程设计的内容.2需求分析2.1 范围2.1。
2 系统概述1.软件名称:全国交通咨询系统V1.02.软件功能:主要的功能有:管理员增删和修改城市站点信息、飞机路线信息、火车路线信息。
3.用户:查询最小耗费路线、查询最短时间路线、查询城市所有路线.4.开发者:2.1.3 文档概述需求分析采用在面向对象的方法,主要使用结构体struct的方法来进行实际的编程,在文档中主要采E—R图和对功能的简单描述的方法来表述系统的需求。
本需求分析的审查者是老师,所以主要是写给老师看的,用来说明我对这个系统的分析情况。
2.2 引用文件无2.3 需求概述2.3。
1 系统目标本系统的总体目标是通过使用该系统,管理员可以对飞机或者火车的信息的简单管理,也方便外出旅客在不同的需求下(如:最少的花费和最短的路程),快速浏览到所要的信息。
交通运输-数据结构实训全国交通咨询模拟 精品

学生实训报告实训名称:数据结构实训指导教师:姓名:学号:班级:日期:一、实训项目项目名称:全国交通咨询模拟二、实训的目的1.熟悉图数据结构;2.掌握图的顺序存储结构—邻接表;3.掌握最短路径算法4.上机调试程序,掌握查错、排错使程序能正确运行。
三.实训要求1.每个人独立完成实训项目,相互之间可以交流,不能抄袭2.实训的成果包括程序代码和报告3.程序代码要有注释和说明三、实验的环境:1.硬件环境: PC机2.软件环环境:Windows2000 +Visual C++6四、算法描述:建立图的数据结构,采用邻接矩阵作为其存储结构。
存储以上的全国主要城市的交通信息。
通过软件模拟的方法实现:给定出发点和终点,求出它们之间的最短路径,并给出最短路径的线路。
五、源程序清单:#include <stdio.h>#include<string.h>#define VEX_NUM 26#define MAXINT 1000000typedef struct graph{char city[VEX_NUM][10];int arcs[VEX_NUM][VEX_NUM];}Mgraph;void CreatGraph(Mgraph *G,int e);void Dijkstra(Mgraph *Gn, int v0,int path[],int dist[]);void PutPath(Mgraph *g,int v0,int v1,int p[],int d[]);int index(char s[],Mgraph *g);void main(){Mgraph *g;int i;int e;int v0,v1;char sr[10],dt[10];int dist[VEX_NUM];int path[VEX_NUM];g=new Mgraph;CreatGraph(g,30);printf("输入出发城市和终点城市\n");getchar();gets(sr);v0=index(sr,g);gets(dt);v1=index(dt,g);Dijkstra(g,v0,path,dist);PutPath(g,v0,v1,path,dist);}void CreatGraph(Mgraph *G,int e){int i,j,k,cost;printf("输入城市名称\n");for(i=0;i<VEX_NUM;++i)scanf("%s",G->city[i]);for(i=0;i<VEX_NUM;i++)for(j=0;j<VEX_NUM;j++)G->arcs[i][j]=MAXINT;printf("输入城市之间的距离\n");for(k=0;k<e;k++){scanf("%d,%d,%d",&i,&j,&cost);G->arcs[i][j]=cost;G->arcs[j][i]=cost;}}void Dijkstra(Mgraph *Gn, int v0,int path[],int dist[]) {int s[VEX_NUM];int v;int w;int i,j,k;int min;for(v=0; v<VEX_NUM; v++){s[v]=0;dist[v]=Gn->arcs[v0][v];if(dist[v]<MAXINT)path[v]=v0;else path[v]=-1;}dist[v0]=0;s[v0]=1;for(i=1;i<VEX_NUM -1;i++){min=MAXINT;for(w=0;w<VEX_NUM;w++)if(!s[w] && dist[w]<min){v=w;min=dist[w];}s[v]=1;for(j=0;j<VEX_NUM;j++)if(!s[j] && (min+Gn->arcs[v][j]<dist[j])){dist[j]=min+Gn->arcs[v][j];path[j]=v;}}}void PutPath(Mgraph *g,int v0,int v1,int p[],int d[]) {int k;int next;int top=0;int st[20];if(d[v1]<MAXINT && v1!=v0){st[top++]=v1;next=p[v1];while(next!=v0){st[top++]=next;next=p[next];}}elseif(v1!=v0){printf("%s->%s:没有路径\n",g->city[v0],g->city[v1]);return;}st[top++]=v0;while(top){next=st[--top];if(top!=0)printf("%s->",g->city[next]);elseprintf("%s\n",g->city[next]);}printf("两个城市之间的最短距离为:%d\n",d[v1]);}int index(char s[],Mgraph *g){int i;for(i=0;i<VEX_NUM;i++)if(strcmp(s,g->city[i])==0)return i;}六、运行结果:七、实验运行情况分析(包括算法、运行结果、运行环境等问题的讨论)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库课程设计—全国铁路咨询系统目录一.需求分析****************************************** 3 二.概要设计****************************************** 6 三.储存结构设计************************************** 8 四.详细设计****************************************** 11 五.用户手册****************************************** 17 六.测试数据****************************************** 18 七.心得体会****************************************** 26一、需求分析1、问题描述由于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省。
编制一个全国城市间的交通咨询程序,为旅客提供两种最优决策的交通咨询。
根据铁路的特征,数据的储存需要使用图的结构。
每个城市之间有不同的车次,每个车次的始发站、路过车站和终点站都不一样,所以两个城市之间就有指向明确的边,是一个有向图;而由于车次的不一样,所以发车时间,到站时间,价格等也会不一样;所以每两个点之间不止两条边,可能存在不同的多条边。
2、功能需求铁路咨询的对象是用户,所以,需要一个对用户友好的功能菜单,根据用户可能需要的实际需求,功能菜单中可能会包括以下要点:1:显示所有车站信息2: 显示所有车次信息(包括时刻表)3: 查询车站信息4: 查询两个城市之间的铁路信息5: 增加或删除车站6: 增加或删除铁路信息7: 增加、删除或修改时刻表、距离和价格8:寻找两城市间最省钱的一条路径9:寻找两城市间最省时间的一条路径10:寻找两城市间所有路径(按费用从低到高排序输出)11:寻找两城市间所有路径(按所用时间从少到多排序输出)12:退出咨询系统图的初始数据从文本中读入,文本是老师给的标准数据。
3、输入及输出格式(1):输入格式:A:图的初始数据输入数据的初始化是需要从文本中读入的,所以不需要有专门的文本输入函数,只需要给出读文本的函数input();使用input()函数从测试数据的三个文本中读入数据,然后使用创建图的函数CreateGraph()创建起整个图。
初始数据的读入,分别是从station.txt中读入每个城市站点的名称的城市编号,从iinformation.txt中读入每个城市间的铁路信息,从railway.txt中读入所有铁路线的信息。
如:以下从station.txt中节选部分0 北京1 广州2 石家庄3 郑州4 武汉5 长沙以下从information.txt中节选部分出发城市编号到达城市编号车次里程费用出发时刻到达时刻0 2 1000 287 62.5 0000 02460 2 1016 287 72 0060 02750 8 1001 137 23.5 0000 01170 8 1017 137 28.5 0060 01630 13 1002 1199 156.5 0000 10281 6 1008 1257 162.5 0000 1077以下从railway.txt中节选部分各条铁路线上城市编号(此行可去掉)京广线0 2 3 4 5 6 1京九线0 13 14 12京沪线0 8 9 10 11 7陇海线18 10 3 20 24 19B:用户要求输入用户在使用本程序时,会要求用户输入各种数据,如城市编号id、抉择选项y/n等;用户只需要按照程序菜单的要求输入即可。
如城市编号id就是初始化数据(文本数据)中每个城市就有的编号,用户在不知道城市编号之前先查看一下城市信息就可以清楚明了的知道城市id了。
(2):输出格式在系统的管理下,为了用户的查询方便,需要有多重输出方式。
如每条铁路线上信息的输出。
这里面就包括了,在每条铁路上所有车次信息,每个车次始发站信息、过站信息和终点站信息。
样例如下:兰新线中有以下车次:1005次列车运行情况:出发城市到达城市车次距离(km) 出发时间到达时间费用(元)兰州酒泉1005 748 0:0 10:41 102酒泉乌鲁木齐1005 797 10:51 22:14 152.5乌鲁木齐阿拉山口1005 477 22:24 5:13 64.51013次列车运行情况:出发城市到达城市车次距离(km) 出发时间到达时间费用(元)阿拉山口乌鲁木齐1013 477 0:0 6:49 64.5乌鲁木齐酒泉1013 797 6:59 18:22 152.5酒泉兰州1013 748 18:32 5:13 102对于每个城市信息的输出,只需要输出经过每个城市的铁路新路即可,当然必须得输出城市站点的id,方便用户的查询和管理样例如下:城市编号城市名称过站铁路线0 北京京广线京九线京沪线1 广州京广线2 石家庄京广线3 郑州京广线陇海线4 武汉京广线5 长沙京广线6 株洲京广线沪昆线7 上海京沪线沪昆线二、概要设计1.数据特性分析(1):整体结构分析铁路交通咨询模拟系统管理的是全国的各个城市间的铁路信息。
对于整体的全国铁路信息来说,每一个城市站点就是一个顶点节点,城市与城市之间的每一个车次信息就是一条有向边。
所有整个咨询系统应该是一个有向图结构。
从A城市出发到B城市,可能会有多个车次。
如下例:出发城市到达城市车次距离(km) 出发时间到达时间费用(元)北京石家庄1000 287 0:0 4:6 62.5北京石家庄1016 287 1:0 4:35 72所以每两个城市顶点之间就可能会有多条有向边,所以这个图也不会是一个有向简单图了。
为了城市节点能够动态的扩充和删除不受影响,我对于顶点的储存采用链表结构不使用顺序表结构,定义一个顶点链表类VertexList。
这样,虽然链表查询和其节点的删除的时间复杂度受到了一定的影响,但这样设计出来的铁路网图才更具有一般性个实用性。
对于查找的时间复杂度问题的解决,我在后面也会给出方案。
(2):城市顶点分析对于每一城市来说,在全国的铁路网中,它就是一个火车站节点。
每一个火车,它都应该会有自己的名字,过站的铁路线等。
为了咨询系统管理和维护的方便,在文本数据中,我们就人为的给每一个城市都编上序号id,每一个不同id对应了一个不同的城市节点。
由于每个城市的id都是唯一的,所以在顶点的链表结构里面,完全可以定义一个哈希表haxi[n],对于haxi[i]来说,它存储的就是id为i的城市在内存中地址。
这样,顶点链表在哈希表的支持下,就能完美解决查找、添加、删除的时间复杂度问题了。
在整个铁路网中,每一个城市就是顶点,每一个顶点,就是应该有一个边链表用于储存此城市能到达所有城市的各个不同车次的信息,也就是各个不同的边。
如:出发城市编号到达城市编号车次里程费用出发时刻到达时刻0 2 1000 287 62.5 0000 02460 2 1016 287 72 0060 0275从上例我们可以看出,对于每个顶点的不同边来说,每一个不同的边就有一个独有的车次。
所以这样,对于边的储存,我们也可以采用哈希表结构。
经观察发现,每一车次都大于1000,所以,哈希表的id=车次-1000;对于编号为a的城市节点haxi[k]来说,它储存的是为城市a中车次为:1000+k的一条边,边里面就有到达城市、出发和到达时间、费用、距离等等。
(3):边数据分析对于图来讲,边就是一个逻辑结构,沟通顶点与顶点之间的关系。
同时了,边还有其物理特性。
他需要储存边的权值等,它需要开辟储存空间来存储数据。
在铁路网中,每两个城市之间不同的车次信息就是一条不同的边,所以,我需要把物理特性给单独列出来,成为一个类LineInformation,用于表示边的物理信息。
对于图中抽象的边,也需要定义一个类EdgeNode,用于沟通图中原本孤立的顶点,使之变成一个完整的图2.整体概要设计前面,我提到了有顶点类station、顶点链表类VertexList、边的物理类LineInformation 和边的逻辑类EdgeNode、火车线路类railway;对于整个完整的图类来说,还有两个主要的类没有提及,那就是图类RailwayNet和管理图类的类management。
当然对于图中需要完成各个不同功能的时候,我还写了许多的辅助类。
如查找两个车站之间所有路径时需要用到的LinStack,当然还有LinStack的类的基石StackNode类。
整个咨询系统还有许多的结构体,这些结构体的功能我就不一一叙述了,详细可见源代码的注释。
下面我就列出各个类的关系图三.储存结构设计1、存储结构的确定数据结构的目的是有效组织和处理数据。
为了有效组织和处理数据,先要分析多项式操作的特点和指针所占空间比例,然后确定最优的存储结构。
1.铁路网是由铁路和火车站构成,每个火车站相当于一个定点,每新建一条铁路就相当于新建定点之间的边2.车站之间可以任意到达,可直接相连,也可以间接相连,且怎么连接是不固定的。
3. 综上所述,资源管理器的存储结构采用树形结构。
2、类的结构设计图:management类图:RailWay类图:VertexList类图:RailWay类图:LineInformation类图:EdgeNode结构图:Station类图;四、详细设计1.管理类managementclass management{private:vector<station> m_city;vector<LineInformation> m_edge;vector<railway> m_rail;RailwayNet m_graph;public:void input();void VertexDisplay();//边的输出函数,输出一条边的信息void EdgeDisplay(EdgeNode *edge);//输出函数,被 RailwayDisplay()调用void NextDisplay(EdgeNode* edge, LinStack<int> & UsedTrainNumber, int a);void RailwayDisplay();void SearchStation();void SearchRail();void EditStation();void EditRail();void EditInformation();void ShortestCost();void ShortestTime();void SearchAll(vector<time_and_cost_path> & AllPath);void PathDispaly(vector<LineInformation> & path);void OrderOnCost();void OrderOnTime();2.图类RailwayNet//全国铁路信息网类(邻接表图类)class RailwayNet{private:VertexList vertex; //顶点链表vector<railway> m_rail;//私有的函数,以深度优先遍历的方式寻找两点之间的所有路径void DepthFirstSearchPath(vector<time_and_cost_path> & pa, time_and_cost_path & p, EdgeNode *edge, int terminal, LinStack<int> & UsedVertex);//私有函数,以Dijkastra算法寻找最节省时间的路径void ShortestCost(vector<LineInformation> & OptimalPath, int origin, int terminal);// 获取起点origin到终点terminal的最少用时void ShortestTime(int origin, int terminal);void ShortestTime2(vector<LineInformation> & OptimalPath, int origin, int terminal);//快速排序void QuickSort(vector<time_and_cost_path> & AllPath, int low, int high, int option); public:VertexList & Vertex(){ return vertex; }vector<railway> & GetRail(){ return m_rail; }//插入顶点void InsertVertex(station* s);//在顶点v1和v2之间插入一条边( 边的起点为v1,终点为v2 )void InsertEdge(int v1, int v2, EdgeNode* & ed);//删除编号为id的城市顶点void DeleteVertex(int id);//删除边edgevoid DeleteEdge(int v1, int v2);//创建一个邻接表图void CreateGraph(RailwayNet & graph, vector<station> & city, vector<LineInformation> & edge, vector<railway> & rail);//输出图void display(RailwayNet & graph);//返回顶点v1和v2的第一条边EdgeNode* const GetFirstEdge(int v1, int v2);//获取起点origin到终点terminal的最少费用float GetShortestCost(int origin, int terminal, LineInformation & edge);//获取边路径path中的用时int GetPathTime(vector<LineInformation> & path);//获取边路径path中的费用float GetPathCost(vector<LineInformation> & path);//对vector中的元素按照要求排序【option为 1 表示以最省钱方式,为 2 表示以最省时方式】void Sort(vector<time_and_cost_path> & AllPath, int option);//求点origin到terminal的所有路径void GetAllPath(vector<time_and_cost_path> & AllPath, int origin, int terminal);//求点origin到terminal的最短“路径”(路程最短或时间最省)【使用Dijkastra算法】void BestOption(vector<LineInformation> & OptimalPath, int option, int origin, int terminal);};3.顶点链表类//顶点链表类class VertexList{private:station *head; //头指针int size; //链表的大小(元素的个数)station* haxi[1000]; //哈希表,内存有节点的地址(哈希表中的下标与对应城市节点的ID 相等)public:VertexList();~VertexList();station* & GetHead(){ return head; }int & GetSize(){ return size; }//按照id从小到大的顺序将city插入链表中void insert(station* city);//删除城市编号为id的节点void Delete(int id);//根据城市的id获取城市节点station* GetVertex(int id);station** GetVertexHaxi(){ return haxi; }int IsVertexExist(int id);};4.顶点类class station{private:string m_name;int m_id;vector<string> m_rail;station* prior; //指向上一个车站station *next; //指向下一个车站EdgeNode *head; //指向第一条边节点int m_size; //边链表的大小EdgeNode* haxi[100]; //以此车站为始发站的边的哈希表(下标为:车次-1000)vector<HAXI> ha2; //以此车站为终点的边在其哈希表中的下标public:station();//默认构造函数station(string na, int i);//构造函数station(const station & sta);//复制构造函数void Delete();//删除函数//接口函数string & GetName(){ return m_name; }int & GetId(){ return m_id; }vector<string> & GetRail(){ return m_rail; }station* & GetPrior(){ return prior;}station* & GetNext(){ return next; }EdgeNode* & GetHead(){ return head; }int & GetSize(){ return m_size; }EdgeNode** GetHaxi(){ return haxi; }vector<HAXI> & GetHa(){ return ha2; }};5.边节点类EdgeNode//边结点结构体struct EdgeNode{LineInformation information;EdgeNode *next; //下一个边结点EdgeNode *prior; //上一个边节点};6.边物理类LineInformationclass LineInformation{private:int m_DepartId; //出发城市编号int m_ArriveId; //到达城市编号int m_TrainNumber; //车次int m_distance; //车程float m_cost; //费用int m_DepartTime; //出发时间int m_ArriveTime; //到达时间public://默认构造函数 int DepartId=0, int ArriveId=0,LineInformation(int DepartId = 0, int ArriveId = 0, int Train = 0, int distance = -1, float cost = 0, int DepartTime = -1, int ArriveTime = -1);//复制构造函数LineInformation(const LineInformation & l);~LineInformation(){};LineInformation operator=(const LineInformation& e);//接口函数int & GetDepartTime(){ return m_DepartTime; }int & GetArriveTime(){ return m_ArriveTime; }int & GetTrainNumber(){ return m_TrainNumber; }int & GetDepartId(){ return m_DepartId; }int & GetArriveId(){ return m_ArriveId; }int & GetDistance(){ return m_distance; }float & GetCost(){ return m_cost; }};7.火车线路类railwayclass railway{private:string m_name; //火车线名vector<int> m_station; //线路进过的火车站的idpublic:railway(string s = " ") :m_name(s){}string & GetName();vector<int> & GetStation();void Delete(int a);};8.自定义栈类template <class T> class LinStack; //前视定义,否则友元无法定义template <class T> //模板类型为Tclass StackNode{friend class LinStack<T>; //定义类LinStack<T>为友元private:T data; //数据元素StackNode<T> *next; //指针public://构造函数1,用于构造头结点StackNode(StackNode<T> *ptrNext = NULL);//构造函数2,用于构造其他结点StackNode(const T& item, StackNode<T> *ptrNext = NULL);~StackNode(){};};template <class T>class LinStack{private:StackNode<T> *head; //头指针int size; //数据元素个数public:LinStack(void); //构造函数~LinStack(void); //析构函数void Push(const T& item); //入栈T Pop(void); //出栈T GetTop(void)const; //取栈顶元素int NotEmpty(void) const; //堆栈非空否bool IsInStack(T a); //判断元素a是否在栈中void Empty(); //清空栈int GetSize(); //获取栈中元素的个数void display(); //输出栈中元素};五、用户手册1.本程序运行在Windows操作系统下,VS2013,按F7编译,F5运行。