📄 main.c
字号:
/**/
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 + -