Bus busroute(int num) {
Bus *p;
p=(Bus *)malloc(sizeof(Bus)); if(num==7) { p->num=7; p->stopnum=11;
p->pass[0]=0;p->pass[1]=1;p->pass[2]=2;p->pass[3]=3;p->pass[4]=4;p->pass[5]=5; p->pass[6]=6;p->pass[7]=7;p->pass[8]=8; p->pass[9]=9;p->pass[10]=10; return *p; } if(num==107) { p->num=107; p->stopnum=11;
p->pass[0]=0;p->pass[1]=11;p->pass[2]=12;p->pass[3]=13;p->pass[4]=4;p->pass[5]=5; p->pass[6]=6;p->pass[7]=7;p->pass[8]=8;p->pass[9]=9; p->pass[10]=10; return *p; } if(num==152) { p->num=152; p->stopnum=11;
p->pass[0]=14;p->pass[1]=15;p->pass[2]=16;p->pass[3]=17;p->pass[4]=18; p->pass[5]=5;p->pass[6]=6;p->pass[7]=7;p->pass[8]=8;p->pass[9]=9; p->pass[10]=10; return *p; } if(num==63) { p->num=63; p->stopnum=13;
p->pass[0]=19;p->pass[1]=20;p->pass[2]=14;p->pass[3]=15;p->pass[4]=16;
20
p->pass[5]=17;p->pass[6]=18;p->pass[7]=21;p->pass[8]=5;p->pass[9]=22; p->pass[10]=23;p->pass[11]=24;p->pass[12]=25; return *p; } if(num==124) { p->num=124; p->stopnum=12;
p->pass[0]=26;p->pass[1]=27;p->pass[2]=28;p->pass[3]=2;p->pass[4]=3;
p->pass[5]=4;p->pass[6]=5;p->pass[7]=22;p->pass[8]=23;p->pass[9]=29; p->pass[10]=24; p->pass[11]=25; return *p; } if(num==145) { p->num=145; p->stopnum=11;
p->pass[0]=30;p->pass[1]=27;p->pass[2]=31;p->pass[3]=32;p->pass[4]=3; p->pass[5]=4;p->pass[6]=5;p->pass[7]=6;p->pass[8]=33;p->pass[9]=34; p->pass[10]=35; return *p; } if(num==502) { p->num=502; p->stopnum=10;
p->pass[0]=36;p->pass[1]=37;p->pass[2]=38;p->pass[3]=39;p->pass[4]=5; p->pass[5]=6;p->pass[6]=7;p->pass[7]=8;p->pass[8]=9;p->pass[9]=10; return *p; } if(num==17) { p->num=17; p->stopnum=11;
p->pass[0]=40;p->pass[1]=41;p->pass[2]=42;p->pass[3]=43;p->pass[4]=18; p->pass[5]=5;p->pass[6]=6;p->pass[7]=7;p->pass[8]=8;p->pass[9]=9; p->pass[10]=10; return *p;
21
} free(p); }
int passnum(int busnum,int site) //计算公交站site在公交线busnum中的位置 {
int i,m2;
m2=busroute(busnum).stopnum; for(i=0;i return i; } int judge(int busnum, int site) 在公交线busnum上面,若在,则返回值为1 { int i,m; m=busroute(busnum).stopnum; for(i=0;i if(i==m) return 0; } void huanchewng(int s0,int s1) { int a,b,i=0,m,n; int t[8]; for(a=0;a<8;++a) t[a]=0; 始化t[] for(a=0;a<8;++a) 先判断s0与s1有没有相同的路线经过 { if(G.vex[s0].route[a]!=0) 22 //判断公交站site是否 //初 //首 for(b=0;b<8;++b) { if(G.vex[s1].route[b]!=0) if(G.vex[s0].route[a]==G.vex[s1].route[b]) { t[i]=G.vex[s0].route[a]; ++i; } } } if(t[0]!=0) //有相同路线,就开始输出 { printf(\与%s有直达线:\\n\.vex[s0].site,G.vex[s1].site); for(a=0;a<8;++a) { if(t[a]!=0) { if(a>0) printf(\或\ printf(\路 \ m=passnum(t[a],s0); n=passnum(t[a],s1); printf(\此线路需要经过%d站才能到达\ } } } /*直达线路失败,下面开始一次换乘*/ if(t[0]==0) //没有相同路线,就开始考虑换乘线路 { i=0; int j=0,r[13][8],q[13],h[8],u; for(i=0;i<13;++i) for(j=0;j<8;++j) r[i][j]=0; //r[][]用来记录交叉点的与终点站的路线 for(i=0;i<13;++i) q[i]=50; //q[i]用来存储的交叉点,初始值为50 for(i=0;i<13;++i) h[i]=0; //h[i]用来存储交叉点与起始点s0的公交线 i=0,j=0; for(a=0;a<8;++a) 23 { if(G.vex[s0].route[a]!=0) { m=G.vex[s0].route[a]; n=passnum(m,s0); for(;n n=passnum(m,s0); for(;n>=0;--n) { u=busroute(m).pass[n-1]; j=0; for(b=0;b<8;++b) { if(G.vex[s1].route[b]!=0) if(judge(G.vex[s1].route[b],u)>0) { if(j==0) i=i+1; r[i][j]=G.vex[s1].route[b]; q[i]=u; h[i]=m; ++j; } } } } } if(r[1][0]!=0) //又一次换乘方案则开始输出 24