航班信息的查询与检索
f94
#include
#include
#include
#defineMaxSpace100
#definekeylen6
#defineRADIX_n10
#defineRADIX_c26typedefcharKeyType;
typedefstruct{
charstart[8];//起点
charend[8];//
终点
charsche[8];//
班期
chartime1[6];//
起飞时间
chartime2[6];//
到达时间
charmodel[6];//
机型
intprice;//
票价
}InfoType;//
航班记录类型
typedefstruct{
KeyTypekeys[keylen];//
关键字
InfoTypeothers;
intnext;
}SLNode;//
表书点
typedefstruct{
SLNodes1[MaxSpace];//静态链表,是s1[0]为头结点
intkeynum;//
关键字长
intlength;//当前表长
}SLList;//静态联表类型
typedefintArrType_n[RADIX_n];
typedefintArrType_c[RADIX_c];
intm=0,num=0;
/*本算法时按关键字keys[i]建立radix个子表,使同一个子表中记
录的keys[i]相同,f[0…radix]
和e[0..radix]分别指向各子表,使同一个子表中的第一个和最后一
个记录*/
voidDistribute(SLNode*s1,inti,ArrType_nf,ArrType_ne)
(
intj,p;
for(j=0;j
e[j]=0;
}
for(p=s1[0].next;p;p=s1[p].next)
(
j=s1[p].keys[i]%48;
应的数值性数字*/if(!f[j])f[j]=p;
elses1[e[j]].next=p;
e[j]=p;
到第j个结点*/}}
/*
/*
/*各子表初始化*/
将数字字符转换成对
将p指向的结点插入
/*本算法是按关键字keys[i]从小到大将[0…radix]所指的各子表依次链接成一
个链表*/
voidCollect(SLNode*s1,ArrType_nf,ArrType_ne)
(
intj,t;
for(j=0;!f[j];j++);/*
子表*/
s1[0].next=f[j];/*sl[0].next
第一个非空子表中的一个结点*/
t=e[j];
while(j
{
for(j=j+1;j
if(f[j])/*
{
s1[t].next=f[j];
t=e[j];
}
}
s1[t].next=0;/*t
空子表*/
voidDistribute_c(SLNode*s1,inti,ArrType_cf,ArrType_ce){
intj,p;
for(j=0;j
{
f[j]=0;
e[j]=0;
}
for(p=s1[0].next;p!=0;p=s1[p].next)
{
j=s1[p].keys[i]%65;
if(!f[j])f[j]=P;
elses1[e[j]].next=p;
找到第一个非空
指向
找下一个非空子表*/
连接两个非空字表*/
指向最后一个非
e[j]=P;
}
}
voidCollect_c(SLNode*s1,ArrType_cf,ArrType_ce)
{
intj,t;
for(j=0;!f[j];j++);
s1[0].next=f[j];
t=e[j];
while(j
{
for(j=j+1;j
if(f[j])
{
s1[t].next=f[j];
t=e[j];
}
}
s1[t].next=0;
}
/*本算法是按关键字从低位到高位依次对个关键字进行分配和收集,分两段
实现:其中RadixSort方法通过调用前面的分配函数和收集函数来从最后一
个关键字开始进行整理。*/
voidRadixSort(SLList*L){
inti;
ArrType_nfn,en;
ArrType_cfc,ec;
for(i=0;i
L->s1[i].next=i+1;
L->s1[L->length].next=0;/*
表*/
for(i=L->keynum-1;i>=2;i--)/*
对各关键字进行分配和收集*/
{
Distribute(L->s1,i,fn,en);
Collect(L->s1,fn,en);
}
for(i=1;i>=0;i--)
{
Distribute_c(L->s1,i,fc,ec);
Collect_c(L->s1,fc,ec);
}
}
voidArrange(SLList*L)
{
intp,q,i;
SLNodetemp;
p=L->s1[0].next;/*p
当前位置*/
for(i=1;i
{
while(p
录,并用p指示其在的位子*/
p=L->s1[p].next;
将改造为静态链
按最低位优先依次
指示第一个记录的
找到第i个记
/*L为待查找的表,key[]为待查找的关键字,按二分查找的思想实现查找*/
intBinSearch(SLList*L,KeyTypekey[])
(
intlow,high,mid;
low=1;
high=L
fc1
->length-1;
while(low<=high)
(
mid=(low+high)/2;
if(strcmp(key,L->s1[mid].keys)==0)returnmid;
elseif(strcmp(key,L->s1[mid].keys)<0)high=mid-1;
elselow=mid+1;
return0;
}
voidDisplay(SLList*L,inti)
/*qq=L->s1[p].next;
尾*/
if(p!=i)
(
temp=L->s1[p];
L->s1[p]=L->s1[i];
L->s1[i]=temp;
L->s1[i].next=p;/*
*/
}
p=q;/*p
整的表尾,为下一个准备*/
}
}
指不■尚未调整的表
指向被移走的记录
指向尚未调
(
printf("航班号起点站终点站航班期起飞时间至V达
时间机型票价n");
printf("%6s,%6s,%8s,%10s,%8s,%8s,%8s,%6dn”,L->s1[i].keys,L
->s1[i].,L->s1[i].,L->s1[i].
he,L->s1[i].1,L->s1[i].2,L->s1[i].oth
,L->s1[i].);
}
voidSeqSearch(SLList*L,KeyTypekey[],inti)
(
intj,k,m=0;
for(j=1;j
(
switch(i)
(
case2:k=strcmp(key,L->s1[j].);
break;
case3:k=strcmp(key,L->s1[j].);
break;
case4:k=strcmp(key,L->s1[j].1);
break;
case5:k=strcmp(key,L->s1[j].2);
break;
if(k==0)
(
m=1;
Display(L,j);
}
}
if(m==0)printf("无此航班信息,可能是输入错误!n");
}
voiddelete(SLList*L,KeyTypekey[])
(
intj,k=0;
for(j=1;j
if(strcmp(key,L->s1[j].keys)==0)
(
k=j;
break;
}
if(k==0)printf("对不起,没有这个航班!n");
else
(
if(k==L->length-1)
(
L->length--;
}
else
(
for(j=k;j
(
L->s1[j]=L->s1[j+1];
L->length--;
}
}
}
/*对于此算法主要是注意信息长度的赋值,对于每次调用要作相应的改变。*/
voidInputData(SLList*L)
(
inti,j,n;
charkn;
charyn='y';
num++;
if(num==1)
(
i=++L->length;
}
else
(
i=L->length;
}
while(yn=='y'||yn=='Y')
(
m++;
n=0;
printf("航班号起点站终点站航班期起飞时间至V达
时间机型票价n");
scanf("%s%s%s%s%s%s%s%d”,L->s1[i].keys,L->s1[i].othe
,L->s1[i].,L->s1[i].,L->s1[i].
1,L->s1[i].2,L->s1[i].,&L
->s1[i].);
scanf("%c",&kn);
if(m!=1)
{
for(j=1;j
{
if(strcmp(L->s1[i].keys,L->s1[j].keys)==0)
{
printf("sorry,你输入的航班已经存在!n");
n=1;
break;
}
}
}
if(n==0)i++;
printf("继续输入吗?y/n:");
scanf("%c",&yn);
}
L->length=i;
if(n==0)
{
RadixSort(L);
Arrange(L);
}
}voidserachcon(SLList*L,intn){
inti=1;
while(i!=0)
charkey[keylen];
charkl[4];
intk,j;
printf("t*************************************n");
printf("t*************************************n");
if(n==1)
else
scanf("%d”,&i);
if(i==1)printf("输入要查询的航班号(区分大小写):");
scanf("%s",key);
k=BinSearch(L,key);
if(k==0)
printf("t**********
航班信息查询系统***********n");
printf("t*******1.航班号*******n");
printf("t*******2.
起点站
*******n");
printf("t*******3.
终点站
*******n");
printf("t*******4.起飞时间*******n");
printf("t*******5.到达时间*******n");
printf("t*******6.显示所有航圳*******
n");
if(n==1)
printf("t*************************************n");
printf("t*******7.
插入新的航班信息
*******n");
printf("t*******8.
删除旧的航班信息
*******n");
printf("t*******0.
退出系统
*******n");
printf("t*******
请选择(0—8)
*******n");
printf("t*******
请选择(0—6)
*******n");
printf("无此航班信息,可能是输入错误!n”);
elseDisplay(L,k);
}
elseif(i==2)
{
printf("输入要查询的航班起点站名:”);
scanf("%s",key);
SeqSearch(L,key,i);
}
elseif(i==3)
{
printf("输入要查询的航班终点站名:”);
scanf("%s",key);
SeqSearch(L,key,i);
}
elseif(i==4)
{printf("输入要查询的航班起飞时间:");
scanf("%s”,kl);
SeqSearch(L,kl,i);
}
elseif(i==5)
{
65f
printf("输入要查询的航班到达时间:”);
scanf("%s",kl);
SeqSearch(L,kl,i);
}
elseif(i==6)
(
if(L->length==1)
printf("对不起,没有航班信息!n");
else
(
printf("显示所有航班信息:n");
for(j=1;j
(
Display(L,j);
}
}
}
elseif(i==7&&n==1)
(
printf("输入要插入的所有相关信息!n");
InputData(L);
}
elseif(i==8&&n==1)
(
printf("输入要删除的航班号!:");
scanf("%s”,key);
delete(L,key);
}
elseif(i==0)
(
printf("t再见!n");
return;
}
elseprintf("无此操作,可能是输入错误,请再输入!n");
voidlogin(SLList*L)
(
charstr[10];
inti=1;
printf("ifyouareadministrator,pleaseLogin!orinput"exit"to
exit!n");
while(i)(
printf("Inputyouusername:");
scanf("%s”,&str);
if(strcmp(str,"fangcao")==0)
(
printf("nInputyoupassword:");
scanf("%s”,&str);
if(strcmp(str,”19870923")==0)
(
serachcon(L,i);
break;
}
else
printf("youpasswordiswrong!n");
}
elseif(strcmp(str,"exit")==0)
(
i=0;
serachcon(L,i);
}
else
printf("youusernameiswrong!n");
voidmain()
(
SLList*L;
L=(SLList*)malloc(sizeof(SLList));
L->keynum=6;
L->length=0;
InputData(L);
login(L);
}
本文发布于:2023-02-23 20:53:50,感谢您对本站的认可!
本文链接:http://www.yoguilin.com/write/167715683166186.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |