首页 > 编程资源分享区 > C/C++源代码共享 > 公交信息查询程序
2007
11-02

/*
     本程序主要是查询公交车的线路,停靠站点信息,附加功能为可以查询任意两站之


间可乘车辆
  不过功能还没有进行优化,在以后的日子里,我将继续优化其功能。
  由于时间挺忙的没有给程序进行注释,后续我会加好注释的,
 
*/



#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;
}


公交信息查询程序》有 2 条评论

  1. VC爱好者 说:

    不错.拿来测试一下..

  2. jinfan1009 说:

    其中输入线路的信息以-1结尾

留下一个回复