else low=mid+1; }欧阳学文创作
欧阳学文创作
return 0; }
main()/*主函数*/ {Sstable ST; inti,pos,x,key; pos=0; while(1)
{ printf(\"\\n 1Sxserach\\n\"); printf(\" 2Binserach\\n\"); printf(\" 3Exit\\n\");
printf(\"please input choose(13):\"); scanf(\"%d\ switch(x) { case 1:
printf(\"please input table length n:\");/*请求输入顺序表表长*/
scanf(\"%d\
printf(\"please input n data:\\n\");/*请求输入n个关键字值*/ for(i=1;i<=ST.length;i++) scanf(\"%d\
printf(\"please input key:\");/*请求输入待查找的记录关键字值*/
scanf(\"%d\
pos=sxsearch(ST,key); /*调用顺序查找函数*/ break; case 2:
printf(\"please input table length n:\");/*请求输入顺序表表长*/
scanf(\"%d\
printf(\"please input n data(sort):\\n\");/*请求输入n个关键字值(必须升序排列)*/ for(i=1;i<=ST.length;i++)
欧阳学文创作
欧阳学文创作
scanf(\"%d\
printf(\"please input key:\");/*请求输入待查找的记录关键字值*/
scanf(\"%d\
pos=binsearch(ST,key);/*调用二分法查找函数*/ break;
case 3: return;
default: printf(\"choose error\\n\"); }
if(pos==0)
printf(\"\\nthe data is not found.\\n\"); /*若找不到,提示信息*/ else
printf(\"\\nthe data is at position %d\\n\若找到,输出位置*/ }
4.运行结果参考如图61所示 图61 验证性实验运行结果
欧阳学文创作
欧阳学文创作
七、设计性实验 1.实验要求
编程实现如下功能: (1)建立索引查找表
(2)利用索引查找确定给定记录在索引查找表中的块号和在块中的位置。 2.核心算法分析
索引查找表有索引表和块表两部分所构成,其中索引表存储的是各块记录中的最大关键字值和各块的起始存储地址,用顺序存储结构,各块的起始存储地址的初始值置为空指针;而块表中存储的是查找表中的所有记录并且按块有序,用链式存储或顺序存储结构,在此用链式存储结构。则索引查找表的存储结构图如62所示:
欧阳学文创作
欧阳学文创作
ST ST. Length 3 ST. r
r[0] r[1] r[2] r[3]
12 23 47 …… 最大关键字块链头指针
3 15 31 6 23 45 12 14 37 9 21 47 ^ 4 ^ 13 ^ 图62 索引查找表的存储结构示意图
将如图62所示的存储结构描述为: #define MAXSIZE 100
typedefintkeytype;
typedefstructbnode /*块链中的结点类型*/ { keytype key; /*存储块中记录的关键字值*/
structbnode *next; /*指向块链中下一记录结点的指针*/ } Bnode;
typedefstructsnode /*索引表中元素的类型*/
{ keytypeMaxkey; /*存储各块记录中的最大关键字值*/ Bnode *head; /*块链的头指针*/ }Snode;
typedefstruct /*索引查找表的结构类型*/
欧阳学文创作
欧阳学文创作
{ Snode r[MAXSIZE]; /*索引顺序表*/
int length; /*索引顺序表中存储数据的个数*/ }Stable;
由于在索引查找表中,索引表是按关键字从小到大排列的有序顺序表,块链是一个无序链表,所有索引表的查找过程可归纳为:
(1)在索引表中用二分查找确定待查找的记录所在的块号;
(2)沿着块链指针用顺序查找的方法确定待查找的记录在块链中的存储位置。
如果查找成功,则输出待查找记录在索引表中的块号和在块链中的存储地址;如果查找失败,则输出“没有找到”的信息。
3.核心算法描述
intfindblock(Stable ST, keytype key)
/*用二分查找法在索引查找表ST的索引表中确定关键字值为key的待查找记录所在的块号,函数并返回值其块号值*/
{ intlow,high,mid;
low=1;high=ST.length; while(low<=high)
{ mid=(low+high)/2;
if (keylow=mid+1; }return high+1; }
Blink findrec(Stable ST,keytype key)
/*用顺序查找法在索引查找表的块链中确定关键字值为key的待查找记录的存储位置,如查找成功则函数返回其
欧阳学文创作
欧阳学文创作
地址值,否则返回空指针*/ { Blink p; intBno;
Bno=findblock(ST,key); /*调用函数,确定待查记录所在块号*/
p=ST.r[Bno].head; /*取到待查记录所在块链的头指针*/ while (p&&p>key!=key) /*顺着链指针依次查找*/ p=p>next;
return p; /*返回查找结果*/ }
欧阳学文创作