散列表的冲突处理 – 分离链接法

分离链接法处理散列冲突是通过将同一散列地址的元素形成链表。存储结构类似桶排序,数组中每个单元格是链表头结点。查找、插入和删除操作在找到散列地址后需遍历链表。插入时若元素不存在则新建节点加入链表,删除操作直接按链表方式处理。完整代码可在GitHub查看。

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

分离链接法是不同于前面两种线性探测和平方探测,线性探测和平方探测是,遇到冲突就往“下一个”散列地址寻找空位,这样散列表中的没空位后就不能插入元素了,但是分离链接法不同,它把在同一散列地址上的元素链接在一起,也就是把冲突元素用一个链表链接起来,这样发生每次计算出来的散列地址就一定是该元素在散列表中的散列地址,只不过在找到散列地址后,还要遍历一遍这个地址里的链表来查找要找到那个元素。这样看来,分离链接法的存储结构和桶排序的桶存储结构是一样的,也是一个一维数组里面存放每一个链表的头结点。分离链接法的好处在于,发生冲突后不用去重新计算新的散列地址,而是直接在初始散列地址中插入到链表里即可。

来看看分离链接法的散列表存储结构:

#define MaxTableSize 20 /*散列表的最大长度*/
#define KeyLength 20 /*定义关键词字符串的最大长度*/
//typedef char ElemType[KeyLength+1]; /*关键词类型用字符串形式*/
typedef int Index; /*散列地址的类型*/

/*单链表的存储结构*/
typedef struct ListNode *PtrlNode;
struct ListNode {
	char Data[KeyLength+1]; /*链表中的数据结点*/
	PtrlNode Next; /*指向下一个结点的指针*/
};
typedef PtrlNode Position; /*散列地址类型*/
typedef PtrlNode List; /*链表*/ 

/*散列表的存储结构*/
 typedef struct TableNode *HashTable; /*散列表的类型*/
 struct TableNode {
 	int TableSize; /*散列表的最大长度*/
 	List Hea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值