写给自己看的散列表(2):开放定址法

本文介绍了一种散列表实现方式——开放定址法的基本概念及其实现细节,包括散列表结构定义、散列表创建过程和元素插入操作。文章还强调了在创建散列表时初始化每个单元状态的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义
在开放定址法中,用一个数组来存储散列表的元素,因此散列表结构Htable中有一个数组(指针)CellArray,数组中的每一个元素都是一个Hcell,Hcell中除了有data外,还有一个enum类型的字段来记录该元素的“状态”,为空、被使用或者已删除。

enum entrykind {Legitimate, Empty, Deleted};

typedef struct cell
{
	eletype data;
	enum entrykind info;
}Hcell;

typedef struct table
{
	int size;
	Hcell *CellArray;
}Htable;

2.新建一个散列表
注意要将数组CellArray中的每一个元素的状态info设置为Empty。

Htable *CreateHashTable(int tsize)
{
	Htable *H;

	if (tsize < MinSize) {
		printf("Table size must >= %d\n", MinSize);
		return NULL;
	}

	H = malloc(sizeof(Htable));
	if (H == NULL) {
		printf("Create table failed\n");
		return NULL;
	}
	
	H->size = NextPrime(tsize);
	H->CellArray = malloc(sizeof(Hcell) * H->size);
	if (H->CellArray == NULL) {
		printf("Out of space\n");
		return NULL;
	}

	Hcell *pcell;
	pcell = H->CellArray;
	for (int i = 0; i < H->size; i++) {
		pcell->info = Empty;
		pcell++;
	}

	return H;
}

3.插入
用到的Find和Hash函数与写给自己看的散列表(1):分离链接法中相同,特别点在于将info设置为Legitimate,表示该存储空间被使用了。

void Insert(Htable *H, eletype key)
{
	uint pos;
	pos = Find(H, key);
	if (H->CellArray[pos].info != Legitimate) {
		H->CellArray[pos].info = Legitimate;
		//strcpy(H->CellArray[pos].data, key);
		H->CellArray[pos].data = key;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值