数据结构---哈希表的C语言实现(闭散列)

原文地址:https://blog.csdn.net/weixin_40331034/article/details/79461705

构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。
说到哈希表,,首先就得说到哈希函数,哈希函数是用来得到给定key值的在哈希表中的存储位置的。
哈希函数也并不是固定的,可以自己根据情况来定,一般常用常见的有直接定制法,除留余数法,平方取中法,折叠法,随机数法,数学分析法。
当向该结构插入元素时,存入根据关键码以此函数计算出的位置,当搜索时,也是先要将给定的关键码用函数转换成存储位置进行查找,将得到位置处的元素进行比较,若关键码相同,则搜索成功。
但是通过一个哈希函数得到的位置,一定是会有冲突的,
例如用除留余数法,哈希函数为key/100。在此情况下数字1与数字101得到的存储位置就是相同的,这样就是哈希冲突, 哈希冲突一般有两种解决方式,一种是闭散列,另一种是开散列。
闭散列(开放地址法):当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中还有空位,那就可以把key值存放到了列表的下一个空位。
开散列(链地址法):首先对关键码集合用哈希函数计算哈希表中的偏移位置,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。

以下是闭散列实现的哈希表:
    闭散列就是用哈希函数将每个值的所对应的下标算出,将每一个元素放入哈希表对应的下标元素中,若出现冲突则将当前的值放入算出的位置的下一个空位中。
    例如下图中,假设使用的哈希函数是用除留余数法,用需要插入的数组为arr={1,2,101,102,6},哈希表的最大长度为100,则1对应的下标就为1,2的下标就是2,这时出现了101,101的位置算出来也是1,这样它就与1发生了哈希冲突,101就需要继续向后寻找空位,找到下标为3的地方,只要插入的元素数量没有超过哈希表的负载,就能一直往哈希表中插入元素,如果当找到最后一个元素还没有找到空位,则需要将其下标设置为1,再继续进行寻找知道找到第一个空位。

基于C语言实现哈希表(开散列)

原文地址:https://www.cnblogs.com/jiangxiaobo/p/11227892.html