针对于Hash表其实就是将键值经过一系列计算(Horner运算法则,不懂得请自行百度),在规定大小(可进行再散列,这里只是做讲解)的散列表中进行存储,散列表的长度一般为素数(具体原因个人也没理解,但如果用非素数,那需要进行散列的key将集中在与之本身Mod值为0的数)。而对于进行通过Hash算法得到的值也许会有冲突,这种情况并且经常发生,所以下面讲解解决冲突的两种方法,对于哈希表本身的实现并不难,重点是解决冲突和装填因子的比例问题。
1、分离连接法: 简单点说,其实就是声明出一个链表数组,对于进行冲突的值(比如:我们假设数组长度为10,而进行Hash计算的公式为:X mod 10,所以29和39他俩都会存储在数组下标为9的位置上,这是就会有冲突,所以我们就用链表的方法来对他进行并列存储),下面是代码实现,看代码就可以理解了,这里只做思想讲解。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义存储值的类型
typedef char * ElemType;
//定义链表存储结构
typedef struct ListNode
{
ElemType data;
struct ListNode *next;
}ListNode, *Position;
typedef Position List;
//定义哈希表存储结构
typedef struct HashNode
{
int size;
List *theList;
}HashNode, *HashTable;
//获取下一个质数
int NextPrime(int size)
{
while(true)
{
if(size % 2 == 0 || size % 3 == 0)
{
size++;
}
else
{
return si