f[j];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;ilength;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;ilength;i++)
{
while(p
p=L->s1[p].next;
q=L->s1[p].next;/*q指示尚未调整的表尾*/
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指向尚未调整的表尾,为下一个准备*/
}
}
/*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)
{
printf("航班号起点站终点站航班期起飞时间到达时间机型票价\n");
printf("%6s,%6s,%8s,%10s,%8s,%8s,%8s,%6d\n",L->s1[i].keys,L->s1[i].others.start,L->s1[i].others.end,L->s1[i].others.sche,L->s1[i].others.time1,L->s1[i].others.time2,L->s1[i].others.model,L->s1[i].others.price);
}
voidSeqSearch(SLList*L,KeyTypekey[],inti)
{
intj,k,m=0;
for(j=1;jlength;j++)
{
switch(i)
{
case2:
k=strcmp(key,L->s1[j].others.start);
break;
case3:
k=strcmp(key,L->s1[j].others.end);
break;
case4:
k=strcmp(key,L->s1[j].others.time1);
break;
case5:
k=strcmp(key,L->s1[j].others.time2);
break;
}
if(k==0)
{
m=1;
Display(L,j);
}
}
if(m==0)printf("无此航班信息,可能是输入错误!
\n");
}
voiddelete(SLList*L,KeyTypekey[])
{
intj,k=0;
for(j=1;jlength;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;jlength-1;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("航班号起点站终点站航班期起飞时间到达时间机型票价\n");
scanf("%s%s%s%s%s%s%s%d",L->s1[i].keys,L->s1[i].others.start,L->s1[i].others.end,L->s1[i].others.sche,L->s1[i].others.time1,L->s1[i].others.time2,L->s1[i].others.model,&L->s1[i].others.price);
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");
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*******7.插入新的航班信息*******\n");
printf("\t*******8.删除旧的航班信息*******\n");
}
printf("\t*******0.退出系统*******\n");
printf("\t*************************************\n");
if(n==1)
{
printf("\t*******请选择(0—8)*******\n");
}
else
printf("\t*******请选择(0—6)*******\n");
scanf("%d",&i);
if(i==1)
{
printf("输入要查询的航班号(区分大小写):
");
scanf("%s",key);
k=BinSearch(L,key);
if(k==0)
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;jlength;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\"toexit!
\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);
}
0