航班信息查询与检索
一、问题描述
实现对飞机航班信息进行排序和查找,可按照航班号、起点站、到达站、起飞时间和到
达时间等信息进行查询。航班信息表的样式如下:
航班号起点站终点站班期起飞时间到达时间机型票价
CA1544合肥北京1、2、4、510:5512:40733960
MU5341上海广州每日14:2016:15M901280
CZ3869重庆深圳2、4、608:5510:357331010
其中航班号一项的格式为:前两个大写字母表示航空公司的名称,后4位为航班编号。
基本要求:
(1)对飞机航班信息进行排序;
(2)采用折半查找思想完成查找。可按照航班号、起点站、到达站、起飞时间和到达
时间等信息进行查询。
测试数据要求:
测试的数据不得少于10个,不得有重复的航班。
二、设计思想
根据题目所要求,程序必须实现航班信息的录入和查询。程序首先定义了一个用于储存
航班信息的数据类型,再由用户录入航班数据,在录入的同时并对数据进行排序,最后执行
数据查询和检索。在查询设计中,使用二分查找法对排好序的航班数据按航班号实现快速查
找,按起点站、终点站、起飞时间、到达时间查找的则采用顺序查询方法。
三、数据描述
typedefstructnode{
charnumber[MAXN];//航班号
timestart;//起飞时间
timeend;//到达时间
charstart_station[MAXN];//起点站
charend_station[MAXN];//终点站
chartype[MAXN];//飞机型号
charprice[MAXN];//票价
structnode*link;
}NODE;
四、算法描述
1、二分查找
intbinSearch(NODE*n,char*strinput,intlow,inthigh){//二分查找
inti;
intmiddle=(high+low)/2;
if(high
return0;
if((i=strcmp(strinput,n->number))<0)
high=middle;
elseif(i>0)
low=middle;
else{
i=middle;
returni;
}
binSearch(getindex(n,middle),strinput,low,high);
}
intbisect(chara[],intn,chars[MAXN]){//二分查找
inti,j,m;
i=0;
j=n-1;
while(i<=j){
m=(i+j)/2;
}
return(-1);
}
2、计算链表长度
unsignedintcountit(NODE*n){
unsignedintcounti=0;
while(n!=NULL)
counti++,n=n->link;
returncounti;
}
五、源代码
#include
#include
#include
#defineMAXN100
typedefstruct{
charhour[MAXN];
charminute[MAXN];
}time;
typedefstructnode{
charnumber[MAXN];//航班号
timestart;//起飞时间
timeend;//到达时间
charstart_station[MAXN];//起点站
charend_station[MAXN];//终点站
chartype[MAXN];//飞机型号
charprice[MAXN];//票价
structnode*link;
}NODE;
NODE*create_link_list(intn){
inti;
NODE*head,*p,*q;
if(n==0)return(NULL);
head=(NODE*)malloc(sizeof(NODE));
for(i=0;i
head->number[i]='0';
head->[i]='0';
head->[i]='0';
head->[i]='0';
head->[i]='0';
head->start_station[i]='0';
head->end_station[i]='0';
head->type[i]='0';
head->price[i]='0';
}
p=head;
for(i=1;i
printf("请输入航班号:");
scanf("%s",&(p->number));
printf("请输入起飞时间(时分):");
scanf("%s%s",&(p->),&(p->));
printf("请输入达到时间(时分):");
scanf("%s%s",&(p->),&(p->));
printf("请输入起点站终点站:");
scanf("%s%s",&(p->start_station),&(p->end_station));
printf("请输入飞机型号:");
scanf("%s",&(p->type));
printf("请输入票价:");
scanf("%s",&(p->price));
printf("n");
q=(NODE*)malloc(sizeof(NODE));
p->link=q;
p=q;
}
printf("请输入航班号:");
scanf("%s",&(p->number));
printf("请输入起飞时间(时分):");
scanf("%s%s",&(p->),&(p->));
printf("请输入达到时间(时分):");
scanf("%s%s",&(p->),&(p->));
printf("请输入起点站终点站:");
scanf("%s%s",&(p->start_station),&(p->end_station));
printf("请输入飞机型号:");
scanf("%s",&(p->type));
printf("请输入票价:");
scanf("%s",&(p->price));
printf("n");
getchar();
p->link=NULL;
return(head);
}
voidinsert(NODE**p_head,NODE*q){
NODE*p;
if(*p_head==NULL)
*p_head=q;
else{
p=*p_head;
while(p!=NULL&&p->link!=NULL)
p=p->link;
p->link=q;
}
}
unsignedintcountit(NODE*n){//计算链表长度
unsignedintcounti=0;
while(n!=NULL)
counti++,n=n->link;
returncounti;
}
NODE*getindex(NODE*head,intnum);
NODE*getindex(NODE*head,intnum){//取得index为num的节点!
if(num<0||num>countit(head))
returnNULL;
NODE*rn=head;
while(--num>0)
rn=rn->link;
returnrn;
}
intbinSearch(NODE*n,char*strinput,intlow,inthigh){//二分查找
inti;
intmiddle=(high+low)/2;
if(high
return0;
if((i=strcmp(strinput,n->number))<0)
high=middle;
elseif(i>0)
low=middle;
else{
i=middle;
returni;
}
binSearch(getindex(n,middle),strinput,low,high);
}
intbisect(chara[],intn,chars[MAXN]){//二分查找
inti,j,m;
i=0;
j=n-1;
while(i<=j){
m=(i+j)/2;
}
return(-1);
}
NODE*search1(NODE*head,charv[MAXN]){//起点站顺序查找
for(;head!=NULL&&strcmp(head->start_station,&v[0]);head=head->link);
return(head);
}
NODE*search2(NODE*head,charw[MAXN]){//到达站顺序查找
for(;head!=NULL&&strcmp(head->end_station,&w[0]);head=head->link);
return(head);
}
NODE*search3(NODE*head,charx[MAXN],chary[MAXN]){//起飞时间顺序查找
for(;head!=NULL&&(strcmp(head->,&x[0])||
strcmp(head->,&y[0]));head=head->link);
return(head);
}
NODE*search4(NODE*head,chart[MAXN],charu[MAXN]){//到达时间顺序查找
for(;head!=NULL&&(strcmp(head->,&t[0])||
strcmp(head->,&u[0]));head=head->link);
return(head);
}
voidoutput(NODE*p){
while(p!=NULL){
printf("航班信息:n");
printf("航班号:%sn",p->number);
printf("起飞时间:%s点%s分,",p->,p->);
printf("到达时间:%s点%s分n",p->,p->);
printf("起点站:%s,",p->start_station);
printf("到达站:%sn",p->end_station);
printf("飞机型号:%s",p->type);
printf("票价:%s元nn",p->price);
p=p->link;
}
}
NODE*rank(NODE*head){
NODE*q=0,*p=0,*t,*h1;
h1=head->link;
head->link=NULL;
while(h1!=NULL){
t=h1;
h1=h1->link;
p=head;
q=head;
while(p!=NULL&&strcmp(t->number,p->number)>0){
q=p;
p=p->link;
}
if(q==p){
t->link=p;
head=t;
}
else{
t->link=p;
q->link=t;
}
}
returnhead;
}
intmain(intargc,char*argv[]){
NODE*p,*q,*r;
inta,b,i,j,n;
intcount=0;
charo[MAXN];
chars[MAXN];
charv[MAXN];
charw[MAXN];
charx[MAXN];
chary[MAXN];
chart[MAXN];
charu[MAXN];
for(i=0;i
o[i]='0';
s[i]='0';
v[i]='0';
w[i]='0';
x[i]='0';
y[i]='0';
t[i]='0';
u[i]='0';
}
while(true){
printf("【航班信息的查询与检索】n");
printf("*******************************n");
printf("1.建立航班信息n");
printf("2.插入航班信息n");
printf("3.按航班号进行排序n");
printf("4.航班信息查询n");
printf("5.显示航班信息n");
printf("0.退出本系统n");
printf("*******************************n");
printf("请输入你的选择:");
scanf("%d",&a);
getchar();
switch(a){
case1:
printf("请输入你所要建立的航班信息个数:");
scanf("%d",&n);
p=create_link_list(n);
break;
case2:
q=create_link_list(1);
insert(&p,q);
break;
case3:
p=rank(p);
break;
case4:
printf("n1、按照航班号查询.n");
printf("2、按照起点站查询.n");
printf("3、按照到达站查询.n");
printf("4、按照起飞时间查询.n");
printf("5、按照到达时间查询.n");
scanf("%d",&b);
getchar();
switch(b){
case1:
p=rank(p);
printf("请输入您所要找的航班号:");
scanf("%s",s);
if(binSearch(p,s,1,countit(p)))
printf("scuess!n");
break;
case2:
printf("请输入起点站");
scanf("%s",&v[MAXN]);
if(search1(p,&v[MAXN])!=NULL){
printf("查询成功!n");
r=search1(p,&v[MAXN]);
output(r);
}
else
printf("查询失败,该信息录中没有该起点站!n");
break;
case3:
printf("请输入到达站");
scanf("%s",&w[MAXN]);
if(search2(p,&w[MAXN])!=NULL){
printf("查询成功!n");
r=search2(p,&w[MAXN]);
output(r);
}
else
printf("查询失败,该信息录中没有该到达站!n");
break;
case4:
printf("请输入起飞时间(时分)");
scanf("%s%s",&x[MAXN],&y[MAXN]);
if(search3(p,&x[MAXN],&y[MAXN])!=NULL){
printf("查询成功!n");
r=search3(p,&x[MAXN],&y[MAXN]);
output(r);
}
else
printf("查询失败,该信息录中没有该到达站!n");
break;
case5:
printf("请输入到达时间");
scanf("%s%s",&t[MAXN],&u[MAXN]);
if(search4(p,&t[MAXN],&u[MAXN])!=NULL){
printf("查询成功!n");
r=search4(p,&t[MAXN],&u[MAXN]);
output(r);
}
else
printf("查询失败,该信息录中没有该到达站!n");
break;
}
break;
case5:
output(p);
printf("n");
break;
case0:
return(0);
}
}
return(0);
}
六、测试数据及运行结果
本文发布于:2023-02-12 11:23:19,感谢您对本站的认可!
本文链接:http://www.yoguilin.com/write/167617219921784.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |