解决哈希表地址冲突的一个方法是分离链接法,又称链地址法,是将所有关键字为同义词的记录存储在同一线性链表中。对于创建哈希表H,假设通过哈希函数产生的关键字在区间[0,m-1]上,则建立一个返回值为链表类型的数组H->TheLists[m],数组每个元素的初始状态都为都为空(或只包含哑元结点),凡哈希地址为i的记录都插入到头指针为H->TheLists[i] (i从0到m-1)的线性链表中,关键字插入到对应链表的位置时保证同义词在同一线性链表中按关键字有序。
例如:已知一组关键字为19,14,23,01,68,20,84,27,55,11,10,79,则按哈希函数H(key)=key MOD 13 ,通过链地址法处理冲突构造哈希表如下图所示
在算法实现过程中,声明一个哈希表结构体,内部嵌套链表结构体
struct ListNode//链表的结构体
{
ElementType Element;
position Next;
};
typedef position List;
struct HashTb
{
int TableSize;//哈希表的大小,即哈希表中链表的个数
List *TheLists;//链表指针数组,数组的每个元素为一个链表指针
};
下面是具体的代码实现:(这里的程序对哈希表中的每个链表都使用了头节点,而且对插入时还保持每个链表有序,这两点在实际应用中是不可取的,因此还需对程序进行优化)
hashtable.h
#define MINTBSIZE 2
#define TBSIZE 13
#ifndef _Hashtable_H
typedef int ElementType;
typedef unsigned int index;
struct ListNode;
typedef struct ListNode *position;
struct HashTb;
typedef struct HashTb *Has