索引表查找-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/vfi7018/article/details/80667847