数据结构公交换乘系统
- 格式:doc
- 大小:274.50 KB
- 文档页数:18
数据结构—交通系统在我们的日常生活中,交通系统是一个极其复杂但又至关重要的组成部分。
它就像是一个庞大的、不断运转的机器,将人们从一个地方运输到另一个地方,保障着城市和社会的正常运转。
而在这个复杂的系统背后,数据结构起着不可或缺的作用。
想象一下,每天有成千上万的车辆在道路上行驶,有无数的行人穿梭于街头巷尾,还有各种公共交通工具在城市中穿梭。
如何有效地管理和协调这一切,以确保交通的流畅、安全和高效?这就需要依靠数据结构来实现。
首先,让我们来谈谈交通流量数据。
这是交通系统中最基本也是最重要的数据之一。
通过在道路上设置传感器、摄像头等设备,我们可以实时收集到车辆的数量、速度、行驶方向等信息。
这些数据被整理和存储起来,形成了一个庞大的数据库。
而这个数据库的组织方式,就是一种数据结构。
比如说,我们可以使用链表来存储交通流量数据。
链表的特点是可以方便地进行插入和删除操作,这对于实时更新交通流量信息非常有用。
每当有新的数据产生,我们可以迅速地将其添加到链表中;而当某些数据过时或者不再需要时,也可以轻松地将其从链表中删除。
另外,队列这种数据结构在交通系统中也有广泛的应用。
比如在十字路口的信号灯控制中,车辆可以被看作是在一个队列中等待通行。
信号灯按照一定的规则依次放行队列中的车辆,从而保证交通的有序进行。
队列的先进先出原则很好地模拟了这种场景,使得交通控制更加合理和高效。
除了交通流量数据,路线规划也是交通系统中的一个重要环节。
当我们使用导航软件规划出行路线时,背后其实是一系列复杂的数据结构和算法在起作用。
例如,图这种数据结构被广泛应用于路线规划中。
我们可以将城市的道路网络看作是一个图,其中节点代表道路的交叉点,边代表道路段。
通过对这个图进行搜索和分析,导航软件可以找到从起点到终点的最优路径。
在图的搜索算法中,迪杰斯特拉算法是一种常用的方法。
它能够计算出图中一个节点到其他所有节点的最短路径。
当我们输入起点和终点后,导航软件就会运用这种算法,在道路网络的图中找到最短或者最快的路线,为我们提供准确的导航指引。
数据结构公交换乘系统公交换乘系统是现代城市交通系统中的重要组成部分,它为乘客提供了方便快捷的出行方式。
在一个繁忙的城市中,合理规划公交线路以及实现高效的换乘是提高公交系统效率的关键。
为了实现这一目标,数据结构在公交换乘系统的设计与实现中起着重要的作用。
一、问题描述公交换乘系统的目标是为乘客提供最佳的换乘路线。
给定起点和终点,系统需要计算出最短的换乘路线以及相应的换乘次数和换乘站点。
为了实现这一目标,我们需要使用合适的数据结构来存储和处理公交线路数据。
二、数据结构选择在设计公交换乘系统时,我们可以使用多种数据结构来存储和处理公交线路数据。
以下是几种常用的数据结构:1. 图(Graph):公交线路可以被看作是一个有向图,图的节点表示公交站点,图的边表示公交线路。
使用图数据结构可以方便地表示公交线路之间的关系,以及计算最短路径。
2. 队列(Queue):在公交换乘系统中,乘客需要按照先后顺序排队等待上车。
队列数据结构可以很好地模拟这一过程,保证乘客按照先来先服务的原则进行换乘。
3. 栈(Stack):在某些情况下,公交线路可能需要进行回溯或者撤销操作。
栈数据结构可以很好地支持这些操作,保证系统的灵活性和可靠性。
根据公交换乘系统的需求,我们可以选择合适的数据结构来存储和处理公交线路数据。
三、数据结构的实现1. 图的实现在公交换乘系统中,我们可以使用邻接矩阵或邻接表来表示公交线路的图结构。
邻接矩阵是一个二维数组,其中的元素表示两个公交站点之间是否有直接的公交线路。
如果两个站点之间有直接线路,则对应位置的元素为1,否则为0。
邻接矩阵的优点是查询两个站点之间是否有直接线路的时间复杂度为O(1),但是它的缺点是占用较多的存储空间。
邻接表是一种链表的数组,其中的每个链表表示一个公交站点的邻居站点。
邻接表的优点是占用较少的存储空间,但是查询两个站点之间是否有直接线路的时间复杂度为O(k),其中k是邻居站点的数量。
2. 队列的实现在公交换乘系统中,我们可以使用数组或链表来实现队列数据结构。
《数据结构》课程设计报告一、课程设计名称公交线路管理模拟系统二、实用工具软件Microsoft visual C++ 6.0三、课程设计容简介1、实践目的1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;2)、掌握上机实现图的基本方法;3)、掌握有关图的操作并用高级语言编程实现;4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;5)、掌握图的常见应用算法的思想及其程序实现。
2、实践要求1)、掌握本章实践的算法;2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;4)、注意理解各算法实现时所采用的存储结构;5)、注意正、逆邻接表。
3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。
本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。
而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。
所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。
因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。
因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。
4、程序设计流程为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。
利用邻接表把站点与站点之间的信息储存起来。
面向移终端的公交换乘系统后台的设计和实现的开题报告一、问题背景公交换乘是人们日常出行中非常常见的情况。
在城市中,不同公交线路之间可能存在交汇或者终点站的重叠,因此需要通过换乘来到达目的地。
为了提升乘客的出行体验和效率,设计和实现一个面向移动终端的公交换乘系统需要保证后台的可靠和高效。
二、研究内容1.需求分析:通过对公交换乘系统的调研,了解用户对于系统的需求和痛点,进而确定系统需求。
2.系统架构设计:在满足需求的前提下,设计合理的系统架构,包括数据存储、业务逻辑处理、数据接口设计等。
3.数据库设计:针对系统的数据存储需求设计数据库模型。
4.数据接口设计:为移动终端提供数据接口,提高用户体验。
5.系统测试:对系统进行全面测试,保证系统功能、性能和稳定性。
三、研究意义通过设计和实现一个面向移动终端的公交换乘系统后台,可以为广大出行人群提供便利和高效的服务。
同时,这也是一个技术挑战和机遇,可以在系统架构、数据库设计和业务逻辑等方面进行技术探索、创新和提升。
四、研究方法1.文献资料法:通过查阅文献资料,了解公交换乘系统的相关研究和实践经验,进而结合实际情况确定系统需求和设计方案。
2.实验法:通过实验验证系统的可靠性、性能和稳定性。
3.软件工程方法:使用软件工程方法进行系统设计和开发,包括系统架构设计、数据库设计、接口开发等。
五、预期成果1.一个面向移动终端的公交换乘系统后台;2.论文一篇,详细介绍系统的设计和实现过程,同时对系统进行全面测试和性能评估;3.项目开发过程中所积累的技术和经验。
六、进度安排阶段时间任务1 第1周~第2周系统调研、需求分析和方案提出2 第3周~第4周系统架构设计、数据库设计和接口设计3 第5周~第7周系统开发和测试4 第8周~第9周论文撰写和完善七、参考文献1.刘晓东. 公交换乘导航系统的研究与实现[J]. 规划交通, 2019(6): 103-107.2.吕嘉扬. 基于数据挖掘的公交换乘建议系统研究[J]. 交通科技, 2018(6): 43-45.3.吴敬华, 刘彦晨. 基于深度学习的公交换乘推荐算法设计[J]. 公路交通科技, 2019(1): 96-100.。
《数据结构》课程设计报告一、课程设计名称公交线路管理模拟系统二、实用工具软件Microsoft visual C++ 6.0三、课程设计内容简介1、实践目的1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;2)、掌握上机实现图的基本方法;3)、掌握有关图的操作并用高级语言编程实现;4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;5)、掌握图的常见应用算法的思想及其程序实现。
2、实践要求1)、掌握本章实践的算法;2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;4)、注意理解各算法实现时所采用的存储结构;5)、注意正、逆邻接表。
3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。
本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。
而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。
所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。
因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。
因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。
4、程序设计流程为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。
利用邻接表把站点与站点之间的信息储存起来。
公交换乘系统本科生课程设计课程名称公交换乘系统学号学生姓名所在专业所在班级指导教师成绩教师签字课程设计时间:2010年6月一、目的与要求通过一个学期的系统学习,学生们掌握了数据结构的基础理论知识,然而由于数据结构原理的抽象性,可能使得学生对数据结构各部分理论的理解不够深入。
设置本课程设计,通过了解公交换乘算法的设计与实现,使学生能够学以致用,培养和提高学生的算法设计、运用计算机进行编程、调试等技能,从而培养学生独立工作的能力和创造能力。
二、设计内容公交换乘系统公交换乘在一个城市的公共交通系统设计中占据着极其重要的地位,公交换乘的过程将直接影响居民出行时间的长短,公交换乘的过程如下:指定一起始公交站点与目的公交站点,依据参考因素,例如:换乘路线的路径最短、耗费时间最短、所需车资最少等,经过分析处理得到可达目的站点换乘次数最少的乘车方案,具体可分为:(1)零次换乘起始站点和目的站点之间存在可直达的公交线路,即出行居民无需转乘就可以直接到达目的站点,这也是较为理想的方案。
(2)一次换乘起始站点和目的站点之间没有公交车直接往返,即两站点之间不存在可直达的公交线路,则出行居民需要在途经的某个站点下车,然后转乘另一线路公交车才能达到目的站点。
(3)多次换乘在起始站点和目的站点之间没有可直达的公交线路,出行居民需要经过一次以上的转乘才能达到目的站点,则得到多次换乘方案。
多次换乘方案可通过一次换乘的递归计算得到,一般情况下,超过两次转乘的方案对于出行居民来说是难以接受的,本课程设计只要求计算零次和一次换乘方案,对于一次以上的公交换乘不作要求。
三:本系统功能介绍:在这里通过主函数显示程序的主页版,上面是湛江的公交线路图。
在这里输入出发站点的名字,回车确定!在这里输入最终站点的名字!输入错误会提醒重新输入!输入要查询的起点和终点0次换乘,输出查询结果:按y或Y,可以继续查询!输入出发点和终点,一次换乘的结果如下:四:设计要求认真参阅本课程设计的相关参考资料、数据,了解公交换乘的原理要求,设计一个实现公交换乘的算法:指定任一起始站点和目的站点,依据算法得到所有可达目的站点的的公交线路,包括中间站点的换乘方法以及该公交线路所经过的公交站点。
广东海洋大学信息学院课程设计报告设计题目公交换乘系统课程名称数据结构姓名(学号)联系电话专业名称计算机科学与技术所在班级1101班指导教师教师职称起止时间2011 年12月26日至2012年1月6日评定成绩一、课程设计的主要内容1、公交线路中,为用户查找最短路径,有【0】次换乘就能到达目的地和【1】次换乘就能到达目的地。
2、为用户计算出路程所需费用。
3、该课程设计的公交系统中有分权限;分管理员用户和普通用户,管理员的登陆需要帐号和密码(暗文),普通用户可以直接登陆。
4、管理员可以重新输入新公交路线、输出公交路线、读取已经存盘的公交路线资料、存入新公交路线资料(慎用!)、查找最短公交路线、新增管理员用户和删除管理员用户。
5、普通用户只能输出公交路线和查找最短公交路线两个功能。
二、功能和结构设计1、为用户分权限2、管理员有重新输入新公交路线、输出公交路线、读取已经存盘的公交路线资料、存入新公交路线资料(慎用!)、查找最短公交路线、新增管理员用户和删除管理员用户3、普通用户只能输出公交路线和查找最短公交路线两个功能。
注:系统默认的公交线路图(系统开发者为用户事先存好的,在f1.txt文档中)三、流程图和算法设计算法:(给出查找最短路径的方法)void Bus<T>::findline(){int x,y,i,j,k,l,longers;longers=0;//x、y是起始和终止车站的编码;i、j是每个站点后两位编码;k是每个站点后两位编码的差值;l是转乘站点的后两位编码while(1){cout<<"请输入起始站点编号:";cin>>x;cout<<" 终止站点编号:";cin>>y;if((x/100)>lineNum||(x/100)<=0||(x%100)>=busStationNum[x/100-1]||(y/100)>lineNum ||(y/100)<=0||(y%100)>=busStationNum[y/100-1])//前两个是判断车站编码的首位的,第三个是判断车站编码的后两位的cout<<"----找不到您所输入站点,请重新输入!----"<<endl;elsebreak;}i=x%100;j=y%100;if((x/100)==(y/100)){cout<<"您可【0】次换乘到达目的地,路线如下:"<<endl;// k=j-i;if(j-i>0){for(k=0;k<j-i;k++){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k].longer;}cout<<line[x/100-1][x%100+k].busStationName<<endl;}else{for(k=0;k>j-i;k--){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k-1].longer;}cout<<line[x/100-1][x%100+k].busStationName<<endl;longers+=line[x/100-1][x%100+k].longer;}cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;}else{string takeName[2][5];//存放两条路线上可转乘车站的名称;int takeNum[2][5];//存放两条路线上可转乘车站的编号;int a,b;//a、b是计数的for(a=0;a<2;a++)for(b=0;b<5;b++){takeName[a][b]=" ";takeNum[a][b]=0;}//遍历每条路线可换乘的站点for(a=0,b=0;a<busStationNum[x/100-1];a++)if(line[x/100-1][a].take){takeName[0][b]=line[x/100-1][a].busStationName;takeNum[0][b]=line[x/100-1][a].number;b++;}for(a=0,b=0;a<busStationNum[y/100-1];a++)if(line[y/100-1][a].take){takeName[1][b]=line[y/100-1][a].busStationName;takeNum[1][b]=line[y/100-1][a].number;b++;}//比较可换乘的站点是否有相同的,如果有,可以了一次换乘到达目的地;否则不可以bool nn=false;for(a=0;a<5;a++){for(b=0;b<5;b++){if(takeName[0][a]!=" "&&takeName[1][b]!=""&&takeName[0][a]==takeName[1][b]){cout<<"您可以【1】次换乘到达目的地(换乘点前面有“*”提示),为你选择的路线如下:"<<endl;l=takeNum[0][a]%100;if(l-i>0){for(k=0;k<l-i;k++){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k].longer;}cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";// money+=line[x/100-1][x%100+k].longer;}else{for(k=0;k>l-i;k--){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k-1].longer;}cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";// money+=line[x/100-1][x%100+k].longer;}l=takeNum[1][b]%100;if(j-l>0){longers+=line[y/100-1][l].longer;for(k=1;k<j-l;k++){cout<<line[y/100-1][l+k].busStationName<<"-->";longers+=line[y/100-1][l+k].longer;}cout<<line[y/100-1][l+k].busStationName<<endl;}else{//money+=line[y/100-1][l-1].longer;for(k=-1;k>j-l;k--){cout<<line[y/100-1][l+k].busStationName<<"-->";longers+=line[y/100-1][l+k].longer;}cout<<line[y/100-1][l+k].busStationName<<endl;longers+=line[y/100-1][l+k].longer;}cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;nn=true;break;}else if(a==4&&b==4)cout<<"很抱歉,没有【0】次换乘或【1】次换乘可以到达目的地的路线!";}if(nn)break;}}}四、源程序代码Bus.h:#include<iostream>#include<string>using namespace std;template <typename T>class Bus{public:struct BusStation{int number; //车站编号string busStationName;//车站名称bool take; //是否可乘换int longer; //到下一个车站的路程};Bus();~Bus();void input();void output();void findline();//查找线路void readfile();//读取公交路线数据void writefile();//存入公交路线数据typedef BusStation* Pointer;private:Pointer *line; //指向三条路线的指针int lineNum;//路线数int *busStationNum;//每条路线的车站数};template<typename A>class Administrator{public:Administrator();~Administrator();void readAdministrator();//读取管理员资料void writeAdministrator();//存入管理员资料void addAdministrator();//增加用户void deleteAdministrator();//删除用户bool land();private:string *name;string *mima;int num;};/////////////////////////////////////////////////////////////////////////// Bus.cpp#include"Bus.h"#include<fstream>template<typename T>Bus<T>::Bus(){lineNum=0;line=new Pointer[lineNum];//三条线路busStationNum=new int [lineNum];//每条线路的车站数}template<typename T>Bus<T>::~Bus(){for(int i=0;i<lineNum;i++)delete [] line[i];lineNum=0;delete [] busStationNum;delete [] line;}template<typename T>void Bus<T>::input(){cout<<"请输入公交线路数:";cin>>lineNum;line=new Pointer[lineNum];//三条线路busStationNum=new int [lineNum];//每条线路的车站数for(int a=0;a<lineNum;a++){cout<<"请输入第"<<a+1<<"条公交线路的车站数:";cin>>busStationNum[a];}for(int b=0;b<lineNum;b++)line[b]=new BusStation[busStationNum[b]];//依据每条线路的车站数创建每条线路int k,m,i,j;//k指前一线,m指后一线,i指要比较的前一线的车站,j指要比较的后一线的车站cout<<"请依次输入每个车站的名称、到下一站点的距离:"<<endl;for(i=0;i<lineNum;i++){cout<<"第"<<i+1<<"条路线的资料"<<endl;for(j=0;j<busStationNum[i];j++){line[i][j].number=(i+1)*100+j;//设置每个车站的编号line[i][j].take=false;//初始化每个车站为不可换乘cin>>line[i][j].busStationName;if(j<busStationNum[i]-1)cin>>line[i][j].longer;//到下一站点有3公里elsecin>>line[i][j].longer;}}//以下是要找出线路中可换乘的车站for(k=0,m=k+1;k<lineNum-1;)//每条路线的站点与另一条路线的站点进行比较{for(i=0;i<busStationNum[k];i++)for(j=0;j<busStationNum[m];j++){if(line[k][i].busStationName==line[m][j].busStationName){line[k][i].take=true;line[m][j].take=true;}}if(m>=lineNum-1){k++;m=k;}m++;}}template<typename T>void Bus<T>::output(){cout<<"编码";cout<<"车站名称";cout<<"到下一站的距离";cout<<"是否可以乘换"<<endl;cout<<setiosflags(ios::left);for(int i=0;i<lineNum;i++){for(int j=0;j<busStationNum[i];j++){cout<<setw(6)<<line[i][j].number;cout<<setw(20)<<line[i][j].busStationName;cout<<setw(20)<<line[i][j].longer;if(line[i][j].take)cout<<"是"<<endl;elsecout<<"否"<<endl;}cout<<endl;}}template<typename T>void Bus<T>::findline(){int x,y,i,j,k,l,longers;longers=0;//x、y是起始和终止车站的编码;i、j是每个站点后两位编码;k是每个站点后两位编码的差值;l是转乘站点的后两位编码while(1){cout<<"请输入起始站点编号:";cin>>x;cout<<" 终止站点编号:";cin>>y;if((x/100)>lineNum||(x/100)<=0||(x%100)>=busStationNum[x/100-1]||(y/100)>lineNum ||(y/100)<=0||(y%100)>=busStationNum[y/100-1])//前两个是判断车站编码的首位的,第三个是判断车站编码的后两位的cout<<"----找不到您所输入站点,请重新输入!----"<<endl;elsebreak;}i=x%100;j=y%100;if((x/100)==(y/100)){cout<<"您可【0】次换乘到达目的地,路线如下:"<<endl;// k=j-i;if(j-i>0){for(k=0;k<j-i;k++){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k].longer;}cout<<line[x/100-1][x%100+k].busStationName<<endl;}else{for(k=0;k>j-i;k--){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k-1].longer;}cout<<line[x/100-1][x%100+k].busStationName<<endl;longers+=line[x/100-1][x%100+k].longer;}cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl; }else{string takeName[2][5];//存放两条路线上可转乘车站的名称;int takeNum[2][5];//存放两条路线上可转乘车站的编号;int a,b;//a、b是计数的for(a=0;a<2;a++)for(b=0;b<5;b++){takeName[a][b]=" ";takeNum[a][b]=0;}//遍历每条路线可换乘的站点for(a=0,b=0;a<busStationNum[x/100-1];a++)if(line[x/100-1][a].take){takeName[0][b]=line[x/100-1][a].busStationName;takeNum[0][b]=line[x/100-1][a].number;b++;}for(a=0,b=0;a<busStationNum[y/100-1];a++)if(line[y/100-1][a].take){takeName[1][b]=line[y/100-1][a].busStationName;takeNum[1][b]=line[y/100-1][a].number;b++;}//比较可换乘的站点是否有相同的,如果有,可以了一次换乘到达目的地;否则不可以bool nn=false;for(a=0;a<5;a++){for(b=0;b<5;b++){if(takeName[0][a]!=" "&&takeName[1][b]!=""&&takeName[0][a]==takeName[1][b]){cout<<"您可以【1】次换乘到达目的地(换乘点前面有“*”提示),为你选择的路线如下:"<<endl;l=takeNum[0][a]%100;if(l-i>0){for(k=0;k<l-i;k++){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k].longer;}cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";// money+=line[x/100-1][x%100+k].longer;}else{for(k=0;k>l-i;k--){cout<<line[x/100-1][x%100+k].busStationName<<"-->";longers+=line[x/100-1][x%100+k-1].longer;}cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";// money+=line[x/100-1][x%100+k].longer;}l=takeNum[1][b]%100;if(j-l>0){longers+=line[y/100-1][l].longer;for(k=1;k<j-l;k++){cout<<line[y/100-1][l+k].busStationName<<"-->";longers+=line[y/100-1][l+k].longer;}cout<<line[y/100-1][l+k].busStationName<<endl;}else{//money+=line[y/100-1][l-1].longer;for(k=-1;k>j-l;k--){cout<<line[y/100-1][l+k].busStationName<<"-->";longers+=line[y/100-1][l+k].longer;}cout<<line[y/100-1][l+k].busStationName<<endl;longers+=line[y/100-1][l+k].longer;}cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;nn=true;break;}else if(a==4&&b==4)cout<<"很抱歉,没有【0】次换乘或【1】次换乘可以到达目的地的路线!";}if(nn)break;}}//cout<<"还未写代码";}template<typename T>void Bus<T>::readfile(){ifstream infile("f1.txt",ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}infile>>lineNum;line=new Pointer[lineNum];//三条线路busStationNum=new int [lineNum];//每条线路的车站数for(int a=0;a<lineNum;a++){infile>>busStationNum[a];}for(int b=0;b<lineNum;b++)line[b]=new BusStation[busStationNum[b]];//依据每条线路的车站数创建每条线路for(int i=0;i<lineNum;i++)for(int j=0;j<busStationNum[i];j++){infile>>line[i][j].number;infile>>line[i][j].busStationName;infile>>line[i][j].longer;infile>>line[i][j].take;}cout<<"----读取成功----"<<endl;infile.close();}template <typename T>void Bus<T>::writefile(){ofstream outfile("f1.txt",ios::out);if(!outfile){cerr<<"open error!"<<endl;exit(1);}outfile<<lineNum<<" ";for(int a=0;a<lineNum;a++){outfile<<busStationNum[a]<<" ";}for(int i=0;i<lineNum;i++)for(int j=0;j<busStationNum[i];j++){outfile<<line[i][j].number<<" ";outfile<<line[i][j].busStationName<<" ";outfile<<line[i][j].longer<<" ";outfile<<line[i][j].take<<" ";}cout<<"----存入成功----"<<endl;outfile.close();}//////////////////////////////////////////////template <typename A>Administrator<A>::Administrator(){num=0;name=new string[num];mima=new string[num];}template<typename A>Administrator<A>::~Administrator(){num=0;delete [] name;delete [] mima;name=NULL;mima=NULL;}template<typename A>void Administrator<A>::readAdministrator() {ifstream infile("Administrator.txt",ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}infile>>num;name=new string[num];mima=new string[num];for(int i=0;i<num;i++){infile>>name[i]>>mima[i];}}template<typename A>void Administrator<A>::writeAdministrator() {ofstream outfile("Administrator.txt",ios::out);if(!outfile){cerr<<"open error!"<<endl;exit(1);}outfile<<num<<" ";for(int i=0;i<num;i++){outfile<<name[i]<<" ";outfile<<mima[i]<<" ";}}template<typename A>bool Administrator<A>::land(){string myname;string mymima;cout<<"请输入管理员帐号:";cin>>myname;cout<<" 密码:";char ch;while ((ch=getch())!=13) //输入密码时显示星号功能。
课程设计报告题目:武昌地区公交查询与换乘推荐课程名称:数据结构课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院任务书设计内容掌握图、查找、排序等数据结构的物理存储结构与基本算法,通过解决较复杂的基于图模型的实际问题,提高学生对数据结构知识综合运用的技能与实践能力。
设计要求(1)从互联网或相关资料获取可靠的武汉公交线路及其地理数据,通过线性结构与图模型对其进行表示,且以文件保存。
(2)图形方式显示上述图模型与求解结果。
(3)界面友好,实现的功能包括:录入与修改公交线路信息;查询所有线路信息(线路名号、起点、终点、首末车时间、票价规则),按线路名或起点站名排序;查询指定线路的详情(沿途站点、首末车时间、票价规则、站间距离等);查询某一位置途经的所有公交线路、指定起点与终点,推荐乘车方案(如要求换乘次数最少、路线最短或无要求条件等)。
参考文献[1] 严蔚敏, 吴伟民. 数据结构(C语言版). 北京: 清华大学出版社,1997[2] 严蔚敏, 吴伟民, 米宁. 数据结构题集(C语言版). 北京: 清华大学出版社,1999[3] 博客园,华山大师兄的博客,最短路径——Dijkstra算法和Floyd算法/biyeymyhjob/archive/2012/07/31/2615833.html#33 39167目录1 引言 (4)1.1 课题背景与意义 (4)1.1.1 公交出行 (4)1.2国内外研究现状 (4)1.3课程设计的主要研究工作 (4)2 系统需求分析与总体设计 (7)2.1系统需求分析 (7)2.2 系统总体设计 (7)3 系统详细设计 (8)3.1有关数据结构的定义 (8)3.2 主要算法设计 (9)4 系统实现与测试 (14)4.1 系统实现 (14)4.2 系统测试 (15)5 总结与展望 (21)5.1 全文总结 (21)5.1 工作展望 (22)6. 附录 (22)1 引言1.1课题背景与意义1.1.1 公交出行公交出行是现在城市生活中必不可少的一种出行方式。
公交线路换乘系统设计方案一、引言随着城市规模的不断扩大和人口增长的加速,公交交通作为一种重要的城市公共交通方式,承担着越来越多的出行需求。
然而,由于公交线路的复杂性和出行人数的增加,公交换乘所带来的不便已成为很多城市居民的痛点。
因此,设计一套高效便捷的公交线路换乘系统具有重要意义。
二、系统概述公交线路换乘系统是一种基于计算机技术的智能交通系统,旨在提供快速、准确和便捷的公交换乘方案。
该系统通过收集和处理公交线路数据、交通流量数据、用户出行数据等信息,利用算法和模型优化公交线路,以提高公交换乘的效率和用户体验。
三、系统功能1. 数据采集和处理:系统需要收集公交线路、站点、交通流量等数据,并对数据进行处理和整理,以便后续的换乘优化和查询功能。
2. 换乘优化:基于用户出行数据和交通流量数据,系统可以通过算法和模型计算出最优的换乘方案,包括最短时间、最少换乘次数、最少步行距离等多个指标。
3. 查询和推荐:系统可以提供用户查询和推荐功能,用户可以根据自身需求输入起点和终点,系统将根据算法和模型提供最佳的换乘方案,并提供乘车时间、换乘站点、步行距离等相关信息。
4. 实时更新:系统可以实时更新公交线路数据和交通流量数据,以保证换乘方案的准确性和时效性。
5. 用户反馈:系统可以提供用户反馈和评价功能,用户可以对换乘方案进行评价和意见反馈,以便系统进行优化和改进。
四、系统设计1. 数据采集和处理:系统需要与公交运营公司合作,获取实时的公交线路、站点和交通流量数据。
采集到的数据将会通过数据处理模块进行清洗和整理,以便后续的计算和查询。
2. 换乘优化:系统将根据用户出行数据和交通流量数据建立模型,并运用优化算法对公交线路进行优化。
优化的目标可以是最短时间、最少换乘次数、最少步行距离等,以提供用户最优的换乘方案。
3. 查询和推荐:系统提供用户输入起点和终点的查询功能,通过模型和算法计算出最佳的换乘方案,并将结果展示给用户。
数据结构程序设计课程设计题目公交换乘系统专业学号姓名指导老师完成日期2010年6月17日目录1.公车换乘流程图 (3)2.数据储存结构 (4)3. 程序 (4)4.分析..................................................................................... (16)5. 总结..................................................................................... . (18)一、公车换乘流程图二、数据存储结构Ⅰ线路信息:定义在结构体中①经过站点的所有公交路线,采用整型的1维的数组;数组长度为默认为50。
②字串符指向下一站和最后一站。
struct str //定义双重链表{char s[50];str *next;str *last;};Ⅱ站点信息:定义在结构体中①经过该站点的路线条数。
是一个整型变量。
②把该站作为所要求路线的第一站。
struct location//定义一个结构体来保存车站位置{int i;str *first;};三、程序location Find(str *pos,char *s)//查找车站位置{//初始化基本信息int i=0;location f;f.first=NULL;f.i=0;str *p=pos;//查找车站的位置while(p){if(::strcmp (s,p->s)==0){f.first =p;f.i=i;//车站的位置return f;}i++;p=p->next;}return f;}char car1[50],car2[50]; //保存相交车站的信息int public_car(str *i,str * p1)//查找两线线路是否有公共车站以及公共车站个数{int k=0;char *a;str *p=i;str *j=p1;//利用循环来判断两个公交车线路上是否有相同的车站while(p){a=p->s;j=p1;while(j){if(::strcmp (a,j->s)==0) //比较两个结点信息是否相同{if(k==0){::strcpy (car1,a);//用car1保存第一公共车站k++;break;}if(k==1){::strcpy (car2,a);//用car2保存第二公共车站k++;break;}}j=j->next ;}if(k==2) break;//因为最多只有两个相交车站,如果k=2了,跳出循环p=p->next ;}return k;}//初始化暂存信息的数据结点int s1,s2,k1,k2;location f, x1,x2,y1,y2;int count1,count2;//用于计算车站的个数char B[50],C[50];//用于保存用户输入的车站信息str *A,*p=NULL;str **Str=new str*[3];//定义三条链表保存公交车基本信息char station1[20][50],station2[20][50];//当有两个车站线路时用于保存每个车站线路的信息void setData()//初始化基本数据的涵数{count1=0;count2=0;s1=-1,s2=-1,k1=-1,k2=-1;x1.first=NULL;x2.first=NULL;y1.first=NULL;y2.first =NULL;}void printAllStationLine()//打印全部线路的函数{ //初始化保存车站的数组char a[][50]={"农垦医院站","潜水运动站","海滨宾馆站","海上城市站","市旅游总公司站","霞湖医院站","海运集团公司站"};char b[][50]={"东华站","湾桥站","农垦医院站","啤酒厂站","俱乐部站","广医附院站","国贸站", "广州湾站","建新东路站","霞湖医院站","霞山汽车运输总站"};char c[][50]={"海滨医院站","海滨宾馆站","儿童公园站","广州湾站","建设路站", "湛江汽车南站","人民大道中巴专线","世纪广场站"};//利用循环打印车站列表for(int i=0;i<3;i++){Str[i]=NULL;//初始化第i个链表if(i==0)//初始化第一条公交车线路链表{for(int k=0;k<7;k++){A=new str;A->next =NULL;A->last =NULL;strcpy(A->s,a[k]);//把数组的数据保存到链表的每一个结点if(!Str[i]){Str[i]=A;p=A;}else {p->next =A;A->last =p;p=A;}}}if(i==1)//初始化第二条公交车线路链表{for(int k=0;k<11;k++){A=new str;A->next =NULL;A->last =NULL;strcpy(A->s,b[k]);if(!Str[i]){S tr[i]=A;p=A;}else{p->next =A;A->last =p;p=A;}}}if(i==2)//初始化第三条公交车线路链表{for(int k=0;k<8;k++){A=new str;A->next =NULL;A->last =NULL;strcpy(A->s,c[k]);if(!Str[i]){Str[i]=A;p=A;}else{p->next =A;A->last =p;p=A;}}}}printf("\n ~~~~~~~~欢迎您的使用~~~~~~~~~ \n");printf("\n***************************湛江市公交车线路换乘系统*****************************\n");for(i=0;i<3;i++)//打印输出车站列表{printf("\n-----------------------------第%d条路线的车站列表-----------------------------\n",i+1);p=Str[i];while(p->next){printf("%s->",p->s);p=p->next;}printf("%s\n",p->s);}printf("\n************************************************************ ********************\n");}void prinftTheBestWay(){//打印最优线路的信息printf("最优路线:\n");printf("\n-------------------从%s 到%s 路线列表-------------------\n",B,C);if(count1<count2)//比较线路1和线路2的车站个数{for(int j=0;j<count1;j++){printf("%s",station1[j]);if(j!=count1-1)printf("->");}}else{for(int j=0;j<count2;j++){printf("%s",station2[j]);if(j!=count2-1)printf("->");}}}void printfChooseStationLine()//打印客户选择的线路路线{while(1)//利用循环等待用户输入数据{setData();cout<<"\n请输入开始地和目的地(输入0 0 表示结束):";// scanf("%s%s",B,C);//用户输入两个车站数据cin>>B>>C;if(::strcmp (B,"0")==0&&::strcmp (C,"0")==0)break;//输入法0 0表示结束查询cout<<("\n****************************用户自选公交路线列表********************************\n");//printf("起点: %s\n终点: %s\n",B,C);cout<<"起点站:"<<B<<endl;cout<<"终点站:"<<C<<endl;for(int i=0;i<3;i++){p=Str[i];f=Find (p,B);//查找输入的第一个车站的位置if(f.first){if(s1==-1){x1=f;//保存第一个车站在线路的位置s1=i;//保存第一个车站在哪条线路上}else //因为有时车站可能是两条线路的公交点,因此可能会出现车站在两条线路上的情况{x2=f ;//保存车站在线路的位置s2=i;//保存车站在哪条线路上}}f=Find(p,C);//查找输入的第二个车站的位置,下面与上面功能类同if(f.first ){if(k1==-1){y1=f;k1=i;}else{k2=i;y2=f ;}}}if(s1==k1)//当s1=k1时候,表时两个车站在同一条公交线路上{cout<<"在"<<s1+1<<"条路线上,是零次换乘,经过的车站是:"<<endl;cout<<endl<<"------------------------从"<< B<<"到"<<C<<"路线列表---------------------"<<endl;if(x1.i<y1.i)//当输入的第一个车站的位置比第二个车站的位置小时,按顺序打印车站列表{p=x1.first;while(p!=y1.first){count1++;cout<<p->s<<"->";p=p->next ;}count1++;cout<<p->s<<endl;cout<<endl<<"经过的站点数目:"<<count1<<endl;cout<<endl<<"-------------------------------------"<<endl;}else //当输入的第一个车站的位置比第二个车站的位置大时,按逆序打印车站列表{p=y1.first ;while(p!=y1.first){count1++;cout<<p->s<<"->";p=p->last ;}cout<<p->s<<endl;cout<<endl<<"经过的站点数目:"<<count1<<endl;cout<<endl<<"-------------------------------------"<<endl;}}else//当s1!=k1时候,表时两个车站在两条公交线路上{i=::public_car (Str[s1],Str[k1]);//两个公交线路车站的个数if(i==0) //表示公交线路线没有公交点,不过本例不存在这种情况{cout<<B<<"->"<<C<<"不存在的通路"<<endl;continue;}else if(i==1)//如果两条公交线路的有一个公交车站{cout<<"在"<<s1+1<<","<<k1+1<<"条路线上,经一次换乘,经过的车站是:"<<endl;cout<<endl<<"--------------------从"<<B<<" 到"<<C<<" 路线列表----------------------"<<endl;f=Find(Str[s1],car1);//在第一条公交线路上找公交站点位置if(x1.i<f.i)//当输入的第一个车站的位置比公交车站的位置小时,按顺序打印车站列表{p=x1.first;while(::strcmp (car1,p->s))//当还没有打印到公交车站时,继续打印{count1++;cout<<p->s<<"->";p=p->next ;}cout<<p->s<<"->";}else//当输入的第一个车站的位置比公交车站的位置大时,按逆序打印车站列表{p=x1.first;while(::strcmp (car1,p->s)){count1++;cout<<p->s<<"->";p=p->last ;}cout<<p->s<<"->";}f=Find(Str[k1],car1);//在第二条公交线路上找公交站点位置,下面功能与上面类同if(y1.i>f.i){p=f.first;p=p->next;while(p!=y1.first)//当还没有打印到公交车站时,继续打印,与上面while语句一样功能的,只不过不同表述{count1++;cout<<p->s<<"->";p=p->next ;}cout<<p->s<<endl;}else{p=f.first;p=p->last ;while(p!=y1.first){count1++;cout<<p->s<<"->";p=p->last ;}cout<<p->s<<endl;}cout<<endl<<"经过的车站数目是:"<<count1<<endl;cout<<"\n-------------------------------------\n";}else if(i==2)//如果两条公交线路的有两个公交车站时,下面的功能与上面的类同{cout<<"有两种方案:\n";cout<<"第一种方方案:\n在"<<s1+1<<","<<k1+1<<"路线上,经一次换乘,经过的车站是:\n";cout<<"\n--------------------从"<<B<<"到"<<C<<"路线列表----------------------\n";f=Find(Str[s1],car1);if(x1.i<f.i){p=x1.first;while(::strcmp (car1,p->s)){strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";p=p->next ;}strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";}else{p=x1.first ;while(::strcmp (car1,p->s)){strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";p=p->last ;}strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";}f=Find(Str[k1],car1);if(y1.i>f.i){p=f.first;p=p->next;while(p!=y1.first){strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";p=p->next ;}strcpy(station1[count1],p->s);count1++;cout<<p->s<<endl;cout<<"\n经过车站的数目:"<<count1<<endl;cout<<"\n-------------------------------------\n"; }else{p=y1.first;p=p->next;while(p!=y1.first){strcpy(station1[count1],p->s);count1++;cout<<p->s<<"->";p=p->last;}strcpy(station1[count1],p->s);count1++;cout<<p->s<<endl;cout<<"\n经过车站的数目:"<<count1<<endl;cout<<"\n-------------------------------------\n"; }cout<<"\n第二种方方案:\n在"<<s1+1<<","<<k1+1<<"条路线上,是一次换乘,经过的车站是:\n";cout<<"\n-------------------从"<<B<<"到"<<C<<"路线列表-------------------\n";f=Find(Str[s1],car2);if(x1.i<f.i){p=x1.first;while(::strcmp (car2,p->s)){strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";p=p->next ;}strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";}else{p=x1.first ;while(::strcmp (car2,p->s)){strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";p=p->last ;}strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";}f=Find(Str[k1],car2);if(y1.i>f.i){p=f.first;p=p->next;while(p!=y1.first){strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";p=p->next ;}strcpy(station2[count2],p->s);count2++;cout<<p->s<<endl;}else{p=y1.first;p=p->next;while(p!=y1.first){strcpy(station2[count2],p->s);count2++;cout<<p->s<<"->";p=p->last ;}strcpy(station2[count2],p->s);count2++;cout<<p->s<<endl;}cout<<"\n经过的车站的数目:"<<count2<<endl;cout<<"\n-------------------------------------\n";}prinftTheBestWay();cout<<("\n******************************************************** ************************\n");}}};int main(int argc, char* argv[]){printAllStationLine();printfChooseStationLine();return 0;}四、分析(1)首先初始化公交车线路链表,以下为初始化第一条公交车线路链表,第二、第三也基本一致。