索引查找算法

#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(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;
	for (i = start; i < start + length; i++)
	{
		if (stu[i] == key)
			return i;
	}
	return -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("原数据\n");
	for (i = 0; i < TABLE_LEN; i++)
	{		
		printf("%ld ", stu[i]);	
		if (stu[i] == 0 && stu[i+1] != 0)
			printf("\n");
	}
	printf("输入要查找的关键字:");
	scanf("%ld", &key);
	pos = IndexSearch(key);

	if (pos > 0)
		printf("查找成功,%ld关键字位于数组的第%d个位置。\n", key, pos+1);
	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]);	
			if (stu[i] == 0 && stu[i+1] != 0)
				printf("\n");
		}
	}
	getchar();
	getchar();
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值