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