数据结构课程设计航班信息的查询与检索.docx
《数据结构课程设计航班信息的查询与检索.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计航班信息的查询与检索.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计航班信息的查询与检索
第1章概述
排序和查找是在数据信息处理中使用频度极高的操作.为了加快查找的速度,需要先对数据记录按关键字排序.当今乘飞机旅行的人越来越多,人们需要关心了解各类航班的班次、时间、价格及机型等信息。
在这个飞机航班数据的信息模型中,航班号是关键字,而且是具有结构特点的一类关键字。
因为航班号是字母数字混变的,例如CZ3869,这种记录集合是一个适合与多关键字排序的例子。
第2章设计要求与分析
2.1设计要求
该设计要求对飞机航班信息进行排序和查找.可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息进行查询.
对于本设计,可采用基数排序法对一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快速查找,按其他词关键字的查找可采用最简单的顺序查找方法进行,因为他们用的较少。
每个航班记录包括八项,分别是:
航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号以及票价等,假设航班信息表如下表所示:
航班信息表
航班号
起点站
终点站
班期
起飞时间
到达时间
机型
票价
CA1544
合肥
北京
1。
2.4.5
1
60
MU5341
上海
广州
每日
1420
1615
M90
1280
CZ3869
重庆
深圳
2。
4。
6
1010
MU3682
桂林
南京
2.3。
4。
6。
7
2050
2215
M90
1380
HU1836
上海
北京
每日
1250
CZ3528
成都
厦门
1.3.4.5.7
1510
1650
CRJ
1060
MU4594
昆明
西安
1.3。
5.6
1
60
SC7425
青岛
海口
1。
3。
6
1920
2120
DH4
1630
其中航班号一项的格式为:
k0k1k3k4k5k6
C
Z
3
8
6
9
其中k0和k1的输入值是航空公司的别称,用两个大写字母表示,后4位为航班表号,这种航班号关键字可分成两段,即字母和数字。
其余七项输入内容因为不涉及本设计的核心,因此除了票价为数值型外,均定义为字符串型即可。
2.2设计分析
2.2。
1定义数据类型
根据设计要求,我们知道设计中所用到的数据记录只有航班信息,因此要定义行管的数据类型:
Typedefstruct{
Charstart[7];
Charend[7];
Charsche[12];
Chartime1[5];
Chartime2[5];
Charmodel[4];
Intprice;
}InfoType;
Typedefstruct{
KeyTypekeys[keylen];
InfoTypeothers;
Intnext;
}SLNode;
Typedefstruct{
SLNodes1[MaxSpace];
Intkeylen;
Intlength;
}SLList;
为了进行基数排列,需要定义在分配和手机操作使用到的指针数组:
TypedefintArrType_n[10];
TypedefintArrType_。
c[26];
2.2.2实现排序的个函数说明
(1)一趟分配函数:
VoidDistribute(SLNode*s1,intI,ArrTypef,ArrTypee);
//本算法是按关键字keys[i]建立RADIX个子集,是同一个子集中记录的keys[i]相同,//f[0。
.RADIX]和e[0.。
RADIX]分别指向各自表中的第一个和最后一个记录
(2)一趟搜集函数:
VoidCollect(SLNode*s1,inti,ArrTypef,ArrTypee);
//本算法是按关键字keys[i]从小到大将[0。
.RADIX]所指的各子表一次连接成一个链表
(3)链式基数排序函数:
VoidRadixSort(SLList&L);
//本算法是按关键字从低位到高位依次对各关键字进行分配和收集,分两端实现
(4)二分查找函数:
IntBinSerach(SLListL,KeyTypekey[]);
//L为待查找的表,key[]为待查找的关键字,按二分查找的思想实现查找
(5)主控函数:
Voidmain()
{
初始化;
数据输入;
排序处理;
接受查找要求及查找关键字;
查找处理;
输出查找结果;
}
第3章算法实现
3。
1一趟分配算法
VoidDistribute(SLNode*s1,intI,ArrTypef,ArrTypee)
{
Intj,p;
For(j=0;j{//分子表初始化为空表
F[j]=0;
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;
Else
S1[e[j]].next=p;
E[j]=p;
}
}
3.2一趟收集算法
VoidColect(SLNode*s1,intI,ARRTypef,ArrTypee)
{
Intj,t;
For(j=0;!
f[j];j++);
S1[0].next=f[j];t=e[j];
While(j{
For(j=j+1;j〈RADIX—1&&!
f[j];j++);
If(f[j]){s1[t]。
next=f[j];t=e[j];}
}
S1[t]。
next=0;
}
//主函数程序
#includeh〉
#include〈string.h〉
#defineMaxSpace100
#definekeylen6
#defineRADIX_n10
#defineRADIX_c26
#defineSHOW_MSG_ERROR"\n错误信息:
航班号须由2位大写字母和4位数字组成。
\n输入数据错误,程序终止执行!
\n”
typedefcharKeyType;
typedefstruct{
charstart[6];
charend[6];
charsche[6];
chartime1[6];
chartime2[6];
charmodel[3];
intprice;
}InfoType;
typedefstruct{
KeyTypekeys[keylen];
InfoTypeothers;
intnext;
}SLNode;
typedefstruct{
SLNodesl[MaxSpace];
intkeynum;
intlength;
}SLList;
typedefintArrType_n[RADIX_n];
typedefintArrType_c[RADIX_c];
KeyTypekey[keylen],kl[4];
voidDistribute(SLNode*sl,inti,ArrType_n&f,ArrType_n&e);
voidCollect(SLNode*sl,inti,ArrType_nf,ArrType_ne);
voidDistribute_c(SLNode*sl,inti,ArrType_c&f,ArrType_c&e);
voidCollect_c(SLNode*sl,inti,ArrType_cf,ArrType_ce);
voidRadixSort(SLList&L);
voidArrange(SLList&L);
intBinSearch(SLListL,KeyTypekey[]);
voidSeqSearch(SLListL,KeyTypekey[],inti);
voidDisplayStyle(inti,char*s);
voidDisplay(SLListL,inti);
voidsearchcon(SLListL);
voidPrompt();
boolInputData(SLList&L);
boolCheck_HangBanHao(char*HangBanHao);
voidDistribute(SLNode*sl,inti,ArrType_n&f,ArrType_n&e)
{
intj,p;
for(j=0;j〈RADIX_n;j++)
f[j]=0;
for(p=sl[0]。
next;p;p=sl[p]。
next)
{
j=sl[p]。
keys[i]%48;
if(!
f[j])
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
}
}
voidCollect(SLNode*sl,ArrType_nf,ArrType_ne)
{
intj,t;
for(j=0;!
f[j];j++);
sl[0]。
next=f[j];
t=e[j];
while(j{
for(j=j+1;jf[j];j++);
if(f[j])
{
sl[t].next=f[j];t=e[j];
}
}
sl[t].next=0;
}
voidDistribute_c(SLNode*sl,inti,ArrType_c&f,ArrType_c&e)
{
intj,p;
for(j=0;jf[j]=0;
for(p=sl[0].next;p!
=0;p=sl[p].next)
{
j=sl[p]。
keys[i]%65;
if(!
f[j])
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
}
}
voidCollect_c(SLNode*sl,ArrType_cf,ArrType_ce)
{
intj,t;
for(j=0;!
f[j];j++);
sl[0].next=f[j];t=e[j];
while(j{
for(j=j+1;jf[j];j++);
if(f[j])
{
sl[t]。
next=f[j];t=e[j];
}
}
sl[t].next=0;
}
voidRadixSort(SLList&L)
{
inti;
ArrType_nfn,en;
ArrType_cfc,ec;
for(i=0;i〈L。
length;i++)
L.sl[i]。
next=i+1;
L。
sl[L.length].next=0;
for(i=L。
keynum—1;i〉=2;i——)
{
Distribute(L.sl,i,fn,en);
Collect(L.sl,fn,en);
}
for(i=1;i〉=0;i—-)
{
Distribute_c(L.sl,i,fc,ec);
Collect_c(L.sl,fc,ec);
}
}
voidArrange(SLList&L)
{
intp,q,i;
SLNodetemp;
p=L。
sl[0].next;
for(i=1;i〈L。
length;i++)
{
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;
}
}
intBinSearch(SLListL,KeyTypekey[])
{intlow,high,mid;
low=1;high=L.length;
while(low〈=high){
mid=(low+high)/2;
if(strcmp(key,L。
sl[mid].keys)==0)
returnmid;
elseif(strcmp(key,L.sl[mid]。
keys)〈0)
high=mid-1;
elselow=mid+1;
}
return0;
}
voidSeqSearch(SLListL,KeyTypekey[],inti)
{intj,k,m=0;
for(j=1;j<=L.length;j++)
{
switch(i){
case2:
k=strcmp(key,L。
sl[j].others.start);break;
case3:
k=strcmp(key,L。
sl[j].others.end);break;
case4:
k=strcmp(key,L。
sl[j]。
others.time1);break;
case5:
k=strcmp(key,L。
sl[j]。
others。
time2);break;
}
if(k==0)
{
m=1;
Display(L,j);
}
}
if(m==0)
printf("很抱歉,无此航班信息。
\n”);
}
voidDisplay(SLListL,inti)
{
printf("航班号起点站终点站航班期起飞时间到达时间机型票价\n”);
DisplayStyle(6,L.sl[i].keys);DisplayStyle(7,L.sl[i].others。
start);
DisplayStyle(7,L.sl[i].others。
end);DisplayStyle(7,L.sl[i]。
others。
sche);
DisplayStyle(9,L。
sl[i].others.time1);DisplayStyle(9,L.sl[i].others.time2);
DisplayStyle(5,L.sl[i].others。
model);printf("%6d\n”,L.sl[i].others。
price);
printf("\n");
}
voidDisplayStyle(inti,char*s)
{
intj;
i-=strlen(s);
for(j=0;j〈i;++j)
printf(””);
printf(”%s,",s);
}
voidsearchcon(SLListL)
{
inti=1,k;
while(i〉=1&&i〈=5){
printf(”\n请选择命令代号(0--—-5):
");
scanf("%d",&i);
switch(i){
case1:
printf(”输入要查询的航班号(字母要大写):
”);
scanf("%s”,key);k=BinSearch(L,key);
if(k)
Display(L,k);
else
printf("很抱歉,无此航班信息。
\n");
break;
case2:
printf("输入要查询的航班起点站名:
");
scanf(”%s”,key);SeqSearch(L,key,i);
break;
case3:
printf(”输入要查询的航班终点站名:
”);
scanf("%s",key);SeqSearch(L,key,i);
break;
case4:
printf(”输入要查询的航班起飞时间:
");
scanf("%s”,kl);SeqSearch(L,kl,i);
break;
case5:
printf(”输入要查询的航班到达时间:
”);
scanf(”%s”,kl);SeqSearch(L,kl,i);
break;
case0:
printf("再见!
\n");
return;
}
Prompt();
}
}
voidPrompt()
{
printf(”***************************************************\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");
}
boolInputData(SLList&L)
{
inti=++L。
length;
charyn='y';
printf("\n请依次录入航班信息数据(航班号由2位大写字母和4位数字组成):
");
do
{
printf(”\n航班号起点站终点站航班期起飞时间到达时间机型票价\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);
fflush(stdin);
if(!
Check_HangBanHao(L。
sl[i].keys))
returnfalse;
++i;
printf(”继续输入吗?
y/n:
”);
scanf(”%c",yn);
}
while(yn=='y'||yn==’Y’);
printf(”\n”);
L.length=i-1;
RadixSort(L);
Arrange(L);
returntrue;
}
boolCheck_HangBanHao(char*HangBanHao)
{
if(strlen(HangBanHao)!
=6)
returnfalse;
elseif(HangBanHao[0]<'A'||HangBanHao[0]〉’Z’
||HangBanHao[1]<'A’||HangBanHao[1]>’Z’)
returnfalse;
for(inti=2;i〈=5;i++)
{
if(HangBanHao[i]<’0’||HangBanHao[i]〉'9')
returnfalse;
}
returntrue;
}
intmain()
{
SLListL;
L。
keynum=6;L.length=0;
Prompt();
if(!
InputData(L))
{
printf(SHOW_MSG_ERROR);
return1;
}
searchcon(L);
return0;
}
3.3链式基数排序算法
VoidRadixSort(SLList&L)
{
ArrType_nfn,en;
ArrType_cfc,en;
For(i=0;kL。
s1[i].next=i+1;
L。
s1[L。
lsength]。
next=0;
For(i=L。
keynum—1;i>=2;i--)
{//需分为两段完成,因为自负的那个分关键字要单独做
Distribute_n(L。
s1,i,fn,en);
Collect_n(L.s1,i,fn,en);
}
For(i=1;i〉=0;i--)
{
Distribute_c(L。
s1,i,fc,ec);
Collect_c(L.s1,i,fc,ec);
}
}//RadixSort
//按指针链整理链表
VoidArrange(SLList&L)
{
p=L。
s1[0].next;
For(i=1;i〈L。
length;i++)
{
While(p
next;
//找到第i个记录,并用p指示其在L中的当前位置
Q=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;
}
}//AArrange
3。
4二分查找的函数定义
IntBinSearch(SLListL,KeysTypekey[])
{
While(low<=high){
Mid=(low+high)/2;
If(strcmp(key,L。
s1[mid]。
keys)==0)
Returnmid;
Elselow=mid+1;
}
Return0;
}//BinSearch
第4章程序代码
#includeh>
#include〈string.h>
/*宏定义*/
#defineMaxSpace100
#definekeylen6
#defineRADIX_n10
#defineRADIX_c26
#defineSHOW_MSG_ERROR"\n错误信息:
航班号须由2位大写字母和4位数字组成。
\n输入数据错误,程序终止执行!
\n”
typedefcharKeyType;
/*航班记录数据结构描述*/
typedefstruct{
charstart[6];//起点
charend[6];//终点
charsche[6];//班期
cha