数据结构课程设计航班信息的查询与检索.docx

上传人:b****5 文档编号:11884377 上传时间:2023-04-08 格式:DOCX 页数:31 大小:115.53KB
下载 相关 举报
数据结构课程设计航班信息的查询与检索.docx_第1页
第1页 / 共31页
数据结构课程设计航班信息的查询与检索.docx_第2页
第2页 / 共31页
数据结构课程设计航班信息的查询与检索.docx_第3页
第3页 / 共31页
数据结构课程设计航班信息的查询与检索.docx_第4页
第4页 / 共31页
数据结构课程设计航班信息的查询与检索.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

数据结构课程设计航班信息的查询与检索.docx

《数据结构课程设计航班信息的查询与检索.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计航班信息的查询与检索.docx(31页珍藏版)》请在冰豆网上搜索。

数据结构课程设计航班信息的查询与检索.docx

数据结构课程设计航班信息的查询与检索

第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;

//主函数程序

#include

h〉

#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;j

f[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;j

f[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;j

f[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;k

L。

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章程序代码

#include

h>

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1