1、航班信息查询与检索航班信息的查询与检索f94#include#include#include#define MaxSpace 100#define keylen 6#define RADIX_n 10#define RADIX_c 26typedef char KeyType;typedef struct char start8; /起点 char end8; /终点 char sche8; /班期 char time16; /起飞时间 char time26; /到达时间 char model6; /机型 int price; /票价InfoType; /航班记录类型typedef stru
2、ct KeyType keyskeylen; /关键字 InfoType others; int next;SLNode; /表节点typedef struct SLNode s1MaxSpace; /静态链表,是s10为头结点 int keynum; /关键字长 int length; /当前表长SLList; /静态联表类型typedef int ArrType_nRADIX_n;typedef int ArrType_cRADIX_c;int m=0,num=0;/*本算法时按关键字keysi建立radix个子表,使同一个子表中记录的keysi相同,f0radix和e0.radix分别指
3、向各子表,使同一个子表中的第一个和最后一个记录*/void Distribute(SLNode *s1,int i,ArrType_n f,ArrType_n e) int j,p; for(j=0;jRADIX_n;j+) /*各子表初始化*/ fj=0; ej=0; for(p=s10.next;p;p=s1p.next) j=s1p.keysi%48; /*将数字字符转换成对应的数值性数字*/ if(!fj) fj=p; else s1ej.next=p; ej=p; /*将p指向的结点插入到第j个结点*/ /*本算法是按关键字keysi从小到大将0radix所指的各子表依次链接成一个链
4、表*/void Collect(SLNode *s1,ArrType_n f,ArrType_n e) int j,t; for(j=0;!fj;j+); /*找到第一个非空子表*/ s10.next=fj; /*sl0.next指向第一个非空子表中的一个结点*/ t=ej; while(jRADIX_n-1) for(j=j+1;jRADIX_n-1 & !fj;j+); /*找下一个非空子表*/ if(fj) /*连接两个非空字表*/ s1t.next=fj; t=ej; s1t.next=0; /*t指向最后一个非空子表*/void Distribute_c(SLNode *s1,int
5、 i,ArrType_c f,ArrType_c e) int j,p; for(j=0;jRADIX_c;j+) fj=0; ej=0; for(p=s10.next;p!=0;p=s1p.next) j=s1p.keysi%65; if(!fj) fj=p; else s1ej.next=p; ej=p; void Collect_c(SLNode *s1,ArrType_c f,ArrType_c e) int j,t; for(j=0;!fj;j+); s10.next=fj; t=ej; while(jRADIX_c-1) for(j=j+1;jRADIX_c-1 & !fj;j+)
6、; if(fj) s1t.next=fj; t=ej; s1t.next=0;/*本算法是按关键字从低位到高位依次对个关键字进行分配和收集,分两段实现:其中RadixSort方法通过调用前面的分配函数和收集函数来从最后一个关键字开始进行整理。*/void RadixSort(SLList *L) int i; ArrType_n fn,en; ArrType_c fc,ec; for(i=0;ilength;i+) L-s1i.next=i+1; L-s1L-length.next=0; /*将改造为静态链表*/ for(i=L-keynum-1;i=2;i-) /*按最低位优先依次对各关键字
7、进行分配和收集*/ 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); void Arrange(SLList *L) int p,q,i; SLNode temp; p=L-s10.next; /*p指示第一个记录的当前位置*/ for(i=1;ilength;i+) while(ps1p.next; q=L-s1p.next; /*q指示尚未调整的表尾*/ if(p!=i) temp=L-s1p; L-s1p=L-s
8、1i; L-s1i=temp; L-s1i.next=p; /*指向被移走的记录*/ p=q; / *p指向尚未调整的表尾,为下一个准备*/ /*L为待查找的表,key为待查找的关键字,按二分查找的思想实现查找*/int BinSearch(SLList *L,KeyType key) int low,high,mid; low=1; high=Lfc1-length-1; while(lows1mid.keys)=0) return mid; else if(strcmp(key,L-s1mid.keys)s1i.keys,L-s1i.others.start,L-s1i.others.en
9、d,L-s1i.others.sche,L-s1i.others.time1,L-s1i.others.time2,L-s1i.others.model,L-s1i.others.price);void SeqSearch(SLList *L,KeyType key,int i) int j,k,m=0; for(j=1;jlength;j+) switch(i) case 2:k=strcmp(key,L-s1j.others.start); break; case 3:k=strcmp(key,L-s1j.others.end); break; case 4:k=strcmp(key,L-
10、s1j.others.time1); break; case 5:k=strcmp(key,L-s1j.others.time2); break; if(k=0) m=1; Display(L,j); if(m=0) printf(无此航班信息,可能是输入错误!n);void delete(SLList *L,KeyType key) int j,k=0; for(j=1;jlength;j+) if(strcmp(key,L-s1j.keys)=0) k=j; break; if(k=0) printf(对不起,没有这个航班!n); else if(k=L-length-1) L-lengt
11、h-; else for(j=k;jlength-1;j+) L-s1j=L-s1j+1; L-length-; /*对于此算法主要是注意信息长度的赋值,对于每次调用要作相应的改变。*/void InputData(SLList *L) int i,j,n; char kn; char yn=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
12、i.keys,L-s1i.others.start,L-s1i.others.end,L-s1i.others.sche,L-s1i.others.time1,L-s1i.others.time2,L-s1i.others.model,&L-s1i.others.price); scanf(%c,&kn); if(m!=1) for(j=1;js1i.keys,L-s1j.keys)=0) printf(sorry,你输入的航班已经存在!n); n=1; break; if(n=0) i+; printf(继续输入吗?y/n:); scanf(%c,&yn); L-length=i; if(n
13、=0) RadixSort(L); Arrange(L); void serachcon(SLList *L,int n) int i=1; while(i!=0) char keykeylen; char kl4; int k,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. 显示所
14、有航班信息 *n); if(n=1) printf(t* 7. 插入新的航班信息 *n); printf(t* 8. 删除旧的航班信息 *n); printf(t* 0. 退出系统 *n); printf(t*n); if(n=1) printf(t* 请选择(08) *n); else printf(t* 请选择(06) *n); scanf(%d,&i); if(i=1) printf(输入要查询的航班号(区分大小写):); scanf(%s,key); k=BinSearch(L,key); if(k=0) printf(无此航班信息,可能是输入错误!n); else Display(L
15、,k); else if(i=2) printf(输入要查询的航班起点站名:); scanf(%s,key); SeqSearch(L,key,i); else if(i=3) printf(输入要查询的航班终点站名:); scanf(%s,key); SeqSearch(L,key,i); else if(i=4) printf(输入要查询的航班起飞时间:); scanf(%s,kl); SeqSearch(L,kl,i); else if(i=5) 65f printf(输入要查询的航班到达时间:); scanf(%s,kl); SeqSearch(L,kl,i); else if(i=6
16、) if(L-length=1) printf(对不起,没有航班信息!n); else printf(显示所有航班信息:n); for(j=1;jlength;j+) Display(L,j); else if(i=7 & n=1) printf(输入要插入的所有相关信息!n); InputData(L); else if(i=8 & n=1) printf(输入要删除的航班号!:); scanf(%s,key); delete(L,key); else if(i=0) printf(t再见!n); return ; else printf(无此操作,可能是输入错误,请再输入!n); void
17、 login(SLList *L) char str10; int i=1; printf(if you are administrator,please Login! or input exit to exit !n); while(i) printf(Input you username:); scanf(%s,&str); if(strcmp(str,fangcao)=0) printf(nInput you password:); scanf(%s,&str); if(strcmp(str,19870923)=0) serachcon(L,i); break; else printf(you password is wrong!n); else if(strcmp(str,exit)=0) i=0; serachcon(L,i); else printf(you username is wrong!n); void main() SLList *L; L=(SLList *)malloc(sizeof(SLList); L-keynum=6; L-length=0; InputData(L); login(L);0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1