/*
本程序主要是查询公交车的线路,停靠站点信息,附加功能为可以查询任意两站之
间可乘车辆
不过功能还没有进行优化,在以后的日子里,我将继续优化其功能。
由于时间挺忙的没有给程序进行注释,后续我会加好注释的,
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdlib.h>
#include <fcntl.h>
#include <io.h>
#include<string.h>
#define N 1000//车站的最多数目&&公交线路的最多数目
#define M 50
#define STACK_INIT_SIZE 500
int l=0,z=0;
char r[1000][12]={“”,
/*1*/”",
/*2*/”烽火村”,
/*3*/”千家街”,
/*4*/”司门口”,
/*5*/”大东门”,
/*6*/”洪山”,
/*7*/”张家湾”,
/*8*/”罗家村”,
};
//公交车停靠的站点号,不过第一个是公交号,路线的相关信息以链表方式存储
typedef struct t1
{
int i;
struct t1 *next;
} lin;
typedef struct t2
{
int i;
int j;
struct t2 *next;
}line;
typedef struct road
{
int i;
struct road *next;
}road;
typedef struct thr
{
int i;
int j;
int k;
struct thr *next;
}thr;
thr tr[1000];
lin ln[1000];
line tn[1000];
road rd[N];
typedef struct {
int *base;
int *top;
int stacksize;
}sqstack;
sqstack sq[10];
int roadb();
int addinfo();
int busline();
int preproc();
int takebus();
int read();
int initstack(sqstack *);
int gettop(sqstack *);
int push(sqstack *,int);
int pop(sqstack *,int);
int find(int ,int,int);
int a1();
int delmore();//删除重复的信息
int check(thr *,thr *);
int a2();
int check1( char *, char *,int );
void main()
{
int a,i;
for(i=0;i<1000;i++)ln[i].next=NULL;
for(i=0;i<1000;i++)tn[i].next=NULL;
preproc();
while(1)
{
preproc();
printf(“1.输入新加入线路公交车的相关信息\n”);
printf(“2.查询输入线路公交车的相关信息\n”);
printf(“4.输入两个站号查询可乘公交的信息\n”);
printf(“5.输入站牌号查询停靠公交车的信息\n”);
printf(“0.退出公交车查询系统\n”);
printf(“输入选择:”);
scanf(“%d”,&a);
switch(a)
{
case 1:addinfo();getchar();break;
case 2:busline();break;
case 3:read();break;
case 4:takebus();break;
case 5:a1();break;
case 6:a2();break;
case 0:return ;
default:printf(“input error”);break;
}
}
}
int addinfo()
{
int t;
FILE *fp;
int handle,j,m=0,sum=0,tim=0,s1=0,j1=0,j2=0,j3=0,i,at,time;
int rd[M];
fp=fopen(“d:busno.txt”,”a”);
printf(“input the number of the bus:”);
scanf(“%d”,&t);
// printf(“input the number of the line:”);
fprintf(fp,”%-5d”,t);
i=0;
while(1)
{
printf(“input the number of the line:”);
scanf(“%d”,&rd[i]);
fprintf(fp,”%-5d”,rd[i]);
if(rd[i]==-1)break;
i++;
}
fclose(fp);
return 0;
}
int preproc()
{
int
i,handle,j,m=0,sum=0,tim=0,s1=0,j1=0,j2=0,j3=0,at,k=0,flag=0;
lin *p,*q;
FILE *fp;
char t[10000];
if(fopen(“d:busno.txt”, “rt”)==NULL)
{
// printf(“对不起,bus还未建立\n”);
return 0;
}
else fp=fopen(“d:busno.txt”, “rt”);
handle=open(“d:busno.txt”,O_CREAT);
at=filelength(handle);
fgets(t,at+1,fp);
fclose(fp);
for(i=0;i<at;i++)
{ for(;;i++)
{
if(t[i]==32)break;
s1=s1*10+(t[i]-48);
}
while(1){if(i%5!=0)i++;else break;}
ln[s1].i=s1;
k=s1;
j1=i;
s1=0;
for(;;i++)
{
if(t[i]==32)
{
p=(lin *)malloc(sizeof(lin));
p->i=s1;
ln[k].next=p;
p->next=NULL;
s1=0;
j1=i;
break;
}
s1=s1*10+(t[i]-48);
}
while(1){if(j1%5!=0)j1++;else break;}
i=j1;
for(;i<at;i++)
{
if(t[i]==32)
{
if(flag==1)continue;
q=p;
p=(lin *)malloc(sizeof(lin));
p->i=s1;
q->next=p;
p->next=NULL;
s1=0;
flag=1;
continue;
}
flag=0;
if(i==at-5)goto jf;
if(t[i]==45){i+=5;break;}
s1=s1*10+(t[i]-48);
}
i–;
continue;
}
jf:
fp=fopen(“d:busno.txt”, “w”);
fclose(fp);
fp=fopen(“d:busno.txt”, “a”);
for(i=0;i<N;i++)
{
if(ln[i].next==NULL)continue;
fprintf(fp,”%-5d”,i);
p=ln[i].next;
while(p!=NULL)
{
fprintf(fp,”%-5d”,p->i);
p=p->next;
}
fprintf(fp,”%-5d”,-1);
}
fclose(fp);
return 0;
}
int busline()
{
int i;
lin *p,*q;
FILE *fp;
int handle,j,m=0,sum=0,tim=0,s1=0,j1=0,j2=0,j3=0,at,time,k=0,flag=0;
char t[10000];
printf(“input the number of the bus that you want to consult\n”);
scanf(“%d”,&m);
if(ln[m].next==NULL){printf(“no record \n”);return 0;}
else
{
p=ln[m].next;
printf(“%d所停靠的车站为:”,m);
while(p!=NULL)
{
printf(“%s,”,r[p->i]);
p=p->next;
}
printf(“\n”);
}
return 0;
}
int read()
{
int i=0;
FILE *fp;
fp=fopen(“d:busno.txt”,”r”);
while(1)
{
if(feof(fp)!=0)break;
printf(“the no is %d:\n”,i);
}
return 0;
}
int takebus()
{
lin *p,*q;
line *p1,*p2;
char s1[12],s2[12];
int a=0,b=0,i,flag=0,flag1=0,j,k=0,sg=0,m1=1,m2=2,sn=0,v1=0,d;
initstack(&sq[0]);
initstack(&sq[1]);
initstack(&sq[2]);
initstack(&sq[3]);
initstack(&sq[4]);
for(i=0;i<12;i++){s1[i]=0;s2[i]=0;}
printf(“输入车站名请按 1 —–输入车站号请按 2\n”);
scanf(“%d”,&d);
if(d==1)
{
printf(“输入上车站名:”);
scanf(“%s”,s1);
printf(“输入下车站名:”);
scanf(“%s”,s2);
for(i=0;i<=8;i++)
{
if(check1(s1,r[i],12)==1)a=i;
if(check1(s2,r[i],12)==1)b=i;
}
if(a==0){printf(“公交系统中无%s站的信息”,s1);return 0;}
if(b==0){printf(“公交系统中无%s站的信息”,s2);return 0;}
}
else
{
printf(“请输入你所要的上车站号和下车站号:\n”);
scanf(“%d%d”,&a,&b);
if(a>N||a<0||b>N||b<0){printf(“非法输入”);return 0;}
if(ln[a].next==NULL||ln[b].next==NULL){printf(“非法输入”);return 0;}
}
for(i=0;i<N;i++)
{
if(ln[i].next==NULL){continue;}
else
{
p=ln[i].next;
while(p!=NULL)
{
if(p->i==a)flag=1;
if(p->i==b)flag1=1;
p=p->next;
}
if(flag==1&&flag1==1){push(&sq[0],i);sn=1;}
}
flag1=flag=0;
}
flag1=flag=0;
if(sn==0)
{
for(i=0;i<N;i++)
{
if(ln[i].next==NULL){continue;}
else
{
p=ln[i].next;
while(p!=NULL)
{
if(p->i==a)push(&sq[0],i);
if(p->i==b)push(&sq[1],i);
p=p->next;
}
}
}
j=pop(&sq[0],0);
while(j!=-1)
{
while(1)
{
k=pop(&sq[m1],0);
if(k==-1){m1=2;m2=1;break;}
push(&sq[m2],k);
p=ln[j].next;
while(p!=NULL)
{
q=ln[k].next;
while(q!=NULL)
{
if(q->i==p->i)
{
if(sg==0)
{
sg=1;
tn[l].i=j;
tn[l].j=k;
p1=(line *)
malloc(sizeof(line));
p1->i=p->i;//
前一站的共同的站点即是可下站点号
p1->j=q->i;
tn[l].next=p1;
p1->next=NULL;
p2=p1;
sn=2;
}
else
{
p1=(line *)
malloc(sizeof(line));
p1->i=p->i;
p1->j=q->i;
p2->next=p1;
p1->next=NULL;
p2=p1;
}
v1=1;
break;
}
q=q->next;
}
p=p->next;
}
sg=0;
if(v1==1){l++;v1=0;}
}
j=pop(&sq[0],0);
}
}
if(sn==0)
{
// road();
for(i=0;i<N;i++)
{
if(ln[i].next==NULL){continue;}
else
{
p=ln[i].next;
while(p!=NULL)
{
if(p->i==a){push(&sq[3],i);break;}
p=p->next;
}
}
}
j=pop(&sq[3],0);
while(j!=-1)
{
p=ln[j].next;
while(p!=NULL)
{
sn=find(j,p->i,b);
p=p->next;
}
j=pop(&sq[3],0);
}
z=delmore();
}
printf(“the buses you can take are :\n “);
if(sn==1)
{
for(i=0;i<100;i++)
{
j=pop(&sq[0],0);
if(j==-1)break;
printf(“no=%d\n”,j);
}
}
if(sn==2)
{
for(i=0;i<l;i++)
{
printf(“no1,no2—->%d,%d\n”,tn[i].i,tn[i].j);
}
l=0;
}
if(sn==3)
{
for(i=0;i<z;i++) printf(“no1,no2,no3—->%d,%d,%d\n”,tr
[i].i,tr[i].j,tr[i].k);
z=0;
}
if(sn==0)printf(“查找不到\n”);
return 0;
}
int roadb()
{
int i,j,sg=0;
lin *p;
road *q,*q1;
for(i=0;i<N;i++){rd[i].i=i;rd[i].next=NULL;}
for(j=0;j<N;j++)
{ sg=0;
for(i=0;i<N;i++)
{
if(ln[i].next==NULL)continue;
p=ln[i].next;
while(p!=NULL)
{
if(p->i==j)
{
if(sg==0)
{
q=(road *)malloc(sizeof(road));
q->i=i;
q->next=NULL;
rd[j].next=q;
q1=q;
sg=1;
break;
}
else
{
q=(road *)malloc(sizeof
(road));
q->i=i;
q->next=NULL;
q1->next=q;
q1=q;
break;
}
}
p=p->next;
}
}
}
return 0;
}
int initstack(sqstack *S)
{
S->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S->base)
exit(-1);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return 0;
}
int gettop(sqstack *s)
{
int e;
if(s->top==s->base)return 0;
e=*(s->top-1);
return e;
}
int push(sqstack *s,int e)
{ // s=(sqstack *)malloc(sizeof(sqstack));
*((s->top)++)=e;
return 0;
}
int pop(sqstack *s,int e)
{
if(s->top==s->base)return -1;
else e=*(–s->top);
return e;
}
int a1()
{
int i;
road *p;
roadb();
for(i=0;i<N;i++)
{
p=rd[i].next;
if(p==NULL)continue;
printf(“%s所停靠的车辆有:”,r[i]);
while(p!=NULL)
{
printf(“%d,”,p->i);
p=p->next;
}
printf(“\n”);
}
return 0;
}
int find(int t,int a,int b)
{
int j,i,k,m1=1,m2=2,sg=0,sn=0,v1=0;
lin *p,*q;
thr *p1,*p2;
for(i=0;i<N;i++)
{
if(ln[i].next==NULL){continue;}
else
{
p=ln[i].next;
while(p!=NULL)
{
if(p->i==a)push(&sq[0],i);
if(p->i==b)push(&sq[1],i);
p=p->next;
}
}
}
j=pop(&sq[0],0);
while(j!=-1)
{
while(1)
{
k=pop(&sq[m1],0);
if(k==-1){m1=2;m2=1;break;}
push(&sq[m2],k);
p=ln[j].next;
while(p!=NULL)
{
q=ln[k].next;
while(q!=NULL)
{
if(q->i==p->i)
{
if(sg==0)
{
sg=1;
tr[z].i=t;
tr[z].j=j;
tr[z].k=k;
p1=(thr *)
malloc(sizeof(thr));
p1->i=a;//前一
站的共同的站点即是可下站点号
p1->j=q->i;
p1->k=q->i;
tr[z].next=p1;
p1->next=NULL;
p2=p1;
sn=3;
}
else
{
p1=(thr *)
malloc(sizeof(thr));
p1->i=a;
p1->j=q->i;
p1->k=q->i;
p2->next=p1;
p1->next=NULL;
p2=p1;
}
v1=1;
break;
}
q=q->next;
}
p=p->next;
}
sg=0;
if(v1==1){z++;v1=0;}
}
j=pop(&sq[0],0);
}
return sn;
}
int delmore()
{
int i,j,n=0;
for(i=0;i<z;i++)
{
for(j=z-1;j>0;j–)
{
if(tr[i].i==-1)break;
if(tr[j].i==-1)continue;
if(i>=j)break;
if(check(&tr[i],&tr[j])==1)tr[j].i=-1;
}
}
for(i=0;i<z;i++)
{
if(tr[i].i==-1){continue;}
else
{
tr[n].i=tr[i].i;
tr[n].j=tr[i].j;
tr[n].k=tr[i].k;
n++;
}
}
return n;
}
int check(thr *p,thr *q)
{
int a[3],b[3],t,i,j;
a[0]=p->i;a[1]=p->j;a[2]=p->k;
b[0]=q->i;b[1]=q->j;b[2]=q->k;
for(i=0;i<2;i++)
for(j=i;j<2-i;j++)
{
if(a[i]<a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
if(b[i]<b[i+1])
{
t=b[i];
b[i]=b[i+1];
b[i+1]=t;
}
}
for(i=0;i<3;i++)
{
if(a[i]!=b[i])return 0;
}
return 1;
}
int check1( char *a1, char *a,int num)//a[]是指输入的字符串,a1[]是指文件上记
录的字符串
{
int i,flag=0,flag2=1;
/* for(i=0;i<num;i++)
{
if(a[i]==0)flag=1;
if(flag==1)a[i]=;
}*/
for(i=0;i<num;i++)
{if(a1[i]!=a[i]){flag2=0;break;}
}
if(flag2==1)return 1;
else return 0;
}
int a2()
{
int i;
for(i=0;i<12;i++)
printf(“%d\n”,r[1][i]);
return 0;
}
>> 本文固定链接: http://www.vcgood.com/archives/1901
>> 转载请注明: jinfan1009 2007年11月02日 于 C语言帝国 发表
不错.拿来测试一下..
其中输入线路的信息以-1结尾