/******************************************** * 创建索引表的基本思路是: * 将一个线性表(主表)根据一定的函数关系或条件划分为若干子表 * 然后为每个字表创建一个索引项 * 将这些索引项组合在一起构成一个可以索引主表的索引表 * * 索引表中每个索引项一般包括3部分内容: * 索引值(更具索引值可以找到对应的子表) * 子表的开始位置(字表第一个位置保存的位置) * 子表长度(保存子表的数量,避免查找越界) * **********************************************/ #include<stdio.h> #include<stdlib.h> //索引表长度 #define INDEXTABLE_LEN 3 //主表长度(或者说大小) #define TABLE_LEN 30 //定义索引项 typedef item{ int index; int start; int length; }INDEXITEM; //定义索引表,索引表中可以包含100个记录 INDEXITEM indextable[INDEXTABLE_LEN]={ {10801,0,6}, {10802,10,4}, {10803,20,4} } //定义主表数据 long stu[TABLE_LEN]={ 1080101,1080102,1080103,1080104,1080105,1080106,0,0,0,0, 1080201,1080202,1080203,1080204,0,0,0,0,0,0, 1080301,1080302,1080303,1080304,0,0,0,0,0,0 }; /************************************************************* * 索引查找算法: * 先在索引表中查找关键字,再根据索引表中的索引项去主表中查找最终数据 * (1) 根据关键字key,按照定义的函数计算索引值index1, 在索引表中查找等于index1的索引项,确定对于字表在主表的开始位置和长度 * (2) 更具字表的开始位置,从此处开始顺序查找关键字key * *********************************************************/ int Index_Search(int key){ int i,index1,start,length; index1=key/100; for(i=0;i<INDEXTABLE_LEN;i++) //在索引表中查找索引值 { if(indextable[i].index==index1) //找到索引值 { start=indextable[i].start; //获取数组开始序号 length=indextable[i].length; //获取元素长度 break; //跳出循环 } } if(i>=INDEXTABLE_LEN) return -1;//索引表中查找失败 for(i=start;i<start+length;i++) { if(stu[i]==key) //找到关键字 return i; //返回序号 } return -1; //查找失败,返回-1 } /***************************************************** * 插入删除操作其实设计的操作很简单,只需要改变主表长度以及插入元素对应所在子表的长度 * ***************************************************/ int Insert(int key) { index1=key/100; for(i=0;i<INDEXTABLE_LEN;i++) //在索引表中查找索引值 { if(indextable[i].index==index1) //找到索引值 { start=indextable[i].start; //获取数组开始序号 length=indextable[i].length; //获取元素长度 break; //跳出循环 } } if(i>=INDEXTABLE_LEN) return -1;//索引表中查找失败 stu[start+length]=key;//保存关键字到主表 indextable[i].length++;//修改索引表中的子表长度 return 0; }
索引表查找-c语言
猜你喜欢
转载自blog.csdn.net/vfi7018/article/details/80667847
今日推荐
周排行