C++公交查询系统报告

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

题目:公交查询系统
一、需求分析与任务定义
需求分析:公交信息包括车辆信息与路线信息。

根据已知的的路线信息,要输出该路线所经过的所有站点信息;.根据输入的站点信息,输出经过该站点的所有公交路线信息;对于用户来说,任意输入两个站台,可以得出两站台之间的所有可实现到达的路线选择,即乘多少路在那个站点转乘另外一路。

任务定义:实现本程序需要解决以下几个问题:
1.怎样实现对众多的线路与站点信息进行存储。

2.如何进行文本文件的读取。

3.怎样实现对按不同关键字的查找,其查找过程按何种算法比较节省空间是时间。

4.如何实现换乘问题中换乘中转站点的确定,和所乘路线。

问题的关键和难点在于节点信息的存储于查找。

设计要求:a.节点信息使用结构体进行存储。

b.将所有节点信息保存在文本文件中。

c.能按不同关键字(路线、站点)进行查找。

d.设置一个返回返回查找到的特定站点节点在内存的地址station *u的函数e.换乘问题中采取调用查找函数的方法来找出中转站点。

二、数据结构的选择和概要设计
数据结构的选择:对于公交信息的存取,定义结构体数据类型来表示公交站点。

以站点为主要节点信息进行存储,在站点前定义一个主参考路线,之后定义一个存储辅助路线的数组,在该数组中,如果经过该站点还有其他公交路线,就在数组中存储起来,反之就以-1来代替存储。

数据类型如下:
typedef struct node //定义一个公交站点的数据类型
{
int mainline; //用于存储主线路
char station_name[20];//用于存储站点名称
int line[MAX]; //用于存储辅线路,即经过该站点的其他公交线路
struct node *forward,*next;//用双向链表存储该节点
}station;
typedef struct Head //定义一个存储所有公交线路头结点的数据类型
{
station *Line[400];
int length; //记录所有公交线路的长度
}Headpoint;
概要设计:定义双向链表存储上面定义的结构体节点。

建立好上面的链表以后,分别进行不同函数模块的设计;然后要在主函数中将个函数集结一体。

最后屏幕输出菜单指导操作。

流程图:
查找部分流程图:1公交查询系统总流程图:
2公交站点查询程图:
3公交线路查询流程图:
4公交换乘方案流程图:
图2 站点查询中遇到的中转一次问题流程图本程序中包含的函数及其性能:
char menu() //用户菜单函数,返回值是字符型
Headpoint *f_duqu()//从文件中读出信息,返回读出信息在内存中的地址
void zhandianchazhao()//站点查询函数;显示经过该站点的公交线路
void xianluchazhao()//公交线路查询模块,查询某线路经过的公交站点
station * zhandianchazhao(Headpoint *H,char station_name[20])
/*在公交信息中查找到特定的公交站点;公交信息在内存的地址和特定站点名称Headpoint *H,char station_name[20];并返回查找到的特定站点节点在内存的地址station *u
*/
int gongzhandianchazhao(Headpoint *H,int line1,int line2,char start[20],char end[20])
//查找公共站点
void buschange()//公交换乘函数
void main()//主函数
三、详细设计和编码
实现概要设计中定义的所有的数据类型,对每个操作给出相应的伪码算法
1.本程序所需用到的全局变量和相关数据类型的定义及其结点类型与指针类型。

#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"windows.h"
#include"conio.h"
#define MAX 20 //MAX为辅助路线存储数组的最大存储空间
typedef struct node //定义一个公交站点的数据类型
{
int mainline; //用于存储主线路
char station_name[20];//用于存储站点名称
int line[MAX]; //用于存储辅线路,即经过该站点的其他公交线路
struct node *forward,*next;//用双向链表存储该节点
}station;
typedef struct Head //定义一个存储所有公交线路头结点的数据类型
{
station *Line[400];
int length; //记录所有公交线路的长度
}Headpoint;
2.从文件中读取信息,建立双向循环链表
为头指针H动态申请存储空间,H->length初始化为0,为站点L动态申请存储空间,其前后指针分别初始化为空,即L->forward=NULL;L->next=NULL;然后打开文件,同时动态申请站点s的存储空间,并循环进行读取赋值。

L->length循环记录路线的长度。

在函数
的最后返回头指针H。

部分代码如下:
FILE *fp;
station *L,*s,*p,*u;
Headpoint *H;
H=(Headpoint *)malloc(sizeof(Headpoint)); //为头指针动H态申请存储空间
H->length=0;
L=(station *)malloc(sizeof(station)); //为站点
L->forward=NULL;
L->next=NULL;
p=L;
fp=fopen("bus_station.txt","r"); //只读式打开文件
while(!feof(fp)){
s=(station*)malloc(sizeof(station));
s->forward=NULL;
s->next=NULL;
fscanf(fp,"%d%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&s->ma inline,
&s->station_name,&s->line[0],&s->line[1],&s->line[2],
&s->line[3],&s->line[4],&s->line[5],&s->line[6],&s->line[7],
&s->line[8],&s->line[9],&s->line[10],&s->line[11],&s->line[12],
&s->line[13],&s->line[14],&s->line[15],&s->line[16],&s->line[17],
&s->line[18],&s->line[19]);
if(L->next==NULL){
H->Line[H->length]=L;
H->length++; //记录路线长度
}
else if(p->mainline!=s->mainline){
u=(station*)malloc(sizeof(station));
u->forward=NULL;
u->next=NULL;
L=u;
p=L;
H->Line[H->length]=L;
H->length++;
}
s->forward=p;
s->next=NULL;
p->next=s;
p=s;
}
fclose(fp);
return H;
}
3.按路线查找所经过站点函数
使用顺序查找算法,依据路线关键字进行查找,输出所有的相关站点。

在循环体for(i=0;i<H->length;i++) 下p=H->Line[i]->next;i如果p->mainline==line则查找成功,记录该节点,同时设置变量flag=1。

在flag=1的条件下将该节点的站点信息输出。

最后设置是否继续查找的控制while语句。

部分代码如下:
int line,i,flag=0;
Headpoint *H;
H=f_duqu(); //从数据文件中读取公交车线路信息
station *p;
char ch;
while(1){
printf("请输入线路(如要查询1路输入1):"); //提示用户输入公交线路
fflush(stdin);
scanf("%d",&line);
if(H->length==0)
{
printf("系统中未存储任何公交线路信息!\n");
}
else
{
for(i=0;i<H->length;i++) //顺序查找与line相匹配的主路线
{
p=H->Line[i]->next;
if(p->mainline==line)
{
flag=1;
break;
}
}
}
if(flag==0)
printf("无此线路!\n");
else
{
printf("%d经过的站点是:\n",line);
while(p!=NULL) //显示公交线路经过的站点
{
if(p->next==NULL)
printf("%s",p->station_name);
else
printf("%s ",p->station_name);
p=p->next;
}
}
printf("\n是否继续查找线路?(Y/N)...");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入...");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
}
5.按站点查找所经过该站点的所有公交路线
使用顺序查找算法,依据站点关键字进行查找,输出所有的相关路线。

用gets(station_name)获取用户输入站点信息;在循环语句for(int i=0;i<h->length;i++)/下比较查找站点。

p=h->Line[i]->next;当while(p!=NULL);当if(strcmp(station_name,p->station_name)!=0)记录该节点,同时设置变量flag=1。

在flag=1的条件下将该节点的路线信息输出。

输出循环语句:for(int j=0;j<MAX;j++) {
if(u->line[j]!=-1)printf("%d\t",u->line[j]);}
最后设置是否继续查找的控制while语句。

在处理方法上类似按路线查找函数。

部分代码如下:
void zhandianchazhao()
{
station *p,*u;
Headpoint *h;
char ch;
h=f_duqu(); //从数据文件中读取公交车线路信息
char station_name[20];
int flag=0;
while(1){
if(h->length==0){
printf("系统中未存储任何公交线路站点信息!\n");
return;
}
else
{
printf("请输入你要查找的站点:");
fflush(stdin); //清除文件缓冲区
gets(station_name);//获取用户输入站点信息
for(int i=0;i<h->length;i++)//比较查找站点
{
p=h->Line[i]->next;
while(p!=NULL)
{
if(strcmp(station_name,p->station_name)!=0)//包含在string.h,不匹配,继续查找下个节点
p=p->next;
else
{
flag=1;
u=p;
break;//匹配即跳出
}
}
}
}
if(flag==1)
{
printf("经过“%s”站的公交线路有:\n",u->station_name);
printf("%d\t",u->mainline);
for(int j=0;j<MAX;j++) //循环输出路线
{
if(u->line[j]!=-1)
printf("%d\t",u->line[j]);
else
printf("");
}
printf("\n");
}
else
printf("无此站点\n");
printf("\n是否继续查找?(Y/N)...:");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入:");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
6.带有返回值的站点查找函数
在公交信息中查找到特定的公交站点;公交信息在内存的地址和特定站点名称Headpoint *H,char station_name[20];并返回查找到的特定站点节点在内存的地址station *u。

这个函数在下面的公共站点的查询和换乘函数中具有调用。

部分代码如下:
station *p,*u;
int flag=0;
for(int i=0;i<H->length;i++)//比较查找站点
{
p=H->Line[i]->next;
while(p!=NULL)
{
if(strcmp(station_name,p->station_name)!=0)//包含在string.h,不匹配,继续查找下个节点
p=p->next;
else {flag=1;u=p;break;}//匹配即跳出
}
}
if(flag==1)
{
printf("经过站点: %s 的公交线路有:\n",u->station_name);
printf("%d\t",u->mainline);
for(int j=0;j<10;j++)
{
if(u->line[j]!=-1)
printf("%d\t",u->line[j]);
else
printf("");
}
printf("\n");
}
else
{
printf("无此站点,输入错误!\n");
buschange();
}
return u;
}
7.公共站点查询函数
这个函数模块是为了在下面一个换乘问题中准备的。

对于输入的起始站与终点站,首先要考察分别在那些路线上,对于这些路线,是否有相同的,如果有即说明其不用换乘可以直
达。

当不在同一路线上时,要分别对其经过的路线进行考察,看其中路线中是不是有相同的重复站点信息;如有就从该站点换乘。

函数中的控制语句如下:while(u!=NULL){ while(s!=NULL)
{f(strcmp(u->station_name,s->station_name)!=0) 如果匹配就记录。

部分代码如下:
int i,flag=0,flag1=0;
station *p,*q,*u,*u1,*s,*s1;
for(i=0;i<H->length;i++) //顺序查找与line1相等的主路线
{
p=H->Line[i]->next;
if(line1==p->mainline)
{
u=p;
}
}
for(i=0;i<H->length;i++) //顺序查找与line2相等的主路线
{
q=H->Line[i]->next;
if(line2==q->mainline)
{
s1=s=q;
}
}
while(u!=NULL)
{
while(s!=NULL)
{
if(strcmp(u->station_name,s->station_name)!=0) //如果不匹配,继续查找下个节点
{
s=s->next;
}
else
{
u1=s;flag=1;
printf("\n从起始站点: %s 乘坐%d 路到%s 后换乘%d 路即可到达终止站点: %s\n",start,u->mainline,u->station_name,u1->mainline,end);
return flag;
}
}
if(s==NULL){s=s1;}
u=u->next;
}
8.公交换乘函数
根据用户输入的两公交站点,给出可乘方法。

分别调用上述带有返回值的站点查询函数和公共站点查询函数。

要考虑其可以直接到达与换乘两种情况。

当换乘超过两次就无法实现。

部分代码如下:
Headpoint *H;
H=f_duqu(); //从数据文件中读取公交车线路信息
station *p,*q;
char start[20],end[20],ch;
int flag=0;
while(1){
if(H->length==0){
printf("系统中未存储任何公交线路站点信息!\n");
return;
}
else
{
printf("请输入起始站点:");
fflush(stdin);
gets(start);//输入起始站名信息
p=zhandianchazhao(H,start);//调用站点查询函数
fflush(stdin);
printf("请输入终止站点:");
gets(end);//输入终点站名信息
q=zhandianchazhao(H,end); //调用站点查询函数
}
printf("\n注意:换乘次数大于2次以上,系统无法完成!\n\n");
int a[11],b[11],c[11]; //分别记录两站点所经过的公交路线
a[0]=p->mainline,b[0]=q->mainline;
for(int i=1;i<11;i++)
{
a[i]=p->line[i-1];
b[i]=q->line[i-1];
}
int count=-1;
for(i=0;i<11&&a[i]!=-1;i++) //考察两站点是否同一路线上
for(int j=0;j<11&&b[j]!=-1;j++)
if(a[i]==b[j]) //两站点在同一路线上
{
flag=1;
count++;
c[count]=a[i];
}
if(flag)
for(int k=0;k<=count;k++)
printf("您可以通过乘坐%d 路公交线路到达终点站: %s\n",c[k],end);
else
{
int k=0;
for(int m=0;m<11&&a[m]!=-1;m++) //当两站点不在同一路线上,调用查找公共站点函数
for(int n=0;n<11&&b[n]!=-1;n++)
{
k=gongzhandianchazhao(H,a[m],b[n],start,end);
}
if(!k)
printf("");
}
printf("\n是否继续查找线路?(Y/N)...");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入...");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
}
9.菜单函数
通过写printf语句输出一些简明的操作提示语句。

代码如下:
char menu()//用户菜单函数,返回值是字符型
{
char choice;
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("\t 欢迎使用公交查询系统\n\n");
printf("\t 1 公交线路查询\n\n");
printf("\t 2 公交站点查询\n\n");
printf("\t 3 公交站点换乘\n\n");
printf("\t 4 退出查询系统\n\n");
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请选择操作:");
fflush(stdin);
scanf("%c",&choice);
while(choice!='1'&&choice!='2'&&choice!='3'&&choice!='4')
{
printf("无此功能,请重新选择:");
fflush(stdin);
scanf("%c",&choice);
}
10.主函数
将上面的所有函数有机的整合在一起,通过switch()语句分条实现这些函数,并让其与菜单提示语相匹配。

部分代码如下:
for(;ch!='4';) //ch='4'跳出死循环
{
system("cls");
ch=menu();
switch(ch)
{
case '1':xianluchazhao(); break; //调用路线查找函数
case '2':zhandianchazhao(); break; //调用站点查询函数
case '3':buschange(); break; //调用站点换乘函数
case '4':system("cls"); //结束程序
printf("谢谢您的使用!再见!");
break;
四、上机调试
运行环境(软硬件环境)
硬件:能够支持运行Visual Studio 6.0
软件:windows XP,Visual Studio 6.0
开发工具和编程语言
开发工具:Visual Studio 6.0
编程语言:C语言
复杂度的分析:对于本程序的总体的空间复杂度相对来说不算高;时间复杂度:a.查找函数由于使用的是顺序查找算法,所以其复杂度均为O(n);b,换乘函数调用查找函数和本身循环,所以其复杂度为O(n2)。

五、测试结果及分析
在上述运行环境下运行程序,会相继得到下面的各种运行结果。

按提示语进行操作;
如在主菜单选项下,选择1会进入“公交线路查询”功能选项下,再次按提示语操输入要查询的公交路线,如8路就输入8,就会显示8路所经过的站点。

图3 运行操作主菜单界面图4 路线查找功能
图5 路线查找功能
图6 站点查找函数
图7 一次换乘
图8 直接抵达
六、用户使用说明
用户运行程序后,按操作界面的菜单和提示语进行操作,即可实现相关功能。

如1、公交线路:用户输入公交线路,系统显示出该线路的所有站点。

2、公交站点:用户输入一个公交站点,系统查询经过该站点的所有线路的公交车,并把结果显示给用户。

3、站点换乘:用户输入公交站的起始站和终点站,系统自动搜索乘车线路和换乘方法,并把所有的乘车方法显示出来给用户。

在有些功能实现上可能有些问题,如换乘不能超过两次,这是我们的开发缺陷。

七、参考文献
[1] 王昆仑,李红.数据结构与算法. 北京:中国铁道出版社,2006年5月。

[2] 徐孝凯,等.数据结构使用教程. 北京:清华大学出版社,2004年4月。

[3] 胡学钢,数据结构.北京:高等教育出版社,2006年9月。

[4] 何钦铭,颜晖。

C语言程序设计.北京:高等教育出版社,2008年 3月。

[5] 耿国华,等.数据结构:C语言描述.西安:西安电子科技大学出版社,2004年11月。

八、附录:
源代码:
/*
公交查询系统源代码
此文件中包含改程序的所有代码;
用户模块的子模块包括:公交换乘、公交线路、公交站点.
*/
#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"windows.h"
#include"conio.h"
#define MAX 20 //MAX为辅助路线存储数组的最大存储空间
typedef struct node //定义一个公交站点的数据类型
{
int mainline; //用于存储主线路
char station_name[20];//用于存储站点名称
int line[MAX]; //用于存储辅线路,即经过该站点的其他公交线路
struct node *forward,*next;//用双向链表存储该节点
}station;
typedef struct Head //定义一个存储所有公交线路头结点的数据类型
{
station *Line[400];
int length; //记录所有公交线路的长度
}Headpoint;
void qianxu()
{printf("\n\n * * * * * * * * *欢迎您使用公交查询系统* * * * * * * * *\n");
printf("\n\t本程序能为你实现对公交路线的查询、站点查询和公交换乘问题!\n"); printf("\t用户可以直接按提示语进行简单操作; 程序中可能无法实现对复\n");
printf("\t杂问题解决,请用户谅解! 谢谢! \n");
printf("\t制作人:胡和佩晋超杨阳\n");
printf("\n\n按任意键继续!");
}
char menu()//用户菜单函数,返回值是字符型
char choice;
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("\t 欢迎使用公交查询系统\n\n");
printf("\t 1 公交线路查询\n\n");
printf("\t 2 公交站点查询\n\n");
printf("\t 3 公交站点换乘\n\n");
printf("\t 4 退出查询系统\n\n");
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请选择操作:");
fflush(stdin);
scanf("%c",&choice);
while(choice!='1'&&choice!='2'&&choice!='3'&&choice!='4')
{
printf("无此功能,请重新选择:");
fflush(stdin);
scanf("%c",&choice);
}
return choice; //返回选择值
}
Headpoint *f_duqu(){ //从文件中读出信息,返回读出信息在内存中的地址
FILE *fp;
station *L,*s,*p,*u;
Headpoint *H;
H=(Headpoint *)malloc(sizeof(Headpoint)); //为头指针动H态申请存储空间
H->length=0;
L=(station *)malloc(sizeof(station)); //为站点
L->forward=NULL;
L->next=NULL;
p=L;
fp=fopen("bus_station.txt","r"); //只读式打开文件
while(!feof(fp)){
s=(station*)malloc(sizeof(station));
s->forward=NULL;
s->next=NULL;
fscanf(fp,"%d%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&s->ma inline,
&s->station_name,&s->line[0],&s->line[1],&s->line[2],
&s->line[3],&s->line[4],&s->line[5],&s->line[6],&s->line[7],
&s->line[8],&s->line[9],&s->line[10],&s->line[11],&s->line[12],
&s->line[13],&s->line[14],&s->line[15],&s->line[16],&s->line[17],
&s->line[18],&s->line[19]);
if(L->next==NULL){
H->Line[H->length]=L;
H->length++; //记录路线长度}
else if(p->mainline!=s->mainline){
u=(station*)malloc(sizeof(station));
u->forward=NULL;
u->next=NULL;
L=u;
p=L;
H->Line[H->length]=L;
H->length++;
}
s->forward=p;
s->next=NULL;
p->next=s;
p=s;
}
fclose(fp);
return H;
}
//站点查询函数;显示经过该站点的公交线路
void zhandianchazhao()
{
station *p,*u;
Headpoint *h;
char ch;
h=f_duqu(); //从数据文件中读取公交车线路信息
char station_name[20];
int flag=0;
while(1){
if(h->length==0){
printf("系统中未存储任何公交线路站点信息!\n");
return;
}
else
{
printf("请输入你要查找的站点:");
fflush(stdin); //清除文件缓冲区
gets(station_name);//获取用户输入站点信息
for(int i=0;i<h->length;i++)//比较查找站点
{
p=h->Line[i]->next;
while(p!=NULL)
{
if(strcmp(station_name,p->station_name)!=0)//包含在string.h,不匹配,继续查找下个节点
p=p->next;
else
{
flag=1;
u=p;
break;//匹配即跳出
}
}
}
}
if(flag==1)
{
printf("经过“%s”站的公交线路有:\n",u->station_name);
printf("%d\t",u->mainline);
for(int j=0;j<MAX;j++) //循环输出站点
{
if(u->line[j]!=-1)
printf("%d\t",u->line[j]);
else
printf("");
}
printf("\n");
}
else
printf("无此站点\n");
printf("\n是否继续查找?(Y/N)...:");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入:");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
}
void xianluchazhao()//公交线路查询模块,查询某线路经过的公交站点
{
int line,i,flag=0;
Headpoint *H;
H=f_duqu(); //从数据文件中读取公交车线路信息
station *p;
char ch;
while(1){
printf("请输入线路(如要查询1路输入1):"); //提示用户输入公交线路
fflush(stdin);
scanf("%d",&line);
if(H->length==0)
{
printf("系统中未存储任何公交线路信息!\n");
}
else
{
for(i=0;i<H->length;i++) //顺序查找与line相匹配的主路线
{
p=H->Line[i]->next;
if(p->mainline==line)
{
flag=1;
break;
}
}
}
if(flag==0)
printf("无此线路!\n");
else
{
printf("%d经过的站点是:\n",line);
while(p!=NULL) //显示公交线路经过的站点
{
if(p->next==NULL)
printf("%s",p->station_name);
else
printf("%s ",p->station_name);
p=p->next;
}
}
printf("\n是否继续查找线路?(Y/N)...");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入...");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
}
void buschange(); //对station_change()进行提前声明
/*在公交信息中查找到特定的公交站点;公交信息在内存的地址和特定站点名称
Headpoint *H,char station_name[20];并返回查找到的特定站点节点在内存
的地址station *u
*/
station * zhandianchazhao(Headpoint *H,char station_name[20])
{
station *p,*u;
int flag=0;
for(int i=0;i<H->length;i++)//比较查找站点
{
p=H->Line[i]->next;
while(p!=NULL)
{
if(strcmp(station_name,p->station_name)!=0)//包含在string.h,不匹配,继续查找下个节点
p=p->next;
else {flag=1;u=p;break;}//匹配即跳出
}
}
if(flag==1)
{
printf("经过站点: %s 的公交线路有:\n",u->station_name);
printf("%d\t",u->mainline);
for(int j=0;j<10;j++)
{
if(u->line[j]!=-1)
printf("%d\t",u->line[j]);
else
printf("");
}
printf("\n");
}
else
{
printf("无此站点,输入错误!\n");
buschange();
}
return u;
}
int gongzhandianchazhao(Headpoint *H,int line1,int line2,char start[20],char end[20])//查找公共站点
{
int i,flag=0,flag1=0;
station *p,*q,*u,*u1,*s,*s1;
for(i=0;i<H->length;i++) //顺序查找与line1相等的主路线
{
p=H->Line[i]->next;
if(line1==p->mainline)
{
u=p;
}
}
for(i=0;i<H->length;i++) //顺序查找与line2相等的主路线
{
q=H->Line[i]->next;
if(line2==q->mainline)
{
s1=s=q;
}
}
while(u!=NULL)
{
while(s!=NULL)
{
if(strcmp(u->station_name,s->station_name)!=0) //如果不匹配,继续查找下个节点
{
s=s->next;
}
else
{
u1=s;flag=1;
printf("\n从起始站点: %s 乘坐%d 路到%s 后换乘%d 路即可到达终止站点: %s\n",start,u->mainline,u->station_name,u1->mainline,end);
return flag;
}
}
if(s==NULL){s=s1;}
u=u->next;
}
return flag;
}
void buschange() //公交换乘函数
{
Headpoint *H;
H=f_duqu(); //从数据文件中读取公交车线路信息
station *p,*q;
char start[20],end[20],ch;
int flag=0;
while(1){
if(H->length==0){
printf("系统中未存储任何公交线路站点信息!\n");
return;
}
else
{
printf("请输入起始站点:");
fflush(stdin);
gets(start);//输入起始站名信息
p=zhandianchazhao(H,start);//调用站点查询函数
fflush(stdin);
printf("请输入终止站点:");
gets(end);//输入终点站名信息
q=zhandianchazhao(H,end); //调用站点查询函数
printf("\n注意:换乘次数大于2次以上,系统无法完成!\n\n");
int a[11],b[11],c[11]; //分别记录两站点所经过的公交路线
a[0]=p->mainline,b[0]=q->mainline;
for(int i=1;i<11;i++)
{
a[i]=p->line[i-1];
b[i]=q->line[i-1];
}
int count=-1;
for(i=0;i<11&&a[i]!=-1;i++) //考察两站点是否同一路线上
for(int j=0;j<11&&b[j]!=-1;j++)
if(a[i]==b[j]) //两站点在同一路线上
{
flag=1;
count++;
c[count]=a[i];
}
if(flag)
for(int k=0;k<=count;k++)
printf("您可以通过乘坐%d 路公交线路到达终点站: %s\n",c[k],end);
else
{
int k=0;
for(int m=0;m<11&&a[m]!=-1;m++) //当两站点不在同一路线上,调用查找公共站点函数
for(int n=0;n<11&&b[n]!=-1;n++)
{
k=gongzhandianchazhao(H,a[m],b[n],start,end);
}
if(!k)
printf("");
}
printf("\n是否继续查找线路?(Y/N)...");
fflush(stdin);
scanf("%c",&ch);
while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
{
printf("输入选择错误,请重新输入...");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
void main() //主函数
{
char ch;
qianxu();
getchar();
for(;ch!='4';) //ch='4'跳出死循环
{
system("cls");
ch=menu();
switch(ch)
{
case '1':xianluchazhao(); break; //调用路线查找函数
case '2':zhandianchazhao(); break; //调用站点查询函数
case '3':buschange(); break; //调用站点换乘函数
case '4':system("cls"); //结束程序
printf("谢谢您的使用!再见!");
break;
}
}
}
bus-station文件:
1 南门换乘中心-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 江淮化工厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 南七里站8 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 机研所-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 科技大学10 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 安医附院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 稻香楼6 901 -1 -1 -1 -1 -1 -1 -1 -1 1 安徽报社-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 三孝口3 9 -1 -1 -1 -1 -1 -1 -1 -1 1 长江饭店 3 9 10 -1 -1 -1 -1 -1 -1 -1 1 黄山大厦 3 9 -1 -1 -1 -1 -1 -1 -1 -1 1 小东门 3 9 -1 -1 -1 -1 -1 -1 -1 -1 1 大东门
2 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 合肥汽车站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 元一时代广场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 胜利广场11 12 -1 -1 -1 -1 -1 -1 -1 -1 1 火车站10 11 -1 -1 -1 -1 -1 -1 -1 -1
2 博物馆901 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 市人民医院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 百花井4 10 -1 -1 -1 -1 -1 -1 -1 -1 2 逍遥津-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 大东门1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 金大塘7 11 -1 -1 -1 -1 -1 -1 -1 -1 2 三里街7 9 11 -1 -1 -1 -1 -1 -1 -1 2 铜陵北路7 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 五里井-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 汽车东站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 东七里站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 卫材总厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 纺机厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 长江批发市场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 孙大郢-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
3 西门换乘中心8 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 省农机校8 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 牙膏厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 青阳路6 9 -1 -1 -1 -1 -1 -1 -1 -1 3 国购广场6 9 -1 -1 -1 -1 -1 -1 -1 -1 3 安农大9 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 大西门9 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 三孝口1 13 9 -1 -1 -1 -1 -1 -1 -1 3 长江饭店1 9 10 -1 -1 -1 -1 -1 -1 -1 3 黄山大厦1 9 -1 -1 -1 -1 -1 -1 -1 -1 3 小东门1 9 -1 -1 -1 -1 -1 -1 -1 -1 3 孝肃桥11-1 -1 -1 -1 -1 -1 -1 -1 -1 3 和平路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 公交集团6 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 市二院6 7 -1 -1 -1 -1 -1 -1 -1 -1 3 安纺总厂7 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 曙光影院7 -1 -1 -1 -1 -1 -1 -1 -1 -1
4 葛大店16 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 东马路口16 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 客车厂8 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 三十二中8 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 公交三公司-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 卫岗8 11 -1 -1 -1 -1 -1 -1 -1 -1 4 仪表厂11 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 东坡岗-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 屯溪路11 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 大钟楼6 11 -1 -1 -1 -1 -1 -1 -1 -1 4 四牌楼-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 百花井2 10 -1 -1 -1 -1 -1 -1 -1 -1 4 双岗
5 10 -1 -1 -1 -1 -1 -1 -1 -1 4 绿都花园7 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 望城店7 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 杏林小区7 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 煤炭设计院7 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 化工研究院7 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 探矿厂7 -1 -1 -1 -1 -1 -1 -1 -1 -1
5 井湾-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 钱小店-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 电厂路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 林店-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 舒大郢-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 防水布厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 杏花-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 北五里井13 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 三十六中-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 电焊机厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 双岗4 10 -1 -1 -1 -1 -1 -1 -1 -1 5 阜阳桥路10 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 市府广场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
6 大兴镇-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 大兴商场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 李鸿章享堂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 胡岗1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 化工厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 合钢公司-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 运管处-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 螺丝岗-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 合裕路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 市二院3
7 -1 -1 -1 -1 -1 -1 -1 -1 6 公交集团3 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 和平广场9 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 孝肃路9 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 包公园11 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 大钟楼4 11 -1 -1 -1 -1 -1 -1 -1 -1 6 桐城路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 稻香楼1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 梅山站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 省中医院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 国购广场3 9 -1 -1 -1 -1 -1 -1 -1 -1 6 五里墩9 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 青阳路3 9 -1 -1 -1 -1 -1 -1 -1 -1 6 安居苑-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 安居苑西村-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
7 曙光影院3 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 安纺总厂3 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 市二院3 6 -1 -1 -1 -1 -1 -1 -1 -1 7 杨老岗-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 铜陵新村-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 铜陵北路2 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 三里街2 9 11 -1 -1 -1 -1 -1 -1 -1 7 金大塘2 11 -1 -1 -1 -1 -1 -1 -1 -1 7 长淮新村-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 胜利北路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 新亚汽车站10 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 板桥-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 绿都花园 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 望城店 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 杏林小区4 -1
-1 -1 -1 -1 -1 -1 -1 -1 7 煤炭设计院4 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 化工研究院4 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 探矿厂4 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 煤气制气厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 刘冲村-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 环湖家具城-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 7 邵大郢-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
8 西门换乘中心3 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 省农机校3 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 长潜路口-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 贵潜路口-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 八里岗10 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 轻机厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 肉联厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 秀水花园-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 省旅游学校-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 轴承厂12 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 锻压厂-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 南七里站1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 宿松路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 铁四局-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 - 8 省立儿童医院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 卫岗 4 11 -1 -1 -1 -1 -1 -1 -1 -1 8 姜坎-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 五里冲-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 晓珠-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 客车厂4 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 三十二中 4 -1 -1 -1 -1 -1 -1 -1 -1 -1
9 合家福购物街-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 凤临苑-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 凌湾-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 合肥晚报社12 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 凤阳路菜场11 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 三里街2 7 11 -1 -1 -1 -1 -1 -1 -1 9 和平广场6 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 孝肃路6 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 小东门 1 3 -1 -1 -1 -1 -1 -1 -1 -1 9 黄山大厦 1 3 -1 -1 -1 -1 -1 -1 -1 -1 9 长江饭店1 3 10 -1 -1 -1 -1 -1 -1 -1 9 三孝口1 3 -1 -1 -1 -1 -1 -1 -1 -1 9 大西门3 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 安农大 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 国购广场 3 6 -1 -1 -1 -1 -1 -1 -1 -1 9 五里墩6 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 青阳路3 6 -1 -1 -1 -1 -1 -1 -1 -1 9 淠河路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 青史站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 龙居山庄-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
10 火车站1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 旅游汽车站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 新亚汽车站7 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 双岗 4 5 -1 -1 -1 -1 -1 -1 -1 -1 10 阜阳桥路 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 百花井2 4 -1 -1 -1 -1 -1 -1 -1 -1 10 长江饭店1 3 9 -1 -1 -1 -1 -1 -1 -1 10 银河公园-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 芜湖路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 曙光新村-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 省人大-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 科技大学1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 合肥学院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 安大南门-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 合肥科技馆-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 总参干休所-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 电子工程学院-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 八里岗8 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 黄岳路口-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 黄怀路口-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 科大创新-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 黄科路口-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 国祯大厦-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 10 梦园小区-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
11 骆岗机场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 候机楼-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 机场大门-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 新庄-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 盛达站-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 望湖南路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 梅兰-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 望湖北路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 凌大塘-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 卫塘-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 名航宿舍-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 卫岗4 8 -1 -1 -1 -1 -1 -1 -1 -1 11 仪表厂4 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 屯溪路4 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 大钟楼4 6 -1 -1 -1 -1 -1 -1 -1 -1 11 包公园6 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 孝肃桥3 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 大通路-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 金大塘2 7-1 -1 -1 -1 -1 -1 -1 -1 11 三里街2 7 9 -1 -1 -1 -1 -1 -1 -1 11 凤阳路菜场9 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 十一中-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 11 胜利广场1 12 -1 -1 -1 -1 -1 -1 -1 -1 11 火车站1 10 -1 -1 -1 -1 -1 -1 -1 -1
12 瑶海家具大市场-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 12 国际汽车城-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 12。

相关文档
最新文档