公交路线查询系统基于数据结构和C语言.docx
《公交路线查询系统基于数据结构和C语言.docx》由会员分享,可在线阅读,更多相关《公交路线查询系统基于数据结构和C语言.docx(22页珍藏版)》请在冰豆网上搜索。
公交路线查询系统基于数据结构和C语言
#include
#include
#include
#include
#definemax30
#definelen20
#defineMAX100
typedefstructLinedot{//Õ¾
intstopno;//Õ¾ºÅ
charstopname[max];//Õ¾Ãû
structLinedot*next;
}linedot,*dot;
typedefstructlineway{//Ïß·
intlineNo;//Ïß·ºÅ
intstopnum;//¸ÃÏß·ÉÏÕ¾µÄ¸öÊý
dotstop;//Õ¾
}way;
typedefstructlineNode{
intlinenum;//Ïß·ÌõÊý
waydata[len];//Ïß·
}line;
typedefstructco_Node{
intzhanNo;
intbusNo;
structco_Node*next;
}co_node,*co_zhan;
typedefstructNode{
intfirstbus;//ʼ·¢³µºÅ
charstopname[max];//Õ¾Ãû
co_zhanzhan;
}node,*list;
typedefstructzhanNode{
intvexnum;//¶¥µãÊý
intarcnum;//»¡Êý
nodevexs[max];//¶¥µã
}spot;
typedefstructsqNode//¶¨ÒåË«Ïò¶ÓÁÐ
{
intdata;
structsqNode*prior;
structsqNode*next;
}sqnode,*sqlist;
typedefstruct//Ë«ÏòÁ´¶ÓÁÐÀàÐÍ
{
sqlistfront;
sqlistrear;
}LQ;
voidinitqueue(LQ*Q)//³õʼ»¯¶ÓÁÐ
{
Q->front=Q->rear=newsqnode;
Q->front->data=Q->rear->data=-1;
Q->front->next=Q->rear->next=NULL;
Q->front->prior=Q->rear->prior=NULL;
}
voidenqueue(LQ*Q,inte)//½ø¶Ó
{
sqlistp;
p=newsqnode;
p->data=e;
p->next=NULL;
p->prior=Q->front;
Q->rear->next=p;
Q->rear=p;
}
voiddequeue(LQ*Q,int*e)//³ö¶Ó
{
Q->front=Q->front->next;
if(Q->front!
=NULL)
*e=Q->front->data;
else
*e=-1;
}
typedefstructstackNode//¶¨ÒåÕ»
{
intfiguer;
structstackNode*next;
}stacknode,*stack;
voidinitstack(stack*S)//³õʼ»¯Õ»
{
*S=NULL;
}
voidpush(stack*S,inte)//½øÕ»
{
stackp;
p=newstacknode;
p->figuer=e;
p->next=*S;
*S=p;
}
intpop(stack*S,int*e)//³öÕ»
{
stackp=*S;
if(p==NULL)
{
printf("Õ»¿Õ!
\n");
return0;
}
*e=p->figuer;
*S=(*S)->next;
deletep;
return1;
}
voidgettop(stackS,int*e)//µÃµ½Õ»¶¥
{
if(S==NULL)
{
printf("Õ»¿Õ!
\n");
return;
}
*e=S->figuer;
}
intlocate(spotC,chare[])
{
inti;
for(i=0;i{
if(strcmp(C.vexs[i].stopname,e)==0)
returni;
}
if(i>C.vexnum)
{
printf("Notfound!
\n");
return-1;
}
}
voidinit(FILE*fp,line*W,spot*C)//¹«½»Ïß·³õʼ»¯
{
dotp,q;
co_zhanR;
inti,j,m,n,num;
charvex1[max],vex2[max];
if((fp=fopen("f.txt","r"))==NULL)//´ò¿ªÎļþ
{
printf("Thefileerror!
\n");
getchar();
exit(0);
}
fscanf(fp,"%d",&W->linenum);
for(i=0;ilinenum;i++)
fscanf(fp,"%d%d",&W->data[i].lineNo,&W->data[i].stopnum);//ÊäÈëÏß·ºÅºÍ¸ÃÏß·ÉÏÕ¾µÄ¸öÊý
for(i=0;ilinenum;i++)
{
W->data[i].stop=NULL;
for(j=0;jdata[i].stopnum;j++)
{
p=newlinedot;
p->next=NULL;
fscanf(fp,"%d%s",&p->stopno,p->stopname);//ÊäÈëÕ¾Ãû
q=W->data[i].stop;
if(!
q)
W->data[i].stop=p;
else
{
while(q->next)
q=q->next;
q->next=p;
}
}
}
fscanf(fp,"%d%d",&C->vexnum,&C->arcnum);
for(i=0;ivexnum;i++)
{
fscanf(fp,"%s%d",C->vexs[i].stopname,&C->vexs[i].firstbus);
C->vexs[i].zhan=NULL;
}
for(i=0;iarcnum;i++)
{
fscanf(fp,"%s%s%d",vex1,vex2,&num);
m=locate(*C,vex1);
n=locate(*C,vex2);
R=newco_node;
R->zhanNo=n;
R->busNo=num;
R->next=C->vexs[m].zhan;
C->vexs[m].zhan=R;
}
}
voidsearch1(lineW)//²éѯָ¶¨³µ´ÎµÄÏß·¼°Í¾¾Õ¾µã
{
dotp;
inti,n,k=0;
printf("ÇëÊäÈë³µ´Î:
");
scanf("%d",&n);
for(i=0;i{
if(W.data[i].lineNo==n)
{
p=W.data[i].stop;
while(p)
{
if(k==0)
printf("%s",p->stopname);
else
printf("->%s",p->stopname);
p=p->next;
k++;
}
}
}
}
voidsearch2(lineW,spotC)
{
intk,i;
charvex[max];
dotp;
printf("ÇëÊäÈëÕ¾µãÃû:
");
scanf("%s",vex);
k=locate(C,vex);
if(C.vexs[k].firstbus!
=0)
printf("¸ÃÕ¾µãµÄʼ·¢³µÓÐ:
%d\n",C.vexs[k].firstbus);
else
printf("¸ÃÕ¾ÎÞʼ·¢³µ!
\n");
printf("¸ÃÕ¾µãµÄ¹ý·³µÓÐ:
");
for(i=0;i{
p=W.data[i].stop;
if(!
p)
continue;
while(p)
{
if(strcmp(p->stopname,vex)==0&&p!
=W.data[i].stop)
printf("%d",W.data[i].lineNo);
p=p->next;
}
}
}
intstackempty(stackS)
{
if(S==NULL)
return1;
return0;
}
voidupdown(stackS,stack*S1)
{
stackp;
while(!
stackempty(S))
{
p=newstacknode;
p->figuer=S->figuer;
p->next=*S1;
*S1=p;
S=S->next;
}
}
voidprintstack(spotC,stackS)//´òÓ¡Õ»ÀïµÄÔªËØ
{
stackS1,p;
co_zhanq;
initstack(&S1);
updown(S,&S1);
p=S1;
while(p)
{q=C.vexs[p->figuer].zhan;
while(q)
{
if(p->next==NULL)
break;
if(q->zhanNo!
=p->next->figuer)
q=q->next;
else
break;
}
printf("%s-%d->",C.vexs[p->figuer].stopname,q->busNo);
p=p->next;
}
}
voidprintqueue(sqlistQ,spotC)
{
sqlistp;
stackS,S1;
initstack(&S);
initstack(&S1);
p=Q;
while(p->data!
=-1)
{
push(&S,p->data);
p=p->prior;
}
updown(S,&S1);
printstack(C,S1);
}
voidsearch3(spotC,ints,inte)
{
co_zhanp;
intflag;
LQQ;
sqlistq;
intu,k,i=1;
initqueue(&Q);
enqueue(&Q,s);
while(Q.front!
=Q.rear)
{
dequeue(&Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
printf("-->>Line%d:
",i++);
printqueue(Q.front->prior,C);
printf("%s\n",C.vexs[e].stopname);
dequeue(&Q,&u);
if(u==-1)
break;
p=C.vexs[u].zhan;
}
while(p)
{
k=p->zhanNo;
q=Q.front;
while(q->prior!
=NULL)
{
if(q->data!
=k)
{
q=q->prior;
flag=1;
}
else
{
flag=0;
break;
}
}
if(k!
=s&&flag==1)
enqueue(&Q,k);
p=p->next;
}
}
}
voidsearch4(spotC,ints,inte,LQ*Q,intvisit[])
{
intu,k;
co_zhanp;
if(!
visit[s])
{
visit[s]=1;
enqueue(Q,s);
while(Q->front!
=Q->rear)
{
dequeue(Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
printf("-->>Line:
");
printqueue(Q->front->prior,C);
printf("%s\n",C.vexs[e].stopname);
break;
}
while(p)
{
k=p->zhanNo;
if(!
visit[k])
{
visit[k]=1;
enqueue(Q,k);
}
p=p->next;
}
}
}
}
intcount(spotC,stackS,inte)
{
inti,j,n=0,No=-1;
stackp;
co_zhanq;
p=S;
while(p)
{
i=p->figuer;
p=p->next;
if(!
p)
break;
j=p->figuer;
q=C.vexs[i].zhan;
while(q)
{
if(q->zhanNo==j&&q->busNo!
=No)
{
n++;
No=q->busNo;
break;
}
else
q=q->next;
}
}
returnn-1;
}
voiddestroy(stack*S)
{
stackp=*S;
while(!
stackempty(*S))
{
*S=(*S)->next;
delete(p);
p=*S;
}
}
voidsavestack(stackS,stack*S2)
{
stackS1;
initstack(&S1);
updown(S,&S1);
updown(S1,S2);
}
voidchange(sqlistQ,stack*S)
{
sqlistp;
p=Q;
while(p->data!
=-1)
{
push(S,p->data);
p=p->prior;
}
}
voidsearch5(spotC,ints,inte,stack*S,stack*S2,int*m)
{
co_zhanp;
intflag;
LQQ;
sqlistq;
intu,k,n1,n=MAX,i=1;
initqueue(&Q);
enqueue(&Q,s);
while(Q.front!
=Q.rear)
{
dequeue(&Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
change(Q.front,S);
n1=count(C,*S,e);
if(n1{
savestack(*S,S2);
n=n1;
*m=n;
}
destroy(S);
dequeue(&Q,&u);
if(u==-1)
break;
p=C.vexs[u].zhan;
}
while(p)
{
k=p->zhanNo;
q=Q.front;
while(q->prior!
=NULL)
{
if(q->data!
=k)
{
q=q->prior;
flag=1;
}
else
{
flag=0;
break;
}
}
if(k!
=s&&flag==1)
enqueue(&Q,k);
p=p->next;
}
}
}
intmenu()
{
intn;
printf("*******************»¶ÓʹÓÃK³Ç¹«½»²éѯϵͳ******************\n");
printf("**************1.²éѯָ¶¨³µ´ÎµÄÏß·¼°Í¾¾Õ¾µã****************\n");
printf("**************2.²éѯָ¶¨Õ¾µãµÄʼ·¢³µºÍ¹ý·³µ****************\n");
printf("**************3.²éѯָ¶¨ÆðµãºÍÖÕµãËù¾µÄËùÓÐÏß·************\n");
printf("**************4.²éѯָ¶¨ÆðµãºÍÖÕµãËù¾Õ¾µã×îÉÙµÄÏß·********\n");
printf("**************5.²éѯָ¶¨ÆðµãºÍÖյ㻻³Ë´ÎÊý×îÉٵij˳µÂ·Ïß****\n");
printf("**************0.Í˳ö****************************************\n");
printf("************************************************************\n");
printf("-----ÆðµãÕ¾:
µçÁ¦´óѧ/ÖìÐÁׯ/±±½¼Å©³¡ÇŶ«/¾©²ý·»ØÁú¹Û/±±¾©Ê¦\n");
printf("·¶´óѧ/µÂʤÃÅÎ÷/Ç廪´óѧÎ÷ÃÅ/Ô²Ã÷Ô°/ÒúÍÔ°/Ïãɽ\n");
printf("-----ÖÕµãÕ¾:
µçÁ¦´óѧ/ÖìÐÁׯ/±±½¼Å©³¡ÇŶ«/¾©²ý·»ØÁú¹Û/±±¾©Ê¦\n");
printf("·¶´óѧ/µÂʤÃÅÎ÷/Ç廪´óѧÎ÷ÃÅ/Öйشå/Ô²Ã÷Ô°/ÒúÍÔ°\n");
printf("/Î÷µ¥\n");
printf("-----¹«½»Ïß·:
345/442/696/681/699/826\n");
printf("************************************************************\n");
printf("ÇëÑ¡Ôñ:
");
scanf("%d",&n);
getchar();
returnn;
}
voidmain()
{
stackS,S2,S3;
LQQ;
intn,m,i,s,e,k=1,visit[len],u;
charch='Y',start[max],end[max];
FILE*fp;
lineW;
spotC;
init(fp,&W,&C);
do
{
n=menu();
switch(n)
{
case1:
search1(W);break;
case2:
search2(W,C);break;
case3:
for(i=0;ivisit[i]=0;
initstack(&S);
printf("ÇëÊäÈëÆðµãºÍÖÕµã:
");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%sµ½%sµÄËùÓзÏßÈçÏÂ:
\n",C.vexs[s].stopname,C.vexs[e].stopname);
search3(C,s,e);break;
case4:
for(i=0;ivisit[i]=0;
initqueue(&Q);
printf("ÇëÊäÈëÆðµãºÍÖÕµã:
");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%sµ½%sµÄ×î¶Ì·ÏßÈçÏÂ:
\n",C.vexs[s].stopname,C.vexs[e].stopname);
search4(C,s,e,&Q,visit);break;
case5:
initstack(&S);
initstack(&S2);
initstack(&S3);
printf("ÇëÊäÈëÆðµãºÍÖÕµã:
");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%sµ½%sµÄ×îÉÙ»»³Ë·ÏßÈçÏÂ:
\n",C.vexs[s].stopname,C.vexs[e].stopname);
search5(C,s,e,&S,&S2,&m);
updown(S2,&S3);
pop(&S3,&u);
printf("-->>Line:
");
printstack(C,S3);
printf("%s\n",C.vexs[e].stopname);
printf("¹²»»³Ë%d´Î\n",m);break;
case0:
exit(0);break;
default:
printf("error!
\n");
}
getchar();
printf("\n¼ÌÐøÂð£¿Y/N:
");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');