⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 全国交通咨询系统 设计主要分三个部分:一是建立交通网络图的存储结构
💻 C
📖 第 1 页 / 共 2 页
字号:
 /**/
 status GLtime(Dtime a,Dtime b)
 {
   if(a.hour > b.hour)
    return TRUE;
    else if(a.hour == b.hour && a.minute > b.minute)
     return TRUE;
     else 
     return FALSE;
 }
 
 /**/
 status Inite(ALGraph &G)
/*Inite the ALGraph from the file*/
{
  int i,v1,v2,j;
  ArcNode * p;
  Tooltype *f;
  FILE *fp;
  if(!(fp = fopen("data","r")))
   return ERROR;
   fscanf(fp,"%d %d",&G.vexnum,&G.arcnum);
   for(i = 0;i < G.vexnum;++i)
    {
     fscanf(fp,"%s",&G.vertices[i].data);
     G.vertices[i].firstarc=NULL;
    }
   for(i = 0;i < G.arcnum;++ i)
    {
      fscanf(fp,"%d %d",&v1,&v2);
      if(!(p=(ArcNode *)malloc(sizeof(ArcNode))))
	 return ERROR;
	 p -> Tool[0] = NULL;
	 p -> Tool[1] = NULL;
	 
      fscanf(fp,"%d",&j);
      if(j > 0)
      {
       if(!(f=(Tooltype *)malloc(sizeof(Tooltype))))
       return OVERFLOW;
       f -> line = j;
       fscanf(fp,"%d:%d",&f->drivetime.hour,&f->drivetime.minute);
       fscanf(fp,"%d",&f->money);
       for(j = 0;j < f -> line;j++)
	   fscanf(fp,"%d:%d",&f->starttime[j].hour,&f -> starttime[j].minute);
       p -> Tool[0] = f;
      }

      fscanf(fp,"%d",&j);
      if(j > 0)
      {
       if(!(f = (Tooltype *)malloc(sizeof(Tooltype))))
       return OVERFLOW;
       f->line = j;       
       fscanf(fp,"%d:%d",&f->drivetime.hour,&f->drivetime.minute);
       fscanf(fp,"%d",&f -> money);
       for(j = 0;j < f -> line;j++)
	   fscanf(fp,"%d:%d",&f -> starttime[j].hour,&f -> starttime[j].minute);
       p -> Tool[1] = f;
      }
     if(p -> Tool[1]|| p->Tool[0])
     {
      p->adjvex = v2;
      p->nextarc = G.vertices[v1].firstarc;
      G.vertices[v1].firstarc = p;
     }
   }
   fclose(fp);
   return OK;
   }
   
   /**/
   step Inqurie(ALGraph G)
 {
   char ch = '0';
   int i ,j ,k=0,n=0,f = -1,t = -1;
   CityName from,to;
   StrARR path;
   extern visited[];
  openfile("head");
  while(f == -1)
  {
   printf("please input Start station:\n");
   scanf("%s",from);
   getchar();
   f = LocateVex(G,from);
   if(f == -1)
    {
     printf("There is not %s station",from);
     n++;
     if(n == MAXERROR)
     {
     printf("    Sorry!\n");
     printf("Maybe you forget the station name.\nplease check careful and reinput!\n");
     return NEXTSTEP;
     }
    }
  }  

   while(t == -1)
   {
     printf("\nplease inpiut the station where you want to arrive!\n");
     scanf("%s",to);
     getchar();
     t = LocateVex(G,to);
   if(t == -1)
    {
     printf("There is not %s station",to);
     n++;
     if(n == MAXERROR)
     {
     printf("    Sorry!\n");
     printf("Maybe you forget the station name.\nplease check careful and reinput!\n");
      return NEXTSTEP;
     }
    }
   }
    while(k == 0)
    {
      printf("which tool do you want to by?\n1  Train  2 fly");
      scanf("%d",&k);
      getchar();
      if(k != 1&& k != 2)
       {
	 printf("input error!!\n");
	  k = 0;
       }
    }
   
 for(i = 0; i< MAX_VERTEX_NUM; i++)
 visited[i] = 0;
 
 for(i = 0 ;i < MAX_VERTEX_NUM ; i++)
  for(j = 0;j <= MAX_VERTEX_NUM ; j++)
 path[i][j] = -1;
 
 n = 0;
 AllPath(G,f,t,path,n);
   
 if(n == 0)
  {
  printf("There is no path from %s,to %s!\n",from,to);
  return OK;
  }
  while(ch == '0')
  {
    openfile("inquire");
    printf("\n   From  %s  to  %s\nwhich scheme do you want to choose?\n",from,to);
        ch = NEXTSTEP;
  switch(ch)
   {
    case '1':
     ch = Shorttime(G,k-1,path,n);break;
    case '2':
    ch = Lessmoney(G,k-1,path,n);break;
    case '3':
    ch = Lesschange(G,k-1,path,n);break;
    case 'i':case 's':case 'e':case 'q':
    break;
    default:ch = '0';
   }
  }
  return ch;
 }
 
 /**/
 char Lesschange(ALGraph G,int tool,StrARR path,int n)
 {
   int minchange = MAX,min,i,j;
   char c;
   ArcNode *p;
   openfile("head");
   for(i = 0 ; i < n; i++)
    {
     j = 0;
     while(path[i][j] != -1)
     {
      for(p = G.vertices[path[i][j]].firstarc; p && p -> adjvex != path[i][j+1] ; p = p -> nextarc);
      if(!p -> Tool[tool])
      {
       j = MAX;
       break;
      }
      else j++;
      }
	if(j-2 < minchange && j != MAX)
         {
	minchange = j-2;
        min = i;
        }
    }
    
   if(minchange == MAX)
   {
     if(tool == 0)
     printf("There is no path  by train.\n");
     else 
     printf("There is no path  by train.\n");
   }
   else
   {
     printf(" Lease change path(%d times):\n",minchange);
     for(j = 0;path[min][j+1] != -1; j++)
     printf("%s ---> ",G.vertices[path[min][j]].data);
     printf("%s\n",G.vertices[path[min][j]].data);
    printpath(G,tool,path,min);
   }
  return getch();
 }
 
 /**/
 step Lessmoney(ALGraph G,int tool,StrARR path,int n)
 {
     int minmoney = MAX,min,i,j,money;
     ArcNode * p;
     openfile("head");
   for(i = 0 ; i < n; i++)
    {
     j = 0;
     money = 0;
     while(path[i][j+1] != -1)
     {
      for(p = G.vertices[path[i][j]].firstarc; p && p -> adjvex != path[i][j+1] ; p = p -> nextarc);
      if(!p -> Tool[tool])
      {
       money = MAX;
       break;
      }
      else
      {
      money += p -> Tool[tool] -> money;
      }
      j++;
      }
	if(money < minmoney)
         {
	minmoney = money;
	min = i;
        }
    }
    
   if(minmoney == MAX)
    {
     if(tool == 0)
     printf("There is no path  by train.\n");
     else 
     printf("There is no path  by train.\n");
    }
   else
     {
      printf(" Lease money path($%d):\n",minmoney);
      printpath(G,tool,path,min);
     }
    return NEXTSTEP;
 }
 
 /**/
 int LocateVex(ALGraph G,CityName v)
{
	int k;
	for(k = 0; k < G.vexnum && strcmp(G.vertices[k].data,v) ; k++);
	if(k == G.vexnum) return -1;
	else return k;
}

/**/
void openfile(char *filename)
{
 FILE *fp;
 char ch;
 clrscr();
 textbackground(1);
 fp = fopen(filename,"r");
 if(!fp)
  {
    printf("error!!\n");
    getch();
    exit(0);
  }
 ch = fgetc(fp);
 textcolor(7);
 while(ch!=EOF)
 {
   putchar(ch);
   ch = fgetc(fp);
 }
 fclose(fp);
}

/**/
void printpath(ALGraph G,int kind,StrARR path,int min)
 {
   time_t    now;
   struct     tm    *pTime;
   ArcNode *p;
   int i,j,m,hour = 0,minute = 0,day = 0;
   Dtime arrive;
   time(&now);
   pTime = localtime(&now);
   printf("Now time:\n%6d%2d%3d   %2d:%2d::%2d\n\n",1900 + pTime->tm_year,pTime->tm_mon + 1,
   pTime->tm_mday,pTime->tm_hour, pTime->tm_min,pTime->tm_sec);
      arrive.hour = pTime->tm_hour;
      arrive.minute = pTime->tm_min;
	  printf("starttime time:\n%2d:%2d\n\n",arrive.hour,arrive.minute);
	  printf("Leavestation          Temerstation       Money            Total paytime\n\n");
	  for( j = 0,i = min; path[i][j+1] != -1; j++)
           {
		for(p = G.vertices[path[i][j]].firstarc;p && p->adjvex!=path[i][j+1]; p = p-> nextarc);
	        for(m = 0;GLtime(arrive,p->Tool[kind]->starttime[m]) && m < p -> Tool[kind]->line;m ++);
	       if(m == p -> Tool[kind]->line)
            {
		     minute = minute + (60 - arrive.minute)%60;
		     hour = hour + (23 + (60 - arrive.minute)/60 )- arrive.hour;
		     arrive.hour = 0;
		     arrive.minute = 0;
		     m = 0;
		   }
	     printf("%10s%20s\n",G.vertices[path[i][j]].data,G.vertices[path[i][j+1]].data);
	     Counttime(arrive,p -> Tool[kind]->starttime[m],
	     p->Tool[kind]->drivetime,day ,hour,minute);
	     printf("%2d:%2d %20d:%2d%15d%15d%4d:%2d\n\n",p -> Tool[kind]->starttime[m].hour,p -> Tool[kind]->starttime[m].minute,
	      arrive.hour,arrive.minute,p -> Tool[kind]->money,day,hour,minute);
	 }
  }
  
  /**/
  step Scan(ALGraph G)
 {
   char c = '0';
   while(c == '0')
   {
   openfile("scan");
   c = NEXTSTEP;
   switch(c)
    {
      case '1':
      c = Scanall(G);break;
      case '2':
      c = Scandes(G);break;
      case '3':
      c = Scanstart(G);break;
      case 'e':case 'i':case 'q':
      break;
      default:c = '0';
    }
  }
  return c;
 }
 
 /**/
 step Scanall(ALGraph G)
{
 int i ,j;
 char c;
 FILE *fp;
 ArcNode *p;
 openfile("head");
 printf("THere are %d statons ,and %d lines\n",G.vexnum,G.arcnum);
 DFSTraverse(G);
 printf("\nAre you want to print to the file?yes(y)  or no(n)\nAND Or you can take next step:\n");
 c = NEXTSTEP;
 if(c == 'y' || c == 'Y')
 {
  fp = fopen("print.txt","w");
 for(i = 0;i < G.vexnum;i ++)
  {
    fprintf(fp,"****************************************************************\n");
    fprintf(fp,"The %d station is:%s\n",i+1,G.vertices[i].data);
    for(p = G.vertices[i].firstarc; p ;p = p->nextarc)
     {
       if(p -> Tool[0])
        {
	  fprintf(fp,"There are %d Train lines drive up to %s\n",p -> Tool[0] ->line,G.vertices[p->adjvex].data);
	   fprintf(fp,"leave time     arrive time\n");
           for(j = 0;j < p->Tool[0] -> line; j++)
	    fprintf(fp,"%d:%d          %d:%d\n",p->Tool[0]->starttime[j].hour,p->Tool[0]->starttime[j].minute,
            p->Tool[0]->starttime[j].hour+p->Tool[0]->drivetime.hour+(p->Tool[0]->starttime[j].minute+
            p->Tool[0]->drivetime.minute)/60, (p->Tool[0]->starttime[j].minute+p->Tool[0]->drivetime.minute)%60);
        }
       if(p -> Tool[1])
        {
	  fprintf(fp,"There are %d fly lines drive up to %s\n",p -> Tool[1] ->line,G.vertices[p->adjvex].data);
           fprintf(fp,"leave time     arrive time\n");
           for(j = 0;j < p->Tool[1] -> line; j++)
            fprintf(fp,"%d:%d           %d:%d\n",p->Tool[1]->starttime[j].hour,p->Tool[1]->starttime[j].minute,
            p->Tool[1]->starttime[j].hour+p->Tool[1]->drivetime.hour+(p->Tool[1]->starttime[j].minute+
            p->Tool[1]->drivetime.minute)/60, (p->Tool[1]->starttime[j].minute+p->Tool[1]->drivetime.minute)%60);
        }
     }
  }   fclose(fp);
      openfile("head");
      printf("All the lines have print!!\nnext step:");
      return NEXTSTEP;
 }
 else 
   return c;
}

/**/
char Scandes(ALGraph G)
{
  int m = -1,i,k;
  char term[16],c = 'n';
  ArcNode *p;
  openfile("head");
  printf("please input the terminus you want to scan:\n");
  while(m == -1)
  {
  scanf("%s",term);
  getchar();
  m = LocateVex(G,term);
  if(m == -1)
     printf("there is not %s station please reput.\n",term);
  }
  for( i = 0;i < G.vexnum ;i++)
   {
     if(i != m)
      {
	for(p = G.vertices[i].firstarc; p && p->adjvex != m;p = p->nextarc);
	 if(p->adjvex == m&&p)
	   {
	      c = 'y';
	      if(p ->Tool[0])
              {
                printf("There are %d train lines from  %s to %s:\n",p -> Tool[0] ->line,G.vertices[i].data,G.vertices[m].data);
                 for(k = 0 ;k < p -> Tool[0] ->line; k++)
		 printf("%d:%d\n", p -> Tool[0] ->starttime[k].hour, p -> Tool[0] ->starttime[k].minute);
	      }
	     if(p ->Tool[1])
	      {
		printf("There are %d fly lines from  %s to %s:\n",p -> Tool[1] ->line,G.vertices[i].data,G.vertices[m].data);
		 for(k = 0 ;k < p -> Tool[1] ->line; k++)
		 printf("%d:%d\n", p -> Tool[1] ->starttime[k].hour, p -> Tool[1] ->starttime[k].minute);
              }
           }
      }
   }
 if(c == 'n')
 printf("There is no train or fly to %s\n",term);
 return getch();
}

/**/
step Scanstart(ALGraph G)
{
 int i ,j;
 ArcNode *p;
 CityName start;
 openfile("head");
 printf("please input the start station you want to scan:\n");
 scanf("%s",start);
 getchar();
 i = LocateVex(G,start);
 if(i == -1)
 {
 printf("Ther is not %s station\n",start);
 }
 else if(!G.vertices[i].firstarc)
  printf("There is no train or fly from %s\n",start);
 else
 {
    for(p = G.vertices[i].firstarc; p ;p = p->nextarc)
     {
       if(p -> Tool[0])
        {
	  printf("There are %d train lines drive up to %s\n",p -> Tool[0] ->line,G.vertices[p->adjvex].data);
	   for(j = 0;j < p->Tool[0] -> line; j++)
	    printf("%2d:%2d %20d:%2d\n",p->Tool[0]->starttime[j].hour,p->Tool[0]->starttime[j].minute,
            p->Tool[0]->starttime[j].hour+p->Tool[0]->drivetime.hour+(p->Tool[0]->starttime[j].minute+
	    p->Tool[0]->drivetime.minute)/60, (p->Tool[0]->starttime[j].minute+p->Tool[0]->drivetime.minute)%60);
	}
       if(p -> Tool[1])
        {
	  printf("There are %d fly lines drive up to %s\n",p -> Tool[1] ->line,G.vertices[p->adjvex].data);
	   for(j = 0;j < p->Tool[1] -> line; j++)
	    printf("%2d:%2d %20d:%d\n",p->Tool[1]->starttime[j].hour,p->Tool[1]->starttime[j].minute,
            p->Tool[1]->starttime[j].hour+p->Tool[1]->drivetime.hour+(p->Tool[1]->starttime[j].minute+
	    p->Tool[1]->drivetime.minute)/60, (p->Tool[1]->starttime[j].minute+p->Tool[1]->drivetime.minute)%60);
	}
     }
    
  }
 return  NEXTSTEP;
}

/**/
step Shorttime(ALGraph G,int kind,StrARR path,int n)
 {
 time_t    now;
 struct     tm    *pTime;
 ArcNode *p;
 int i,j,m,minday,minhour,minminute,hour,minute,day,min;
 Dtime arrive;
 openfile("head");
 time(&now);
 pTime = localtime(&now);

 minhour = MAX;
 minminute = MAX;
 minday = MAX;
 min = -1;
 
 for(i = 0;i < n;i ++)
  {
   day = 0;
   hour = 0;
   minute = 0;
   arrive.hour = pTime->tm_hour;
   arrive.minute = pTime->tm_min;
     for( j = 0; path[i][j+1] != -1; j++)
      {
	for(p = G.vertices[path[i][j]].firstarc;p && p->adjvex!=path[i][j+1]; p = p-> nextarc);
	 if(!p->Tool[kind])
	   {
	   day = MAX;
	   hour = MAX;
	   minute = MAX;
	   break;
	   }
          else 
            {
	      for(m = 0;GLtime(arrive,p->Tool[kind]->starttime[m]) && m < p -> Tool[kind]->line;m ++);
	       if(m == p -> Tool[kind]->line)
                {
			  minute = minute + (60 - arrive.minute)%60;
			  hour = hour + (23 + (60 - arrive.minute)/60 )- arrive.hour;
			  arrive.hour = 0;
			  arrive.minute = 0;
			  m = 0;
			}
	     Counttime(arrive,p -> Tool[kind]->starttime[m],
	     p->Tool[kind]->drivetime,day ,hour,minute);
            }
      }
     if(day < minday || day == minday && hour < minhour || day == minday && minhour == hour &&minminute < minute)
        {
	  minday = day;
	  minhour = hour;
	  minminute = minute;
	  min = i;
        } 
    }
    
  if(min == -1)
     printf("There is no path!!");
  else
   {
	  printf(" short time path(%d  %d:%d):\n\n",minday,minhour,minminute);
          printpath(G,kind,path,min);
  };
  return NEXTSTEP;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -