数据结构 公交路线管理模拟系统

合集下载

C语言课程设计报告--公交路线管理系统

C语言课程设计报告--公交路线管理系统

合肥学院计算机科学与技术系课程设计报告2011 ~2012 学年第二学期课程面向过程综合设计课程设计名称公交路线管理系统学生姓名学号**********专业班级指导教师2012 年6 月一、设计思想我的系统主要功能是实现对公交路线的查询管理和维护。

众所周知,公交车在每一个城市中都有着非常大的作用,几乎每个市民都要用到公交车。

以及公交车的路线经常会有所改动。

因此如果使用我的这个系统,就可以及时的对路线信息进行修改和保存可以很好地满足市民的查询,方便人民的生活。

而且该系统使用起来也很方便。

用户只需根据显示的提示信息进行选择和输入就可以实现你要求的功能查询到你需要的信息。

本系统具有显示路线信息、添加线路信息、删除线路信息、修改线路信息、查询信息的功能。

用户们可以根据自己所需要的情况进行相应的功能选择,得到自己所需要的信息。

其具体功能简单描述如下:(1)显示路线信息:即将路线信息显示到屏幕中,供用户查看。

该功能比较简单,在这里不具体说明。

(2)添加路线信息:即添加一条新的公交路线或者是某一条路线上的站点。

每次可以添加一条路线信息,若用户想添加多条路线信息的话可以重复执行该功能,同样的,添加站点的话也是每一次添加一个站点,若用户想添加多条路线信息的话也只需要重复执行该功能即可。

这样,就实现了对公交路线的添加信息管理。

(3)删除路线信息:即能删除掉一条你所不需要的公交路线信息和某一条路线上的站点。

若要删除路线时只需要输入你要删除的公交路线号即可,若要删除站点也只需输入你要删除的站点序号,不需要输入该站点名称。

(4)修改路线信息:即能修改一条你需要该的路线信息。

修改内容包括:修改该条公交路线号、修改站点名称(输入新的信息时该条路线的站点长度不能改变,若要改变站点长促可以选择增加和删除功能,即可实现)。

(5)查询路线信息:即能够查找出你要的公交路线信息和总共有多少站。

简单地说,就是用户先选择你要查询的公交路线号,在输入起点站和终点站名称,然后系统就会自动显示出起点站和终点站之间共有多少站点,以及起点站和终点站之间所有站点的序号和名称,从而使用户一目了然的知道站点信息,而不需要像看地图那样一个站点一个站点的用肉眼进行查找,这就为用户节省了很多时间。

数据结构—交通系统

数据结构—交通系统

数据结构—交通系统在我们的日常生活中,交通系统是一个极其复杂但又至关重要的组成部分。

它就像是一个庞大的、不断运转的机器,将人们从一个地方运输到另一个地方,保障着城市和社会的正常运转。

而在这个复杂的系统背后,数据结构起着不可或缺的作用。

想象一下,每天有成千上万的车辆在道路上行驶,有无数的行人穿梭于街头巷尾,还有各种公共交通工具在城市中穿梭。

如何有效地管理和协调这一切,以确保交通的流畅、安全和高效?这就需要依靠数据结构来实现。

首先,让我们来谈谈交通流量数据。

这是交通系统中最基本也是最重要的数据之一。

通过在道路上设置传感器、摄像头等设备,我们可以实时收集到车辆的数量、速度、行驶方向等信息。

这些数据被整理和存储起来,形成了一个庞大的数据库。

而这个数据库的组织方式,就是一种数据结构。

比如说,我们可以使用链表来存储交通流量数据。

链表的特点是可以方便地进行插入和删除操作,这对于实时更新交通流量信息非常有用。

每当有新的数据产生,我们可以迅速地将其添加到链表中;而当某些数据过时或者不再需要时,也可以轻松地将其从链表中删除。

另外,队列这种数据结构在交通系统中也有广泛的应用。

比如在十字路口的信号灯控制中,车辆可以被看作是在一个队列中等待通行。

信号灯按照一定的规则依次放行队列中的车辆,从而保证交通的有序进行。

队列的先进先出原则很好地模拟了这种场景,使得交通控制更加合理和高效。

除了交通流量数据,路线规划也是交通系统中的一个重要环节。

当我们使用导航软件规划出行路线时,背后其实是一系列复杂的数据结构和算法在起作用。

例如,图这种数据结构被广泛应用于路线规划中。

我们可以将城市的道路网络看作是一个图,其中节点代表道路的交叉点,边代表道路段。

通过对这个图进行搜索和分析,导航软件可以找到从起点到终点的最优路径。

在图的搜索算法中,迪杰斯特拉算法是一种常用的方法。

它能够计算出图中一个节点到其他所有节点的最短路径。

当我们输入起点和终点后,导航软件就会运用这种算法,在道路网络的图中找到最短或者最快的路线,为我们提供准确的导航指引。

数据结构公交换乘系统

数据结构公交换乘系统

数据结构公交换乘系统公交换乘系统是现代城市交通系统中的重要组成部分,它为乘客提供了方便快捷的出行方式。

在一个繁忙的城市中,合理规划公交线路以及实现高效的换乘是提高公交系统效率的关键。

为了实现这一目标,数据结构在公交换乘系统的设计与实现中起着重要的作用。

一、问题描述公交换乘系统的目标是为乘客提供最佳的换乘路线。

给定起点和终点,系统需要计算出最短的换乘路线以及相应的换乘次数和换乘站点。

为了实现这一目标,我们需要使用合适的数据结构来存储和处理公交线路数据。

二、数据结构选择在设计公交换乘系统时,我们可以使用多种数据结构来存储和处理公交线路数据。

以下是几种常用的数据结构:1. 图(Graph):公交线路可以被看作是一个有向图,图的节点表示公交站点,图的边表示公交线路。

使用图数据结构可以方便地表示公交线路之间的关系,以及计算最短路径。

2. 队列(Queue):在公交换乘系统中,乘客需要按照先后顺序排队等待上车。

队列数据结构可以很好地模拟这一过程,保证乘客按照先来先服务的原则进行换乘。

3. 栈(Stack):在某些情况下,公交线路可能需要进行回溯或者撤销操作。

栈数据结构可以很好地支持这些操作,保证系统的灵活性和可靠性。

根据公交换乘系统的需求,我们可以选择合适的数据结构来存储和处理公交线路数据。

三、数据结构的实现1. 图的实现在公交换乘系统中,我们可以使用邻接矩阵或邻接表来表示公交线路的图结构。

邻接矩阵是一个二维数组,其中的元素表示两个公交站点之间是否有直接的公交线路。

如果两个站点之间有直接线路,则对应位置的元素为1,否则为0。

邻接矩阵的优点是查询两个站点之间是否有直接线路的时间复杂度为O(1),但是它的缺点是占用较多的存储空间。

邻接表是一种链表的数组,其中的每个链表表示一个公交站点的邻居站点。

邻接表的优点是占用较少的存储空间,但是查询两个站点之间是否有直接线路的时间复杂度为O(k),其中k是邻居站点的数量。

2. 队列的实现在公交换乘系统中,我们可以使用数组或链表来实现队列数据结构。

数据结构公交换乘系统

数据结构公交换乘系统

数据结构公交换乘系统一、系统概述数据结构公交换乘系统是一种基于数据结构算法的智能化交通规划系统,旨在提供高效、准确的公交换乘服务。

该系统通过分析用户出发地和目的地,结合公交线路数据、交通拥堵情况等信息,计算出最佳的公交换乘方案,为用户提供准确的出行指导。

二、系统功能1. 用户注册与登录用户可以通过手机号码或邮箱注册账号,并通过账号登录系统。

登录后,用户可以享受系统提供的各项功能。

2. 输入出发地和目的地用户可以在系统界面中输入出发地和目的地的信息,包括地点名称、地理坐标等。

系统将根据用户输入的信息进行后续处理。

3. 公交线路查询系统根据用户输入的出发地和目的地,查询公交线路数据,并进行路径规划。

系统将根据用户的出行需求和实时交通情况,计算出最佳的公交换乘方案。

4. 换乘方案展示系统将计算出的最佳换乘方案展示给用户,包括具体的公交线路、乘车站点、换乘路线等信息。

用户可以根据系统提供的方案进行出行决策。

5. 实时交通信息更新系统会实时获取交通拥堵情况、公交车实时位置等信息,并对方案进行动态调整。

用户可以获取最新的交通信息,以便做出更合理的出行决策。

6. 路线导航用户选择最佳换乘方案后,系统将提供路线导航功能,指导用户如何步行至乘车站点、换乘公交线路及下车位置。

系统可以通过地图、文字等方式提供导航指引。

7. 历史记录与收藏系统会记录用户的出行历史,并提供历史记录查询功能。

用户还可以将常用的出行方案收藏起来,方便下次查询。

三、系统设计1. 数据存储系统需要存储大量的公交线路数据、地理信息数据等。

可以采用数据库来存储这些数据,以便系统能够高效地进行查询和处理。

2. 数据结构设计系统需要设计合适的数据结构来存储和处理公交线路数据、地理信息数据等。

可以使用图、树、队列等数据结构来表示和计算公交线路、路径规划等。

3. 算法设计系统需要设计高效的算法来进行公交线路查询和路径规划。

可以使用最短路径算法、深度优先搜索算法等来计算最佳换乘方案。

数据结构—交通系统

数据结构—交通系统

数据结构—交通系统数据结构—交通系统1:引言交通系统是一个城市或地区顺畅运行的重要组成部分。

为了有效管理和优化交通流量,需要设计和实现一个高效的交通系统。

本文档将介绍一个基于数据结构的交通系统设计。

2:整体架构交通系统可以分为以下几个模块:2.1 路网管理模块该模块负责管理整个路网的基础数据,包括道路、交叉口、车道、信号灯等信息。

2.2 路况监测模块该模块通过传感器和摄像头等设备对交通路况进行实时监测,并将数据反馈给系统。

2.3 路径规划模块该模块根据用户的起点和终点,利用路网数据和实时路况信息,计算出最优路径。

2.4 交通管理模块该模块根据实时路况和路径规划结果,控制信号灯、调整车道使用情况,以优化交通流量。

3:路网管理模块3.1 道路管理道路包括道路名称、起点和终点位置、道路长度等属性。

可以使用线性表或图来表示道路之间的连接关系。

3.2 交叉口管理交叉口是道路交汇的地方,包括交叉口名称、交叉口坐标、交通灯状态等属性。

可以使用树来表示交叉口的层级关系。

3.3 车道管理车道是道路上划分出的车辆行驶通道,包括车道编号、车道容量、车道速度限制等属性。

可以使用链表或数组来表示车道之间的关系。

4:路况监测模块4.1 传感器数据采集通过部署传感器设备,采集道路状况、车辆数量等数据。

可以使用数组或链表来存储和管理传感器数据。

4.2 图像识别技术利用摄像头采集交通图片,并通过图像识别技术分析车辆数量、车辆类型等信息。

可以使用图像处理算法来实现图像识别功能。

5:路径规划模块5.1 起点和终点选择用户选择起点和终点,并提供其他限制条件,例如出行时间、交通工具等。

5.2 最短路径算法利用最短路径算法,通过路网数据和实时路况信息,计算出起点到终点的最优路径。

可以使用Dijkstra算法、A算法等来实现最短路径计算。

6:交通管理模块6.1 信号灯控制根据交通流量和道路状况,动态调整信号灯的时间间隔,以控制交通流量。

6.2 车道使用管理根据车流量和道路容量,动态调整车道使用情况,例如开放或关闭车道,以优化交通流量。

大数据结构 公交路线管理系统模拟系统

大数据结构 公交路线管理系统模拟系统

《数据结构》课程设计报告一、课程设计名称公交线路管理模拟系统二、实用工具软件Microsoft visual C++ 6.0三、课程设计容简介1、实践目的1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;2)、掌握上机实现图的基本方法;3)、掌握有关图的操作并用高级语言编程实现;4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;5)、掌握图的常见应用算法的思想及其程序实现。

2、实践要求1)、掌握本章实践的算法;2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;4)、注意理解各算法实现时所采用的存储结构;5)、注意正、逆邻接表。

3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。

本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。

而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。

所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。

因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。

因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。

4、程序设计流程为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。

利用邻接表把站点与站点之间的信息储存起来。

数据结构 公交路线管理模拟系统

数据结构 公交路线管理模拟系统

《数据结构》课程设计报告一、课程设计名称公交线路管理模拟系统二、实用工具软件Microsoft visual C++ 6.0三、课程设计内容简介1、实践目的1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;2)、掌握上机实现图的基本方法;3)、掌握有关图的操作并用高级语言编程实现;4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;5)、掌握图的常见应用算法的思想及其程序实现。

2、实践要求1)、掌握本章实践的算法;2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;4)、注意理解各算法实现时所采用的存储结构;5)、注意正、逆邻接表。

3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。

本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。

而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。

所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。

因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。

因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。

4、程序设计流程为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。

利用邻接表把站点与站点之间的信息储存起来。

数据结构—交通指南系统

数据结构—交通指南系统

南通大学数据结构实验课实验报告学生姓名所在院系专业学号指导教师南通大学2013年 12 月 11 日交通指南系统1.问题描述假设以一个带权有向图表示某一区域的公交线路图,图中顶点代表一些区域中的重要站点,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一站点到达另一站点。

2.基本要求(1)设计结点和图的存储结构;(2)设计任意两点最短路径方法;(3)输入:图的相关信息以建立公交线路网,以及公交线路网咨询的任意两个站点;(4)输出:两个站点间一条最短的简单路径。

3.实现提示(1)结点和图的存储结构typedef struct node{ int no;float wgt;struct node*next;}edgenode;typedef struct{ char vtx;edgenode*link;} vexnode;typedef vexnode Graph[n];;void Floyd(Graph G,float A[n][n],int p[n][n]){ int i,j,k;for(i=0;i<n;i++)fot(j=0;j<n;j++){ A[i][j]=G[i][j];P[i][j]=-1;}for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)if(A[i][k]+A[k][j]<A[i][j]){ p[i][j]=k;A[i][j]=A[i][k]+A[k][j];}}(2)算法提示采用任意两点最短路径的相关算法。

4.算法设计(1)结点类型:struct ArcCell{int adj; //存放弧长bool *info; //是否用过该弧};struct _MGraph{char vexs[20]; //存放站点ArcCell arcs[20][20]; //<i,j>int vexnum;int arcnum;};(2)类定义:class MGraph //没用私有成员{public:_MGraph mgraph;//void DestroyGraph(); //析构函数销毁图int LocateVex (char u); // 返回顶点在图中的位置bool CreateDN(); //构造有向网void ShortestPath_FLOYD(Path &P,Distanc &D);};(3)构造有向网:bool MGraph::CreateDN()//构造有向网{int i,j ,w;char v1, v2;cout<<"请输入站点个数,直接线路的条数: ";cin>>mgraph.vexnum>>mgraph.arcnum ;cout<<"\n请输入各站点名: ";for(i = 0;i<mgraph.vexnum;i++)//构造顶点向量{cin>>mgraph.vexs[i];}for(i = 0;i<mgraph.vexnum;i++) //初始化邻接矩阵{for(j = 0;j<mgraph.vexnum;j++){if(i==j)mgraph.arcs[i][j].adj = 0;elsemgraph.arcs[i][j].adj = 20000; //infinity;mgraph.arcs[i][j].info = false;}}for(i = 0;i<mgraph.arcnum;i++) //构造邻接矩阵{cout<<"\n请输入一条线路的起点,终点,距离(公里): ";cin>>v1>>v2>>w;int m = LocateVex(v1);int n = LocateVex(v2);mgraph.arcs[m][n].adj = w; // <v1, v2>的权值}return true;}(4)销毁有向图:void MGraph::DestroyGraph(){for(int i = 0 ;i<mgraph.vexnum;i++)for(int j = 0;j<mgraph.vexnum;j++){if(mgraph.arcs[i][j].info){delete []mgraph.arcs[i][j].info;mgraph.arcs[i][j].info = false;}}mgraph.vexnum = 0;mgraph.arcnum = 0;}(5)定位点:int MGraph::LocateVex(char u){for(int i = 0 ;i<20;i++){if(u == mgraph.vexs[i]){return i;}}return -1;}(6)最短路径void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径// 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]// 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告一、课程设计名称公交线路管理模拟系统二、实用工具软件Microsoft visual C++ 6.0三、课程设计内容简介1、实践目的1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;2)、掌握上机实现图的基本方法;3)、掌握有关图的操作并用高级语言编程实现;4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;5)、掌握图的常见应用算法的思想及其程序实现。

2、实践要求1)、掌握本章实践的算法;2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;4)、注意理解各算法实现时所采用的存储结构;5)、注意正、逆邻接表。

3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。

本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。

而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。

所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。

因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。

因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。

4、程序设计流程为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。

利用邻接表把站点与站点之间的信息储存起来。

用文件详细记载了路线信息,便于管理者初始化公交路线信息。

再构造子函数来创建、及时修改、插入、删除公交信息、以及查询公交路线是否出错,各站点之间的距离。

用主函数来调用子函数,进入导航系统而进行操作。

主函数(main)流程导航查询(initial)流程汽车查询(包含车号、站台查询)流程新建(newb)流程修改路线(Modifyr)流程修改汽车(modifyb)流程删除汽车(delb)流程5、运行环境代码用C语言完成,布置在Microsoft visual C++ 6.0运行。

Microsoft visual C++ 6.0具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。

输入如下公交线路信息1路 津A10001 司机1 6:00 1—>2—>3—>4—>52路 津A10002 司机2 6:15 6—>7—>4—>8—>17—>12 3路 津A10003 司机3 6:00 9—>7—>3—>10—>124路 津A10004 司机4 6:30 6—>13—>1—>12—>14—>17 5路 津A10005 司机5 7:00 15—>5—>8—>16—>10—>2—>131211413 62 734 10171615 589创建示意图(1路)创建结束选择N回到主菜单,再选择A(导航查询)主菜单下选择B(公汽查询)就可以查询已有的公交信息,查询方式有公汽号查询、站台查询两种查询方式我们以公汽号查询(查询津A10001)为例:返回到主菜单,选择D进入系统管理我们以修改路线为例(修改津A10001)最后在主菜单下选择E(清空数据)最后选择F即可退出程序。

四、得意与不足之处:1、得意之处:1)、可以根据题目需要翻阅图书馆资料自学C++程序,完成代码。

2)、完成过程中思路清晰,可以根据实际进行分析设计、编程调试,能够熟练应用软件的分析方法和工程设计方法。

3)、够按要求编写课程设计报告书,能正确阐述设计和实验结果便于管理者自由创建公交车的相关信息2、不足之处:1)、程序太过繁琐,采用了一些不常用的语句2)、不能简易地查询任意两站之间的距离3)、不能查询任意的站点,只能查询起点和终点4)、不能任意输入两个站点,给出最优的乘车路线五、自我感受:课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。

在这次课程设计中我遇到许多问题和麻烦,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。

在此对老师和同学们表示感谢!八、参考文献:《数据结构实践训练教程》刘光然主编南开大学出版社《数据结构》严蔚敏主编清华大学出版社《C语言程序设计》谭浩强主编清华大学出版社附录:#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>struct bus{char num[30];//车号char driver[50];//司机char stime[30];//发车时间char start[30];//起始站char end[30];//终点站int z;//站数char *pr;//指向路线的首指针struct bus *next;//下一辆车的结构体};struct bus *bhead=NULL;//放公汽信息的头指针struct bus *bi=NULL;//放公汽信息的最后的指针void initial(){FILE *fp;fp=fopen("bus.txt","r");if(fp==NULL){printf("\n\n无公汽信息文件!");return;} fseek(fp,0,SEEK_END);int i,n;n=ftell(fp)/sizeof(struct bus);//printf("\n\n\n\n一共有%d辆公汽!",n);rewind(fp);struct bus *p;//forfor(i=0;i<n;i++){p=(struct bus *)malloc(sizeof(struct bus ));fseek(fp,i*sizeof(struct bus),0);fread(p,sizeof(struct bus),1,fp);//写入信息,其中地址是无用的信息 p->next=NULL;//初始化时下一个指向空,都是一个个单独的p->pr=NULL;//让路线为空//路线信息存放在文件名为”车号“的文件中;车号是唯一的FILE *fp1;fp1=fopen(p->num,"r");if(!fp1) printf("\n%s号车无初始路线!",p->num);else{char * p1;p1=(char *)malloc(p->z*40*sizeof(char) );fread(p1,p->z*50*sizeof(char),1,fp1);//将路线写入内存p->pr=p1;fclose(fp1);}// printf("\n\n\n\n初始化%s号车路线成功!",p->num); //路线信息if(bhead==NULL) bhead=bi=p;else{ bi->next=p; bi=p; }}//for结尾//printf("\n\n\n\n初始化%d辆车成功!",n);fclose(fp);}void newb(){loop1:printf("\n\n\n\n█创建新公汽█\n\n");struct bus *p;p=(struct bus *)malloc(sizeof(struct bus ));p->next=NULL;p->pr=NULL;loop2:printf("\n请输入新公汽号:\n\n");scanf("%s",p->num);struct bus *pj=bhead;while(pj){if(strcmp(pj->num,p->num)==0){printf("\n\n错误,该公汽号已经存在!\n\n"); goto loop2;}pj=pj->next;}printf("\n请输入新公汽司机姓名:\n");scanf("%s",p->driver);printf("\n请输入新路线发车时间\n\n");scanf("%s",p->stime);loop3:printf("\n\n\n请输入新路线总站台数(>=2)\n\n");scanf("%d",&p->z);if(p->z>=2){p->pr=(char *)malloc( p->z*50*sizeof(char) );p->pr[0]='\0';int i;char cc[40];for(i=1;i<=p->z;i++){printf("\n请输入公汽第%d站台名称:",i);scanf("%s",cc);if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}else{strcat(p->pr,"---->");strcat(p->pr,cc);}}strcpy(p->end,cc);printf("\n\n自动生成公汽路线%s",p->pr);}else { printf("\n\n错误,该公汽站台数小于2,请重新输入!\n\n"); goto loop3;} if(bhead==NULL)bi=bhead=p;else{bi->next=p;bi=p;}printf("\n\n%s号公汽创建成功!",p->num);printf("\n\n\n您想继续新建(A) 退出创建(N)-------请选择 A 或 N \n\n "); char c;c=getch();if(c=='a'||c=='A') goto loop1;else return;}void modifyr(){char c,b[20];printf("\n\n\n\n █修改路线█\n\n");loop:printf("\n请输入要修改路线的公汽号:\n\n");scanf("%s",b);struct bus *p=bhead;int n=1;while(p){if(strcmp(p->num,b)==0){printf("\n\n司机姓名: %s",p->driver);n=0;break;} p=p->next;}if(n){ printf("\n\n错误,公汽号不存在!\n\n重新修改(A) 退出修改(N)-------请选择 A 或 N \n\n ");char c;c=getch();if(c=='a'||c=='A') goto loop;else return;}loop1:printf("\n\n\n请修改路线总站台数(>=2)\n\n");int nn;scanf("%d",&nn);if(nn>=2){p->pr=(char *)malloc( p->z*50*sizeof(char) );p->pr[0]='\0'; p->z=nn;int i;char cc[40];for(i=1;i<=p->z;i++){printf("\n请输入公汽第%d站台名称:",i);scanf("%s",cc);if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}else{strcat(p->pr,"---->");strcat(p->pr,cc);}}strcpy(p->end,cc);printf("\n\n自动生成修改后的路线%s",p->pr);}else { printf("\n\n错误,该公汽站台数小于2,请重新输入!\n\n"); goto loop1;} printf("\n\n\n%s号公汽修改成功!",p->num);printf("\n\n\n您想继续修改(A) 退出修改(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;FILE *fp;fp=fopen(p->num,"w");fwrite(p,nn*50*sizeof(char),1,fp);fclose(fp);//保存线路信息}void modifyb(){char c,b[20];printf("\n\n\n\n █修改公汽█\n\n");loop:printf("\n请输入要修改路线的公汽号:\n\n");scanf("%s",b);struct bus *p=bhead;int n=1;while(p){if(strcmp(p->num,b)==0){printf("\n\n司机姓名: %s 发车时间: %sAM",p->driver,p->stime );n=0;break;}p=p->next;}if(n){ printf("\n\n错误,公汽号不存在!\n\n重新修改(A) 退出修改(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;else return;}printf("\n请输入要修改%s公汽的新司机:\n\n",p->num);scanf("%s",p->driver);printf("\n请输入要修改%s公汽的发车时间:\n\n",p->num);scanf("%s",p->stime);printf("\n\n\n%s号公汽修改成功!",p->num);printf("\n\n\n您想继续修改(A) 退出修改(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}void showb(){struct bus *p=bhead;if(!p){printf("\n\n公汽线路信息数据库为空!"); return; }else{printf("\n\n\n █公汽信息数据库█ ");printf("\n|-------------------------------------------------------------------------|");}int n=1;while(p){printf("\n| 公汽号:%s 站数:%d 发车时间:%s AM 司机:%s ",p->num, p->z, p->stime,p->driver);printf("\n| █路线: %s",p->pr);printf("\n|-------------------------------------------------------------------------|");n=0;p=p->next;}if(n)printf("\n\n公汽线路信息数据库为空!");}void lookb(){char c,b[20];//printf("\n\n\n\n █查询路线█\n\n");loop:printf("\n请输入要查询的公汽号:\n\n");scanf("%s",b);struct bus *p=bhead;int n=1;while(p){if(strcmp(p->num,b)==0){n=0;break;}p=p->next;}if(n){ printf("\n\n错误,公汽号不存在!\n\n重新输入(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;else return;}printf("\n|-------------------------------------------------------------------------|");printf("\n| 公汽号:%s 站数:%d 发车时间:%s AM 司机:%s ",p->num, p->z, p->stime,p->driver);printf("\n| 路线: %s",p->pr);printf("\n|-------------------------------------------------------------------------|");printf("\n\n\n%s号公汽查询成功!",p->num);printf("\n\n\n您想继续查询(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}void lookr(){// printf("\n\n\n\n █查询公汽█\n\n");char c,b[40];loop://printf("\n [查询公汽菜单]");//printf("\n|-----------------------------------|");printf("\n \n \n \n 请选择查询方式: ");printf("\n|-----------------------------------|");printf("\n| A[ 起始站查询 ] |");printf("\n|-----------------------------------|");printf("\n| B[ 终点站查询 ] |");printf("\n|-----------------------------------|");printf("\n| C[ 退出 ] |");printf("\n|-----------------------------------|");c=getch();if(c=='B'||c=='b'){printf("\n请输入要查询的终点站:\n\n");scanf("%s",b);struct bus *p=bhead;int n=1;printf("\n 您可以乘坐以下公汽到达%s",p->end);printf("\n|-------------------------------------------------------------------------|");while(p){if(strcmp(p->end,b)==0){n=0;printf("\n|公汽号:%s 路线: %s" ,p->num,p->pr);printf("\n|-------------------------------------------------------------------------|");}p=p->next;}if(n){ printf("\n\n错误,终点站不存在!\n\n重新输入(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}printf("\n\n您想继续查询(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}if(c=='A'||c=='a'){printf("\n请输入要查询的起始站:\n\n");scanf("%s",b);struct bus *p=bhead;int n=1;printf("\n 您可以乘坐以下公汽起始站为%s",p->start);printf("\n|-------------------------------------------------------------------------|");while(p){if(strcmp(p->start,b)==0){n=0;printf("\n|公汽号:%s 路线: %s" ,p->num,p->pr);printf("\n|-------------------------------------------------------------------------|");}p=p->next;}if(n){ printf("\n\n错误,起始站不存在!\n\n重新输入(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}printf("\n\n您想继续查询(A) 退出查询(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}}void delb(){char b[20];printf("\n\n\n\n █删除公汽█\n\n");loop:printf("\n请输入要删除路线的公汽号:\n\n");scanf("%s",b);struct bus *p=bhead;struct bus *p1=bhead;int n=1,y=0;while(p){if(strcmp(p->num,b)==0){n=0;break;}y++;if(y>1) p1=p1->next;p=p->next;}char c;if(n){ printf("\n\n错误,公汽号不存在!\n\n重新输入(A) 退出删除(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;else return;}if(p==bhead)bhead=bhead->next;else p1->next=p->next;printf("\n删除路线的公汽成功!\n\n");printf("\n\n您是继续删除(A) 退出删除(N)-------请选择 A 或 N \n\n ");c=getch();if(c=='a'||c=='A') goto loop;}void save(){FILE *fp;fp=fopen("bus.txt","w");struct bus *p;p=bhead;int n=0;while(p){//第一个whilefseek(fp,n*sizeof(struct bus),0);fwrite(p,sizeof(struct bus ),1,fp);n++;FILE *fp1;fp1=fopen(p->num,"w");fwrite(p->pr,p->z*50*sizeof(char),1,fp1);fclose(fp1);p=p->next;}fclose(fp);//printf("\n\n\n\n保存%d辆车成功!",n);}void release(){bhead=bi=NULL;printf("\n\n\n数据清空成功!");}void show1(){printf("\n\n\n\n\n |----------------------------------------|");printf("\n | █主菜单█ |"); printf("\n |----------------------------------------|");printf("\n | A 导航查询 |");printf("\n |----------------------------------------|");printf("\n | B 公汽查询 |");printf("\n |----------------------------------------|");printf("\n | C 新建公汽 |");printf("\n |----------------------------------------|");printf("\n | D 系统管理 |");printf("\n |----------------------------------------|");printf("\n | E 清空数据 |");printf("\n |----------------------------------------|");printf("\n | F 退出程序 |"); printf("\n |----------------------------------------|");printf("\n | 请您选择一个任务 |");printf("\n |----------------------------------------|\n\n\n");}void show2(){printf("\n |-----------------------------|");printf("\n | █管理菜单█ |");printf("\n |-----------------------------|");printf("\n | A 修改路线 |");printf("\n |-----------------------------|");printf("\n | B 修改公汽 |");printf("\n |-----------------------------|");printf("\n | C 删除公汽 |");printf("\n |-----------------------------|");printf("\n | D 退出程序 |");printf("\n |-----------------------------|");printf("\n | 请您选择一个任务 |");printf("\n |-----------------------------|\n\n\n");}void show3(){printf("\n\n █查询菜单█");printf("\n|-----------------------------------|"); printf("\n| 请选择查询方式: |"); printf("\n|-----------------------------------|"); printf("\n| A[ 公汽号查询 ] |"); printf("\n|-----------------------------------|"); printf("\n| B[ 站台查询 ] |"); printf("\n|-----------------------------------|"); printf("\n| C[ 退出 ] |"); printf("\n|-----------------------------------|");}void main(){printf("\n\n ★欢迎使用公汽查询系统!★"); initial();char c1;do {show1();c1=getch();switch ( c1 ){case 'a':case 'A':showb();break;case 'b':case 'B': {char c3;do{show3();c3=getch();switch ( c3){case 'a':case 'A':lookb();break; case 'b':case 'B':lookr();break; case 'c':case 'C':break;}}while(c3!='c'&&c3!='C'); }break;case 'c':case 'C':newb();break; case 'd':case 'D':{char c2;do{show2();c2=getch();switch ( c2){case 'a':case 'A':modifyr();break;case 'b':case 'B':modifyb();break;case 'c':case 'C':delb();break;}}while(c2!='d'&&c2!='D');}break;case 'E':case 'e':release(); save(); break; }}while(c1!='f'&&c1!='F');save();printf("\n\n ★谢谢您的使用!★"); }。

相关文档
最新文档