#include "malloc.h"
#include "string.h"
#define MAXN 100
typedef struct{
char hour[MAXN]
char minute[MAXN]
} time
typedef struct node
{
char number[MAXN] //航班号
time start //起飞时间
time end //到达时间
char start_station[MAXN] //起点站
char end_station[MAXN] //终点站
char type[MAXN]//飞机型号
char price[MAXN]//票价
struct node*link
}NODE
NODE *create_link_list(int n)
{
int i
NODE *head,*p,*q
if(n==0)return(NULL)
head=(NODE*)malloc(sizeof(NODE))
for(i=0i <MAXNi++)
{
head->number[i]='\0'
head->start.hour[i]='\0'
head->start.minute[i]='\0'
head->end.hour[i]='\0'
head->end.minute[i]='\0'
head->start_station[i]='\0'
head->end_station[i]='\0'
head->type[i]='\0'
head->price[i]='\0'
}
p=head
for(i=1i <ni++)
{
printf("请输入航班号:")
scanf("%s",&(p->number))
printf("请输入起飞时间(时 分):")
scanf("%s %s",&(p->start.hour),&(p->start.minute))
printf("请输入达到时间(时 分):")
scanf("%s %s",&(p->end.hour),&(p->end.minute))
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->start.hour),&(p->start.minute))
printf("请输入达到时间(时 分):")
scanf("%s %s",&(p->end.hour),&(p->end.minute))
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)
}
void insert(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
}
}
unsigned int countit(NODE* n)//计算链表长度
{
unsigned int counti = 0
while(n!=NULL)
counti++,n=n->link
return counti
}
NODE* getindex(NODE* head, int num)
NODE* getindex(NODE* head, int num)//取得index为num 的节点!
{
if(num<0 || num>countit(head))
return NULL
NODE* rn = head
while(--num>0)
rn = rn->link
return rn
}
int binSearch(NODE* n,char *strinput,int low, int high)// 二分查找
{
int i
int middle = (high+low)/2
if (high <low)
return 0
if ((i=strcmp(strinput, n->number)) <0)
high= middle
else if (i >0)
low = middle
else
{
i = middle
return i
}
binSearch(getindex(n,middle),strinput,low,high)
}
int bisect(char a[],int n,char s[MAXN])//二分查找
{
int i,j,m
i=0
j=n-1
while(i <=j)
{
m=(i+j)/2
}
return(-1)
}
NODE *search1(NODE *head,char v[MAXN])//起点站顺序查找
{
for(head!=NULL&&strcmp(head->start_station,&v[0])head=head->link)
return(head)
}
NODE *search2(NODE *head,char w[MAXN])//到达站顺序查找
{
for(head!=NULL&&strcmp(head->end_station,&w[0])head=head->link)
return(head)
}
NODE *search3(NODE *head,char x[MAXN],char y[MAXN])//起飞时间顺序查找
{
for(head!=NULL&&(strcmp(head->start.hour,&x[0]) || strcmp(head->start.minute,&y[0]))head=head->link)
return(head)
}
NODE *search4(NODE *head,char t[MAXN],char u[MAXN])//到达时间顺序查找
{
for(head!=NULL&&(strcmp(head->end.hour,&t[0]) || strcmp(head->end.minute,&u[0]))head=head->link)
return(head)
}
void output(NODE *p)
{
while(p!=NULL)
{
printf("航班信息:\n")
printf("航班号:%s\n",p->number)
printf("起飞时间:%s点%s分,",p->start.hour,p->start.minute)
printf("到达时间:%s点%s分\n",p->end.hour,p->end.minute)
printf("起点站:%s,",p->start_station)
printf("到达站:%s\n",p->end_station)
printf("飞机型号:%s ",p->type)
printf("票价:%s元\n\n",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
}
}
return head
}
int main(int argc, char* argv[])
{
NODE *p,*q,*r
int a,b,i,j,n
int count=0
char o[MAXN]
char s[MAXN]
char v[MAXN]
char w[MAXN]
char x[MAXN]
char y[MAXN]
char t[MAXN]
char u[MAXN]
for(i=0i <MAXNi++)
{
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(" 6.退出本系统\n")
printf("★*******************************★\n")
scanf("%d",&a)
getchar()
switch(a)
{
case 1:
printf("请输入你所要建立的航班信息个数:")
scanf("%d",&n)
p=create_link_list(n)
break
case 2:
q=create_link_list(1)
insert(&p,q)
break
case 3:
p = rank(p)
break
case 4:
printf("\n1、按照航班号查询.\n")
printf("2、按照起点站查询.\n")
printf("3、按照到达站查询.\n")
printf("4、按照起飞时间查询.\n")
printf("5、按照到达时间查询.\n")
scanf("%d",&b)
getchar()
switch(b)
{
case 1:
p=rank(p)
printf("请输入您所要找的航班号:")
scanf("%s",s)
if( binSearch(p,s,1, countit(p)) )
printf("scuess!\n")
break
case 2:
printf("请输入起点站")
scanf("%s",&v[MAXN])
if(search1(p,&v[MAXN])!=NULL)
{
printf("查询成功!\n")
r=search1(p,&v[MAXN])
output(r)
}
else
printf("查询失败,该信息录中没有该起点站!\n")
break
case 3:
printf("请输入到达站")
scanf("%s",&w[MAXN])
if(search2(p,&w[MAXN])!=NULL)
{
printf("查询成功!\n")
r=search2(p,&w[MAXN])
output(r)
}
else
printf("查询失败,该信息录中没有该到达站!\n")
break
case 4:
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
case 5:
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
case 5:
output(p)
printf("\n")
break
case 6:
return(0)
}
}
return(0)
}
void distribute(slnode *sl,int i,arrtype_n f,arrtype_n e){
int j,p
for(j=0j<radix_nj++)
{
f[j]=e[j]=0
}
for(p=sl[0].nextpp=sl[p].next)
{
j=sl[p].keys[i]%48
if(!f[j])
f[j]=p
else
sl[e[j]].next=p
e[j]=p
}
}
void collect(slnode *sl,int i,arrtype_n f,arrtype_n e)
{
int j,t
for(j=0!f[j]j++)
sl[0].next=f[j]
t=e[j]
while(j<radix_n-1)
{
for(j=j+1j<radix_n-1&&!f[j]j++)
if(f[j])
{
sl[t].next=f[j]
t=e[j]
}
}
sl[t].next=0
}
void distribute_c(slnode *sl,int i,arrtype_c f,arrtype_c e)
{
int j,p
for(j=0j<radix_cj++)
{
f[j]=e[j]=0
}
for(p=sl[0].nextpp=sl[p].next)
{
j=sl[p].keys[i]%65
if(!f[j])
f[j]=p
else
sl[e[j]].next=p
e[j]=p
}
}
void collect_c(slnode *sl,int i,arrtype_c f,arrtype_c e)
{
int j,t
for(j=0!f[j]j++)
sl[0].next=f[j]
t=e[j]
while(j<radix_c-1)
{
for(j=j+1j<radix_c-1&&!f[j]j++)
if(f[j])
{
sl[t].next=f[j]
t=e[j]
}
}
sl[t].next=0
}
void radixsort(sllist &l)//链式
{
int i
arrtype_n fn,en
arrtype_c fc,ec
for(i=0i<l.lengthi++)
l.sl[i].next=i+1
l.sl[l.length].next=0
for(i=l.keynum-1i>=2i--)
{
distribute(l.sl,i,fn,en)
collect(l.sl,i,fn,en)
}
for(i=1i>=0i--)
{
distribute_c(l.sl,i,fc,ec)
collect_c(l.sl,i,fc,ec)
}
}
void arrange(sllist &l)//重新整理
{
int p,q,i
slnode temp
p=l.sl[0].next
for(i=1i<l.lengthi++)
{
while(p<i)
p=l.sl[p].next
q=l.sl[p].next
if(p!=i)
{
temp=l.sl[p]
l.sl[p]=l.sl[i]
l.sl[i]=temp
l.sl[i].next=p
}
p=q
}
}
int binsearch(sllist l,keytype key[])
{
int low,high,mid
low=1
high=l.length
while(low<=high)
{
mid=(low+high)/2
if(strcmp(key,l.sl[mid].keys)==0)
return mid
else if(strcmp(key,l.sl[mid].keys)<0)
high=mid-1
else
low=mid+1
}
return 0
}
void seqsearch(sllist l,keytype key[],int i)
{
int j,k,m=0
printf("*************************************************************\n")
printf("* 航班号 起始站 终点站 航班期 起飞时间 到达时间 机型 票价*\n")
for(j=1j<=l.lengthj++)
{
switch(i)
{
case 2:k=strcmp(key,l.sl[j].others.start)break
case 3:k=strcmp(key,l.sl[j].others.end)break
case 4:k=strcmp(key,l.sl[j].others.time1)break
case 5:k=strcmp(key,l.sl[j].others.time2)break
}
if(k==0)
{
m=1
printf("* %-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d *\n",l.sl[j].keys,l.sl[j].others.start,l.sl[j].others.end,l.sl[j].others.sche,l.sl[j].others.time1,l.sl[j].others.time2,l.sl[j].others.model,l.sl[j].others.price)
}
}
if(m==0)
printf("* 无此航班信息,可能是输入错误*\n")
printf("*************************************************************\n")
}
void searchcon(sllist l)
{
keytype key[keylen]
int i=1,k
while(i>=1&&i<=5)
{printf("\n ********************\n")
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(" 请选择(0-5):")
scanf("%d",&i)
printf("\n")
switch(i)
{case 1:printf("输入要查询的航班号(字母要大写):")
scanf("%s",key)
k=binsearch(l,key)
printf("*************************************************************\n")
if(k==0)
printf("* 无此航班信息,可能是输入错误!*\n")
else
{
printf("* 航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价*\n")
printf("* %-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d *\n",l.sl[k].keys,l.sl[k].others.start,l.sl[k].others.end,l.sl[k].others.sche,l.sl[k].others.time1,l.sl[k].others.time2,l.sl[k].others.model,l.sl[k].others.price)
}
printf("*************************************************************\n")
break
case 2:printf("输入要查询的航班起点站名:")
scanf("%s",key)
seqsearch(l,key,i)
break
case 3:printf("输入要查询的航班起点站名:")
scanf("%s",key)
seqsearch(l,key,i)
break
case 4:printf("输入要查询的航班起点站名:")
scanf("%s",key)
seqsearch(l,key,i)
break
case 5:printf("输入要查询的航班起点站名:")
scanf("%s",key)
seqsearch(l,key,i)
break
case 0:printf("\n\n\n 再 见n\n\n")
}
}
}
void inputdata(sllist &l)
{
int i=++l.length
char yn='y'
while(yn=='y'||yn=='Y')
{
printf("航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价\n")
scanf("%s%s%s%s%s%s%s%d",l.sl[i].keys,l.sl[i].others.start,l.sl[i].others.end,l.sl[i].others.sche,l.sl[i].others.time1,l.sl[i].others.time2,l.sl[i].others.model,&l.sl[i].others.price)
++igetchar()
radixsort(l)
arrange(l)
printf("继续输入吗?y/n:")
scanf("%c",&yn)
}
l.length=i-1
}
void main()
{
sllist l
l.keynum=6
l.length=0
inputdata(l)
searchcon(l)
}