散列是一种以常数平均时间执行插入、删除和查找的技术。但是,那些需要元素间任何排序信息的操作将不会得到有效的支持。
理想的散列表是一个具有固定大小的数组。把表的大小记作TableSize,通常的习惯是让表从0到TableSize - 1变化。每个关键字被映射到从0到TableSize - 1这个范围中的某个数,并且被放到适当的单元中。这个映射就叫做散列函数(hash function)。理想情况下它应该运算简单并且应该保证任何两个不同的关键字映射到不同的单元。但这是不可能的,因为单元的数目有限,而关键字是无穷的。
两个不同的关键字散列到同一个值的时候,我们称之为冲突(collision),假设散列函数为Hash(X) = X mod 10,那么当关键字为10、20、30时都会被映射到 0 这个单元,这样就产生了冲突。
处理冲突的方法主要有“分离链接法”和“开放地址法”。这里主要说明“分离链接法”。(注:Hash Table可以翻译为散列表,也可以音译为哈希表)
〇、结构体定义
struct ListNode //链表的节点定义
{
int element;
struct ListNode *next;
};
struct HashTbl //哈希表定义
{
int tablesize; //哈希表的大小
struct ListNode **thelists; //thelists为指向链表节点ListNode的指针的指针
};
其中难点在于struct ListNode **theli