全国交通咨询模拟程序设计
全国交通咨询模拟系统C实现课程设计报告

全国交通咨询模拟一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。
得到软件设计技能的训练。
二、问题描述交通咨询模拟。
根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。
旅途用火车或飞机作为交通工具。
用计算机编制程序,为旅客提供两种最优决策的交通咨询系统。
三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的两种交通工具:飞机和火车。
对飞机航班和列车时刻表进行编辑:里程、航班和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;4、旅途中的耗费的总时间应包括中转站的等候时间。
其中飞机至少二小时,火车至少一小时;5、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟班机或列车何时到达何地。
四、实现提示1、算法思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里建议采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案

while(p->next!=NULL) p=p->next; if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)) { printf(“参数不合法”); return ERROR; } else { p=L; while(p->next-data<=mink) p=p->next; while(q->data<maxk) { p->next=q->next; free(q); q=p->next; } return OK; } } 9、算法如下: int Dele(Node *S) { Node *p; P=s->next; If(p= =s) {printf(“只有一个结点,不删除”); return 0; } else {if((p->next= =s) {s->next=s; free(p); return 1; } Else { while(p->next->next!=s)
ve(6)=16, ve(7)=19, ve(8)=21, ve(9)=23 每个事件的最晚发生时间:: vl(9)=23, vl(8)=21, vl(7)=19, vl(6)=19, vl(5)=16, vl(4)=15, vl(3)=12, vl(2)=6, vl(1)=9, vl(0)=0 (2)每个活动的最早开始时间: e(0,1)=0, e(0,2)=0, e(1,3)=5, e(2,3)=6, e(2,4)=6, e(3,4)=12, e(3,5)=12, e(4,5)=15, e(3,6)=12, e(5,8)=16, e(4,7)=15, e(7,8)=19, e(6,9)=16, e(8,9)=21 每个活动的最迟开始时间: l(0,1)=4, l(0,2)=0, l(1,3)=9, l(2,3)=6, l(2,4)=12, l(3,4)=12, l(3,5)=12, l(4,5)=15, l(3,6ห้องสมุดไป่ตู้=15, l(5,8)=16, l(4,7)=15, l(7,8)=19, l(6,9)=19, l(8,9)=21 (3)关键路径如下图所示:
全国交通咨询模拟系统源代码

12050741班(郭晓湛,李佳豪,廖川,杨鹤)课题:全国交通系统咨询模拟源程序代码:#include <windows.h>#include <stdio.h>#include <string.h>#include <vector>#include<iostream>#include <malloc.h>#define INF 65535 //定义一个最大数定为无穷值#define MAX 23using namespace std;static int c_number=10;static int k=0;static int v=0,z=0,r=0,t=0;typedef struct search{int c_transer;int c_cost;int c_time;int f_cost;int f_time;}search;search m[20],x[20],n[20];typedef int costAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数int Path[MAX+1][MAX+1];//图邻接矩阵从1开始记数typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG; //图的定义typedef struct c_edit{char a[10];}c_edit;c_edit add[10];costAdj B,L;//定位函数,输出城市列表,增添城市。
int pr(int i,int j){int h=0;if (j==0){h=i;}else if (j==1){cin>>add[i].a;}switch(h)//运用switch语句。
{case(0):cout<<"";break;case(1) : cout<<"成都 ";break; case(2) : cout<<"西安 ";break; case(3) : cout<<"郑州 ";break; case(4) : cout<<"武汉 ";break; case(5) : cout<<"株洲 ";break;case(6) : cout<<"贵阳 ";break;case(7) : cout<<"柳州 ";break;case(8) : cout<<"广州 ";break;case(9) : cout<<"南宁 ";break;case(10) : cout<<"徐州 ";break;default:cout<<add[i-10].a;}return 1;}//输出城市列表及相应代码void pri(){int i;cout<<" 城市及其代码"<<endl<<endl<<endl;cout<<"****************************"<<endl; for (i=1;i<=c_number;i++){cout<<i<<".";pr(i,0);}cout<<endl<<"***********************"<<endl<<endl<<endl< <endl<<endl<<endl;}//构造带权(费用)图返回首地址G:unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能{unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G 分配存储空间。
数据结构课程设计交通咨询系统设计

信息科学与工程学院课程设计任务书题目:交通咨询系统设计学号: 201112220141姓名:年级:专业:计算机应用与技术课程:数据结构指导教师:职称:完成时间:课程设计任务书及成绩评定一、需求分析设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。
对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。
本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。
1.1.1建立图的存储结构邻接矩阵是表示图形中顶点之间相邻关系的矩阵。
图的邻接矩阵是定义如下的n 阶方阵:设G=(V ,E )是一个图,结点集为{}n v v v V ,,,21 =。
G 的邻接矩阵,E,,0E,,)(,)(⎪⎩⎪⎨⎧>∉<∞>∈<==⨯⨯j i j i j i j i n n j i ij n n ij v v v v v v v v w a a A )或当(,或)或当(, 当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。
图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n 个元素的一维数组来存储顶点信息,其中下标为i 的元素存储顶点i 的信息。
因此,图的邻接矩阵的存储结构定义如下:1.1.2 单源最短路径最短路径的提法很多。
在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点S ∈V 到G 中其余各顶点的最短路径。
为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。
那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra )提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。
迪杰斯特拉算法求最短路径的实现思想是:设G=(V ,E )是一个有向图,结点集为,}v ,,v ,{v V n 21⋯=,cost 是表示G 的邻接矩阵,cost[i][j]表示有向边<i,j>的权。
(完整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.1程序的功能在交通网络非常发达的今天,人们出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也很感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统,能让旅客咨询从任一个城市顶点到达另外一个城市顶点之间的最短路径(里程)的问题,或者任意两个城市之间的最短路径问题。
这样可以极大地方便旅客。
1.2输入输出的要求在本程序里定义了一个EdgeType类,包括一个整型类型iDistanee的成员;一个city结构体,包括了整型的Number和字符型的*Name成员;还定义了一个AdjMatrix类,包含了一些公有函数,如:int GetVexNum();〃取得交通图的城市个数,void ShowRouteLength();/向用户显示路程长度,void Dijkstra(int v,int dist[],int path[]) ;//在图结构中求一个点到其他点的最短长度;也包含了四个私有成员数据:int iVexNum;//顶点数,即城市个数,int iEdgNum;//边数,即城市间的路线,City city[MaxValue];〃图的顶点,即城市,EdgeTypeRoute[MaxValue][MaxValue];〃各边的权值,即路程。
从以上定义可以看出本程序的输入输出主要采用整型和字符串型的数据类型。
二、功能模块的划分2.1存储交通信息网模块在该系统中要求管理人员在旅客使用前先建立一个城市交通信息网,并保存以方便旅客的使用。
2.2查询一个城市到其他城市的路径模块图图(2)任意两个城市之间路径查询模块图2.4整个系统程序模块图图(3)整个系统查询模块图2三、主要功能的实现3.1.1城市交通咨询系统的流程图图(4)城市交通咨询系统的流程图在本系统中设置了三个模块分别为:管理员模块:这个模块包含了创建城市交通信息网,它是这个程序往下运行的前提。
最新全国交通咨询模拟程序设计资料
全国交通咨询模拟程序设计设计人:啊目录一、绪论 (1)二、实验实现功能 (2)三、概要设计 (2)四、详细设计 (3)五、程序 (10)六、运行结果 (54)七、小结 (56)一、绪论1、设计题目:全国交通咨询模拟2、设计目的1、掌握C语言中对文件的操作方法,巩固结构体数据的定义和使用方法2、进一步熟悉图的定义、存储方法、遍历、最小生成树的相关知识,灵活利用图的相关知识解决现实生活中的实际问题。
3、需求分析1、提供对城市信息进行编辑(如:添加或删除)的功能。
2、城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
3、提供两种最优决策:最快到达和最省钱到达。
全程只考虑一种交通工具4、旅途中耗费的总时间应该包括中转站的等候时间。
4、概要设计1、设计一个类,包含城市、航班、列车的信息,并能对其进行添加或删除操作2、用户咨询系统包括城市、列车、航班信息,根据用户选择不同使用不同指针指向程序3、设计一个函数,能够提供时间、费用、中转(任意一个)在最少的情况下的信息二、实现功能功能结构图如下:三、概要设计系统用到的抽象数据类型定义:1).ADT Graph{数据对象V:一个集合,该集合中的所有元素具有相同的特性数据关系R:R={VR}VR={<x,y>|P(x,y)^(x,y属于V)}基本操作:(1)initgraph(&G);(2)CreateGraph(&G);(3)EnterVertex(&G);(4)DeleteVertex(&G);(5)EnterplaneArc(&G);(6)DeleteplanArc(&G);(7)EntertrainArc(&G);(8)DeletetrainArc(&G);}ADT Graph2).ADT LinkQueue{数据元素:可以是任意类型的数据,但必须属于同一个数据对象关系:队列中数据元素之间是线性关系。
C++数据结构-全国交通咨询模拟报告
数据结构课程设计报告班级:195182学号:20181003991姓名:钟欢日期:2019.12一、课程设计题目与要求1.课程设计题目:全国交通咨询模拟2.问题描述:出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
3.基本要求:3.1提供对城市信息进行编辑(如添加或删除)的功能。
3.2城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增加或删除)的功能。
3.3提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
3.4旅途中耗费的总时间应该包括中转站的等候时间。
3.5咨询以用户和计算机的对话方式进行。
二、需求分析1.问题描述搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。
需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。
2.程序的功能:2.1维护功能:2.1.1航班操作2.1.2列车操作2.1.3更改密码2.2咨询功能2.2.1选择出行交通工具2.2.2选择要查询的信息:○1查询花费最小的路径○2查询耗时最短的路径2.2.3进行进一步的输入得到所需要的结果三、设计1.设计思想1.1数据结构设计1.1.1逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。
全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。
城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。
数据结构课程设计题目
数据结构课程设计题⽬《数据结构》课程设计题⽬1. 排序算法的性能分析问题描述设计⼀个测试程序,⽐较⼏种内部排序算法的关键字⽐较次数和移动次数以取得直观感受。
基本要求(1)对冒泡排序、直接排序、选择排序、箱⼦排序、堆排序、快速排序及归并排序算法进⾏⽐较。
(2)待排序表的表长不⼩于100,表中数据随机产⽣,⾄少⽤5组不同数据作⽐较,⽐较指标:关键字参加⽐较次数和关键字的移动次数(关键字交换记为3次移动)。
(3)输出⽐较结果。
选做内容(1)对不同表长进⾏⽐较。
(2)验证各算法的稳定性。
(3)输出界⾯的优化。
2. 排序算法思想的可视化演⽰—1基本要求排序数据随机产⽣,针对随机案例,对冒泡排序、箱⼦排序、堆排序、归并算法,提供排序执⾏过程的动态图形演⽰。
3. 排序算法思想的可视化演⽰—2基本要求排序数据随机产⽣,针对随机案例,,对插⼊排序、选择排序、基数排序、快速排序算法,提供排序执⾏过程的动态图形演⽰。
4. 线性表的实现与分析基本要求①设计并实现线性表。
②线性表分别采取数组(公式化描述)、单链表、双向链表、间接寻址存储⽅式③针对随机产⽣的线性表实例,实现线性表的插⼊、删除、搜索操作动态演⽰(图形演⽰)。
5. 等价类实现及其应⽤问题描述:某⼯⼚有⼀台机器能够执⾏n个任务,任务i的释放时间为r i(是⼀个整数),最后期限为d i(也是整数)。
在该机上完成每个任务都需要⼀个单元的时间。
⼀种可⾏的调度⽅案是为每个任务分配相应的时间段,使得任务i的时间段正好位于释放时间和最后期限之间。
⼀个时间段不允许分配给多个任务。
基本要求:使⽤等价类实现以上机器调度问题。
等价类分别采取两种数据结构实现。
6. ⼀元稀疏多项式计算器问题描述设计⼀个⼀元稀疏多项式简单计算器。
基本要求⼀元稀疏多项式简单计算器的基本功能是:(1)输⼊并建⽴多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,c n,e n,其中n是多项式的项数,c i,e i,分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相加,建⽴多项式a+b;(4)多项式a和b相减,建⽴多项式a-b;(5)计算多项式在x处的值;(6)计算器的仿真界⾯(选做)7. 长整数的代数计算问题描述应⽤线性数据结构解决长整数的计算问题。
数据结构课程设计-全国交通咨询模拟系统 程序设计 源代码
数据结构课程设计-全国交通咨询模拟系统程序设计源代码一、程序界面A.关于程序1. 该程序以C语言为开发工具,运行该程序前请确保你地机器上已安装tc或turboc ,否则系统会提示:BGI Error: Graphics not initialized (use 'initgraph'>而无法使用该程序.遇到此情况请安装tc ,建议将其安装到C:目录下,以确保程序运行万无一失.2. 该软件完全支持鼠标,请放心使用.3. 该程序能将您输入地城市转换为象素坐标,显示在屏幕上,操作直观方便,选择城市时,用时标一点该城市即可,省去了输入地麻烦.如果您选择地两个城市间有路径地话,程序除了给您信息输出外,还会在地图上将此路径以不同颜色画出,更加直观.4. 该程序附带三个数据文件(num.txt,vex.txt,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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国交通咨询模拟程序设计设计人:啊目录一、绪论 (1)二、实验实现功能 (2)三、概要设计 (2)四、详细设计 (3)五、程序 (10)六、运行结果 (54)七、小结 (56)一、绪论1、设计题目:全国交通咨询模拟2、设计目的1、掌握C语言中对文件的操作方法,巩固结构体数据的定义和使用方法2、进一步熟悉图的定义、存储方法、遍历、最小生成树的相关知识,灵活利用图的相关知识解决现实生活中的实际问题。
3、需求分析1、提供对城市信息进行编辑(如:添加或删除)的功能。
2、城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
3、提供两种最优决策:最快到达和最省钱到达。
全程只考虑一种交通工具4、旅途中耗费的总时间应该包括中转站的等候时间。
4、概要设计1、设计一个类,包含城市、航班、列车的信息,并能对其进行添加或删除操作2、用户咨询系统包括城市、列车、航班信息,根据用户选择不同使用不同指针指向程序3、设计一个函数,能够提供时间、费用、中转(任意一个)在最少的情况下的信息二、实现功能功能结构图如下:三、概要设计系统用到的抽象数据类型定义:1).ADT Graph{数据对象V:一个集合,该集合中的所有元素具有相同的特性数据关系R:R={VR}VR={<x,y>|P(x,y)^(x,y属于V)}基本操作:(1)initgraph(&G);(2)CreateGraph(&G);(3)EnterVertex(&G);(4)DeleteVertex(&G);(5)EnterplaneArc(&G);(6)DeleteplanArc(&G);(7)EntertrainArc(&G);(8)DeletetrainArc(&G);}ADT Graph2).ADT LinkQueue{数据元素:可以是任意类型的数据,但必须属于同一个数据对象关系:队列中数据元素之间是线性关系。
基本操作:(1)InitQueue(&Q);(2)IsEmpty(&Q);(3)EnterQueue(&Q,x);(4)DeleteQueue(&Q,&y);}ADT LinkQueue3).ADT TimeTree{数据对象D:一个集合,该集合中的所有元素具有相同的特性数据关系R:若D为空,则为空树。
若D中仅含有一个数据元素,则R为空集,否则R={H},H为如下二元关系:(1)在D中存在唯一的称为根的数据元素root,它在关系H中没有前驱(2)除root以外,D中每个结点在关系H下有且仅有一个前驱。
基本操作:(1)CreateTimeTree(p,i,j,&Q,infolist arcs);(2)CopyTimeTree(p,q);(3)VisitTimeTree(p);}ADT TimeTree四.详细设计1.创建交通图算法的伪码描述如下:int LocateVertex(ALGaph *G,char *v)/*找出城市名在图中对应结点位置*/{for(k=0;k<图G中的结点个数G->vexnum;k++)if(第k个结点中的城市名与传过来的城市名相同){j=k;/*记录位置*/break;}}返回k 的数值;}int CreatGraph(ALGraph *G){if(打开城市文件,文件指针返回值为空){输出错误文件信息;程序返回值为0;}while(文件不为空){将文件指针所指的字符串读到城市名数组 city[i]中; i++;}关闭文件;j=0;while(j<城市个数){将 city[i] 中的内容复制到图的结构体的结点数组中;图的结构体其他项负初值;j++;}G->vexnum=i;打开航班信息文件"plane.txt";将文件中的内容以块为单位读到缓冲区数组a中;关闭文件;]a的计数变量k=0;弧的计数变量 arc_num=0;while(k<信息个数){调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i;调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 j; q=G->vertices[i].planfirstarc;m=0;while(q!=NULL){if( 弧 q中的邻接顶点与j相等){将数组a[i] 中的内容都复制到弧q中;m=1;break;}q=q->nextarc;if(m=0);{开辟一个弧结点;将数组a[i]中的内容都复制到新的弧结点中;将弧结点连接到适当的位置中去;arc_num++;}k++;}G->planarcnum=arc_num;打开列车信息文件"plane.txt";将文件中的内容以块为单位读到缓冲区数组a中;关闭文件;]a的计数变量k=0;弧的计数变量 arc_num=0;while(k<信息个数){调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i;调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 j; q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if( 弧 q中的邻接顶点与j相等){将数组a[i] 中的内容都复制到弧q中;m=1;break;}q=q->nextarc;if(m=0);{开辟一个弧结点;将数组a[i]中的内容都复制到新的弧结点中;将弧结点连接到适当的位置中去;arc_num++;}k++;}G->trainarcnum=arc_num;返回;}2.创建航班算法的伪码描述如下:creatplanefile(){while(flag) /*flag为标志位,初值为1*/{ 提示“输入航班信息”;输入航班code;输入航班的出发城市vt;输入航班的到达城市vh;输入机票价格money;输入航班的出发时间bt;输入航班的到达时间at;a.[count].co=code; /* a 为程序头部定义的结构体*/strcpy(a.[count].vt,vt);strcpy(a.[count].vh,vh);a.[count].bt=bt;a.[count].at=at;a.[count].mo=money;计数值count+1;提示“是否要继续输入航班信息:”;scanf(“%d”,&flag);}if(航班文件不能以读写形式打开)提示“无法打开文件”;将计数值count写入航班车文件;for(i=0;i<count;i++)if(无法将a[i]写入航班文件)提示“文件无法写入”;关闭航班文件;}3.删除城市结点算法的伪码描述如下:DeleteVertex(ALGraph *G) /* G是程序头部定义的结构体*/{提示“输入删除城市名”;gets(城市名:v);提示“是否确定要删除(Y/N)“;c=getchar();if(c==’Y’||c==’y’){n=0; /*0是记数标志,控制循环次数*/ while(n<图G表头接点总个数&&图G的存储城市名与v不同) /*G表头结点总个数比实际大1*/记数值n+1;if(n = =图G表头结点总个数)提示“无法找到此城市“;else{i=LocateVertex(G,v);/*利用G函数找到此城市名所处在G中位置*/删除从此结点出发的所有航班弧;删除从此结点出发的所有列车弧;for(j=i;j<图G表头结点总个数-1;j++)将G第j个结点的信息依前移1位;将G第j个结点的信息制空;/*以下是删除所有指向此结点的航班弧*/for(k=0;k<图G表头记点总个数-1;k++){p指向图G中k结点的第一条飞机弧;while(p!=NULL){ if(该弧指向的顶点位置(p->adjvex )>i){将该弧指向顶点位置-1;q=p;p指向下一条飞机弧;else if(该弧指向的顶点位置(p->adjvex )= = i){if(p指向图G中k结点的第一条飞机弧){ m=p;将图G中k结点的第二条飞机弧改为第一弧;p指向下一条飞机弧;释放(m);}else{ 将p的下一条弧赋给q的下一条弧;m=p;p指向下一条飞机弧;释放(q);}}else{q=p;p指向下一条飞机弧;}}}/*以下是删除所有指向此结点的列车弧*/for(k=0;k<图G表头记点总个数-1;k++){p指向图G中k结点的第一条列车弧;while(p!=NULL){ if(该弧指向的顶点位置(p->adjvex )>i){将该弧指向顶点位置-1;q=p;p指向下一条列车弧;}else if(该弧指向的顶点位置(p->adjvex )==i){if(p指向图G中k结点的第一条列车){ m=p;将图G中k结点的第二条列车弧改为第一弧;p指向下一条列车弧;释放(m);}else{ 将p的下一条弧赋给q的下一条;m=p;p指向下一条列车弧;释放(q);}}else{q=p;p指向下一条列车弧;}}}}图G表头结点总个数-1;}else return;}4.求城市v0,v1之间的最少费用算法的伪码描述如下:ExpenditureDispose( ){for(v=0;v<城市个数;v++){城市v还未求得最少费用;*(D+v)=城市v0到v的最少费用;将城市v的路径设置为空;if(*(D+v)<INFINITY)将城市v0和v加入到城市v的路径中;}城市v0到城市v0的最少费用为0;城市v0设为已求得最少费用;for(i=1;i<城市个数;v++){m=INFINITY;for(w=0;w<城市个数;w++)if(城市w未求得最少费用)if(*(D+w)<m){v=w;m=*(D+w);}if(v等于v1){根据城市v的路径输出从城市v0到城市v1所需经过的城市及路线;输出最少费用*(D+v1);返回;}else{将城市v设为已求得最少费用;for(w=0;<G.vexnum;w++)if(城市w未求得最少费用并且从城市v到w有路径){求出从城市v到城市w的最少费用及路线;if(*(D+w)>m+城市v到w的最少费用){*(D+w)=m+城市v到w的最少费用;将城市w的路径改成城市v的路径并在最后加入城市w;}}}输出没有列车或飞机从城市v0到v1;}5.最少中转次数算法的伪码描述如下:求城市v0到城市v1的最少中转次数TransferDispose( ){for(v=0;v<G.vexnum;v++){城市v设为未访问;城市v的路径设为空;}将城市v0设为已访问;将城市v0入队;while(队列不空){队首城市v出队;w为与城市v相连的第一个城市;while(w存在){if(城市w未访问){将城市w设为已访问;将城市w的路径改为城市v的路径并在最后加入城市w;if(w等于v1){根据城市w的路径输出从城市v0到城市v1所需经过的城市及路线;返回;}将城市w入队;}w等于城市v相连的下一个城市;}}输出没有列车或飞机从城市v0到v1;}6.求城市v0,v1之间的最少时间算法的伪码描述如下:TimeDispose( ){for(v=0;v<城市个数;v++){城市v还未求得最少时间;*(D+v)=城市v0到v的最少时间;将城市v的路径设置为空;if(*(D+v)<INFINITY)将城市v0和v加入到城市v的路径中;}城市v0到城市v0的最少时间为0;城市v0设为已求得最少时间;for(i=1;i<城市个数;v++){m=INFINITY;for(w=0;w<城市个数;w++)if(城市w未求得最少时间)if(*(D+w)<m){v=w;m=*(D+w);}if(v等于v1){根据城市v的路径输出从城市v0到城市v1所需经过的城市及路线;输出最少时间v1;返回;}else{将城市v设为已求得最少时间;for(w=0;<G.vexnum;w++)if(城市w未求得最少时间并且从城市v到w有路径){保存城市w原来的路径;将城市w的路径设为城市v的路径并在最后加入城市w;利用时间树求出从城市v0城市w的最少时间及路径;if(*(D+w)>从城市v0到城市w的最少时间)*(D+w)=从城市v0到城市w的最少时间;else将城市w的路径还原;}}}}输出没有列车或飞机从城市v0到v1;}五、程序:#include"stdio.h"#include"stdlib.h"#include"string.h"#define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include"stdio.h"#include"stdlib.h"#include"string.h"#define False 0#define True 1#define INFINITY 10000typedef struct{int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct{Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode{char cityname[10];ArcNode *planefirstarc,*trainfirstarc; }VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,planearcnum,trainarcnum;}ALGraph;typedef struct Node{int adjvex;int route;struct Node *next;}Node;typedef struct QNode{int adjvex;struct QNode *next;}QNode;typedef struct{QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode{int adjvex;int route;int begintime[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];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM];void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route); void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (*T)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]); void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);int main()/*显示程序功能选择界面*/{ALGraph G;int i;printf("请选择程序功能:\n");printf("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");printf("选择?");scanf("%d",&i);getchar();while(i!=4){switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");printf("选择?");scanf("%d",&i);getchar();}return 1;}void Administer(ALGraph *G)/*显示管理员管理项目选择界面*/{int i;printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);getchar();while(i!=5){ switch(i){case 1:initgraph(G); //初始化交通系统break;case 2:cityedit(G); //城市编辑break;case 3:flightedit(G); //飞机航班编辑break;case 4:trainedit(G); //列车车次编辑break;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);getchar();}}void initgraph(ALGraph *G) //初始化交通系统/*初始化交通系统方式选择界面*/{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择?");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile()/*创建城市名称文档*/{int i=0;int j;char flag='y';FILE *fp;printf("\n请输入城市名称的信息:\n");while(flag=='y'||flag=='Y'){printf("城市名称:");gets(city[i]);i++;printf("继续输入?(Y/N)");scanf("%c",&flag);getchar();}printf("\n");if((fp=fopen("city.txt","wb"))==NULL){printf("无法打开文件!\n");return;}for(j=0;j<i;j++)fprintf(fp,"%10s",city[j]);fclose(fp);}void createplanefile()/*创建飞机航班文档*/{int code,bt[2],at[2]; //code航班编号,bt出发时间,at到达时间 float money;int i;int count;char vt[10],vh[10],flag; //vt起始城市,vh目标城市FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n"); //提示"输入航班信息"printf("飞机航班编号:"); //输入航班codescanf("%d",&code);getchar();printf("起始城市:"); //输入航班的出发城市vtgets(vt);printf("目的城市:"); //输入航班的到达城市vhgets(vh);printf("航班费用:"); //输入机票价格moneyscanf("%f",&money);getchar();printf("起飞时间:"); //输入航班的出发时间btscanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:"); //输入航班的到达时间atscanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code; // a 为程序头部定义的结构体strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++; //计数值count+1printf("继续输入?(Y/N)"); //提示"是否要继续输入航班信息:"scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("plane.txt","wb"))==NULL) //航班文件不能以读写形式打开 printf("\n无法打开文件!\n"); //提示"无法打开文件"fprintf(fp,"%d",count); //将计数值count写入航班车文件for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) //无法将a[i]写入航班文件printf("\n文件写入错误!\n"); //提示"文件无法写入"fclose(fp); //关闭航班文件}void createtrainfile()/*创建列车车次文档*/{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目的城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code;strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;printf("继续输入?(Y/N)");scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("train.txt","wb"))==NULL)printf("\n无法打开文件!\n");fprintf(fp,"%d",count);for(i=0;i<count;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->vexnum;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 count1,count2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fopen("city.txt","rb"))==NULL) //打开城市文件,文件指针返回值为空{printf("\n无法打开文件!\n");return;}while(!feof(fp)) //文件不为空{fscanf(fp,"%10s",city[i]);i++;}fclose(fp); //关闭文件j=0;while(j<i){strcpy(G->vertices[j].cityname,city[j]);//将 city[i] 中的内容复制到图的结构体的结点数组中;G->vertices[j].planefirstarc=NULL; // 图的结构体其他项赋初值;G->vertices[j].trainfirstarc=NULL;j++;}G->vexnum=i;if((fp=fopen("plane.txt","rb"))==NULL)printf("\n无法打开文件!\n");k=0;fscanf(fp,"%d",&count1); //打开航班信息文件"plane.txt"while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); //关闭文件k=0; //a的计数变量k=0arc_num=0; //弧的计数变量 arc_num=0while(k<count1){i=LocateVertex(G,a[k].vt); //调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 ij=LocateVertex(G,a[k].vh); //调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 jq=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) //弧 q中的邻接顶点与j相等{t=q->st+1; // 将数组a[i] 中的内容都复制到弧q中q->info.stata[t].number=a[k].co;q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); //开辟一个弧结点p->adjvex=j; //将数组a[i]中的内容都复制到新的弧结点中p->info.stata[0].number=a[k].co;p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->st=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p; // 将弧结点连接到适当的位置中去 arc_num++;}k++;}G->planearcnum=arc_num;if((fp=fopen("train.txt","rb"))==NULL){printf("\n无法打开文件!\n");return;}k=0;fscanf(fp,"%d",&count2); //打开列车信息文件"plane.txt"while(k<count2){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<count2){i=LocateVertex(G,a[k].vt); // 调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 ij=LocateVertex(G,a[k].vh); // 调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 jq=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) //弧 q中的邻接顶点与j相等{t=q->st+1; //将数组a[i] 中的内容都复制到弧q中q->info.stata[t].number=a[k].co;q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); //开辟一个弧结点p->adjvex=j; //将数组a[i]中的内容都复制到新的弧结点中p->info.stata[0].number=a[k].co;p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; //将弧结点连接到适当的位置中去arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G)/*保存城市交通系统到相应的文档*/{int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(j<G->vexnum){strcpy(city[j],G->vertices[j].cityname);j++;}i=0;if((fp=fopen("city.txt","wb"))==NULL)printf("\n错误,无法打开文件!\n");while(i<G->vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].planefirstarc;while(q!=NULL){for(t=0;t<=q->st;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->info.stata[t].number;a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("plane.txt","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(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->vexnum;i++){q=G->vertices[i].trainfirstarc;while(q!=NULL){for(t=0;t<=q->st;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->info.stata[t].number;a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("train.txt","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){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("选择?");scanf("%d",&i);getchar();if(i==1)EnterVertex(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->vexnum){printf("\n错误!此城市已存在\n");return;}else{printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=G->vexnum;strcpy(G->vertices[i].cityname,v);G->vertices[i].planefirstarc=NULL;G->vertices[i].trainfirstarc=NULL;G->vexnum=i+1;save(G);}elsereturn;}}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->vexnum&&strcmp(G->vertices[n].cityname,v)!=0) //n<图G表头接点总个数&&图G的存储城市名与v不同,G表头结点总个数比实际大1n++; //记数值n+1if(n==G->vexnum) //n==图G表头结点总个数printf("\n错误!无法找到此城市!\n"); //提示"无法找到此城市"else{i=LocateVertex(G,v); //利用G函数找到此城市名所处在G中位置p=G->vertices[i].planefirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q); //删除从此结点出发的所有航班弧}p=G->vertices[i].trainfirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q); //删除从此结点出发的所有列车弧}for(j=i;j<G->vexnum-1;j++){strcpy(G->vertices[j].cityname,G->vertices[j+1].cityname); //将G 第j个结点的信息依前移1位G->vertices[j].planefirstarc=G->vertices[j+1].planefirstarc;G->vertices[j].trainfirstarc=G->vertices[j+1].trainfirstarc;}G->vertices[j].planefirstarc=NULL; //将G第j个结点的信息置空G->vertices[j].trainfirstarc=NULL;for(k=0;k<G->vexnum-1;k++) //以下是删除所有指向此结点的航班弧{p=G->vertices[k].planefirstarc;while(p!=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;p=p->nextarc; //p指向下一条飞机弧}else if(p->adjvex==i) //该弧指向的顶点位置(p->adjvex )== i{if(p==G->vertices[k].planefirstarc) //p指向图G中k结点的第一条飞机弧{m=p;G->vertices[k].planefirstarc=p->nextarc; //将图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->vexnum-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; //将该弧指向顶点位置-1q=p;p=p->nextarc; //p指向下一条列车弧}else if(p->adjvex==i) //该弧指向的顶点位置(p->adjvex)==i{if(p==G->vertices[k].trainfirstarc)//p指向图G中k结点的第一条列车{m=p;G->vertices[k].trainfirstarc=p->nextarc; //将图G中k结点的第二条列车弧改为第一弧p=p->nextarc;free(m);}else{q->nextarc=p->nextarc;m=p;p=p->nextarc;free(q);}}else{q=p;p=p->nextarc;}}}}G->vexnum--;save(G);}elsereturn;}void flightedit(ALGraph *G)/*飞机航班编辑项目选择界面*/{int i;// char q;printf("\n请选择飞机航班编辑项目:\n"); printf("1=新增航班\n2=删除航班\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph *G)/*列车车次编辑项目选择界面*/{int i;//char q;printf("\n请选择列车车次编辑项目:\n"); printf("1=新增车次\n2=删除车次\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G)/*增加飞机航班*/{int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目的城市:");gets(vh);printf("航班费用:");scanf("%f",&money);getchar();printf("起飞时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n");return;}if(j==-1){printf("\n错误!无法找到到达城市\n");return;}q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+1;q->info.stata[t].number=code;q->info.stata[t].expenditure=money;q->info.stata[t].begintime[0]=bt[0];q->info.stata[t].begintime[1]=bt[1];q->info.stata[t].arrivetime[0]=at[0]; q->info.stata[t].arrivetime[1]=at[1];q->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info.stata[0].number=code;p->info.stata[0].expenditure=money;p->info.stata[0].begintime[0]=bt[0];p->info.stata[0].begintime[1]=bt[1];p->info.stata[0].arrivetime[0]=at[0];p->info.stata[0].arrivetime[1]=at[1];p->st=0;p->nextarc=G->vertices[i].planefirstarc; G->vertices[i].planefirstarc=p;G->planearcnum++;}save(G);。