C查表索引

/********************************************

  • 创建索引表的基本思路是:
  • 将一个线性表(主表)根据一定的函数关系或条件划分为若干子表
  • 然后为每个字表创建一个索引项
  • 将这些索引项组合在一起构成一个可以索引主表的索引表
  • 索引表中每个索引项一般包括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;
    }

猜你喜欢

转载自blog.csdn.net/qq_42599184/article/details/89094382