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