1、 /航班记录类型 typedef struct KeyType keyskeylen; /关键字 InfoType others; int next; slnode; /表结点 SLNode slMaxSpace; /静态链表,s10为头结点 int keylen; /关键字长 int length; /当前表长 SLList; /静态链表类型 为了进行基数排序,需要定义在分配和收集操作时用到的指针数组:typedef int ArrType_n10; /十进制数字指针数组 typedef int ArrType_c26; /26个字母指针数组3.3 实现排序的各函数的说明1)一趟分配函数:v
2、oid Distribute(SLNode *s1,int i,ArrType f,ArrType e);/本算法是按关键字keyi建立RADIX个子表,使同一个子表中记录的keysi/相同,f0.RADIX和e0.RADIX分别指向各子表中的第一个和最后一个记录 2)一趟搜集函数:void Collect(SLNode *s1,int i,ArrType f,ArrType e);/本算法是按关键字keysi从小到大将0.RADIX所指的各子表依次链接成一个链表 3)链式基数排序函数:void RadixSort(SLList &L);/本算法是按关键字从低位到高位依次对各关键字进行分配和收
3、集,分两段实现 4)二分查找函数: int BinSearch(SLList L,KeyType key);/L为待查找的表,key为待查找的关键字,按二分查找的思想实现查找 5)主控函数 void main() 初始化;数据输入;排序处理;接受查找要求及查找关键字;查找处理;输出查找结果; 4 详细设计4.1 数据类型的定义根据设计要求我们知道所用的记录中只有航班信息因此要定义相关的数据类型其源程序如下 typedef struct char start6;/起点 char end6;char sche10;/班期 /起飞时间 /到达时间 /机型 infotype; /航班记录类型 type
4、def struct keytype keyskeylen;/关键字航班号 infotype others;slnode; /静态链表类型 slnode slmaxspace;/静态链表sl0为头结点 int keynum; /记录当前关键字字符个数 /当前表长 sllist; typedef int arrtype_nradix_n;/十进制数字指针 typedef int arrtype_cradix_c;/26个字母指针4.2 链式基数排序 否 是4.3 重新整理静态链表重新整理静态链表,P指示第一个记录的当前位置,L.s11.i-1已按关键字有序排列 ,第一个记录在L中的当前位置应不小
5、于i,使用while循环,找到第i个记录,并用p指示其在L中的当前位置,而q指示尚未调整的表尾,若if(p!=i) 则p指向被移走的记录,使得以后可由while循环找回 ,当p=q时,p指向尚未调整的表尾,为找到第i+个记录做准备 4.4 查找算法实现4.4.1 二分查找函数 是 是4.4.2 顺序查找函数void SeqSearch(SLList L,KeyType key,int i) int j,k,m=0; for(j=1;j=1 & i=5) *nprintf(* 航班信息查询系统 *n* 1 航班号 *n* 2 起点站 *n* 3 终点站 *n* 4 起飞时间 *n* 5 到达时间
6、 *n* 0 退出系统 *n*n 请选择0-5:n scanf(%d,&i);switch(i) case 1: printf(输入要查的航班号(字母要大写): scanf(%s,key);k=BinSearch(L,key); Display(L,k);case 2:输入要查询的航班起点站名:SeqSearch(L,key,i); break;case 3:输入要查询的航班终点站点: SeqSearch(L,key,i);case 4:输入要查询的航班起飞时间:,k1); SeqSearch(L,k1,i);case 5:输入要查询的航班到达时间:case 0:再 见! n return 0
7、;void InputData(SLList &L) int i=+L.length;char yn=y;while(yn= | yn=Y) printf(航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价n%s%s%s%s%s%s%s%d,L.s1i.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);+i;继续输入吗? y/n:%cyn);L.length
8、=i-1; 5 运行与测试航班信息输入如图:按航班号查询:输入航班号错误则显示如下图:按航班起点站查询:按起飞时间查询:显示查询主菜单,退出查询系统:6 总结与心得 通过本实验,我了解了基数排序是作为一种内部排序方法,当关键字位数较少而排序序列较长时,该排序算法有一定的优越性。而对于有序序列的查找算法,二分查找是一种效率比较高的方法。在本实验中,对这两种算法的应用,我加深了对他们的理解,掌握了他们的实现方法。 在本次实验过程中,输入错误还是存在的问题,但能很快的通过编译解决,一些编译不能发现的问题,在组建过程中也能发现并解决。这次实验的过程中遇到了很多问题,定义的过程中存在定义不清楚的问题,还
9、有一些模糊定义和重定义的问题出现。在程序的定义过程中,存在着函数的调用失败的问题,在调用过程中不能正常调用,通过把调用的函数直接用在程序中,不通过调用的方法,使得程序正常运行。本次实验的问题只要通过调试和对整个程序的理解,便可以解决所有的发现的问题 本次实验利用二分查找法很快的完成了对航班信息的查找,使我们对二分查找有了一个很好的掌握。其查找过程是先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。 在实验过程中,程序中许多定义需要我们有一个很仔细的了解,比如上述的对字符长度的定义,这需要对所定义的对象给一个合理的字符长度,在输入的过程中才不会出现因输入的字符长度过长
10、而不能识别。本次实验中用到了静态链表,定义静态链表的过程中,需要有一个很熟悉的了解,知道静态链表是如何定义以及如何实现。通过这次实验,使得对于查找以及检索有了一个很好的掌握,让我们在以后的程序设计过程中对于类似的函数定义有一个很清晰的过程以及了解。7 参考文献1)徐孝凯,魏荣数据结构,机械工程出版社2) 谭浩强程序设计,北京大学出版社 3) 杨路明C语言程序设计教程,北京邮电大学出版社.4) 耿国华数据结构-C语言描述,高等教育出版社8 附录(程序源代码)#include string.h#define MaxSpace 100#define keylen 7#define RADIX_n 1
11、0#define RADIX_c 26typedef char KeyType;char start6; /起点 /终点 /班期 /起飞时间 /到达时间 /机型 /票价InfoType;typedef struct /关键字(航班号)int next;SLNode; /静态链表结点类型 /静态链表,s10为头结点 /记录当前关键字字符个数SLList;typedef int ArrType_nRADIX_n; /十进制数字指针数组typedef int ArrType_cRADIX_c;/ 一趟数字字符分配函数void Distribute(SLNode *sl,int i,ArrType_n
12、 f,ArrType_n e)int j,p;for(j=0;RADIX_n; /各子表置为空表fj=ej=0;for(p=sl0.next;p;p=slp.next)j=slp.keysi%48; /将数字字符转换成相对应的数值型数字if(!fj)fj=p;elseslej.next=p;ej=p; /将p指向的结点插入到第j个子表中/ 一趟数字字符的收集函数void Collect(SLNode *sl,int i,ArrType_n f,ArrType_n e)int j,t;!fj;j+) /找第一个非空子表sl0.next=fj; /s10.next指向第一个非空子表中的一个结点t=
13、ej;while(jRADIX_n-1)for(j=j+1;RADIX_n-1&j+) /找下一个非空子表if(fj)slt.next=fj; t=ej; /链接两个非空子表slt.next=0; /t指向最后一个非空子表中的最后一个结点/ 一趟字母字符分配函数void Distribute_c(SLNode *sl,int i,ArrType_c f,ArrType_c e)RADIX_c;j=slp.keysi%65; /将字母字符转换成在字母集中相应的序号(0-25)/ 一趟字母字符收集void Collect_c(SLNode *sl,int i,ArrType_c f,ArrType
14、_c e)j+);RADIX_c-1)RADIX_c-1&/链式基数排序函数L)/链式int i;ArrType_n fn,en;ArrType_c fc,ec;for(i=0;i=2;i-) /按最低位优先次序对各关键字进行分配和收集,先做低4位数字部分Distribute(L.sl,i,fn,en);Collect(L.sl,i,fn,en);for(i=1;=0; /对高位的2位大写字母进行分配和收集Distribute_c(L.sl,i,fc,ec);Collect_c(L.sl,i,fc,ec);/按指针链重新整理静态链表void Arrange(SLList &L) /重新整理in
15、t p,q,i;SLNode temp;p=L.sl0.next; /p指向第一个记录的当前位置i+) /l.s11i-1已按关键字有序化while(pi)p=L.slp.next; /找到第i个记录,并用p指向其在L中当前位置q=L.slp.next; /q指向尚未调整的表尾if(p!=i)temp=L.slp; L.slp=L.sli; L.sli=temp; L.sli.next=p; /交换记录p=q; /p指向尚未调整的表尾,为找第i+1个记录做准备/ 二分查找函数int BinSearch(SLList L,KeyType key)int low,high,mid;low=1;hi
16、gh=L.length;while(low=high)mid=(low+high)/2;if(strcmp(key,L.slmid.keys)=0)return mid;else if(strcmp(key,L.slmid.keys)=1&=5) *n * 航班信息查询系统 *n * 1.航 班 号 *n * 2.起 点 站 *n * 3.终 点 站 *n * 4.起飞时间 *n * 5.到达时间 *n * 0.退出系统 *n 请选择(0-5):输入要查询的航班号(字母要大写): 无此航班信息,可能是输入错误!,L.slk.keys,L.slk.others.start,L.sl k.others.end,L.slk.others.sche,L.slk.others.time1,L.slk.others.time2,L.sl k.others.model,L.slk.others.price);输入要
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1