索引查找

#include <stdio.h>  
#define INDEXTABLE_LEN 3
#define TABLE_LEN 30
typedef struct item
{
    int index;    //索引值 
    int start;    //开始位置 
    int length;   //子表长度 
}INDEXITEM;
//定义主表数据 
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};
//定义索引表 
	INDEXITEM indextable[INDEXTABLE_LEN]={
		{10801,0,6},
		{10802,10,4},
    {10803,20,4}};
		int IndexSearch(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 InsertNode(long 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;//索引表中查找失败     
			stu[start+length]=key;//保存关键字到主表 
			indextable[i].length++;//修改索引表中的子表长度
            return 0;    
		}
	    	int main()
		{
			long key;
			int i,pos;
			printf("原数据:"); 
			for(i=0;i<TABLE_LEN;i++)
				printf("%ld ",stu[i]);
			printf("\n");
			printf("输入查找关键字:");
			scanf("%ld",&key);
			pos=IndexSearch(key);
			if(pos>0)
				printf("查找成功,该关键字位于数组的第%d个位置。\n",pos);
			else
				printf("查找失败!\n");
			printf("输入插入关键字:");
			scanf("%ld",&key);
			if(InsertNode(key)==-1)
				printf("插入数据失败!\n");
			else
			{
				for(i=0;i<TABLE_LEN;i++)
					printf("%ld ",stu[i]);
				printf("\n");
			}    
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值