昨天写了哈希的开放定址法的博客,今天我们要说的是拉链法,还有一个名字叫哈希桶。哈希桶要做的就是,之前我们用的开放定址法,通过将数据映射到数组中来实现哈希。这里每个数组的位置只能存放一个数据,如果冲突的话会继续往下找找到空的位置然后放进去,但是其实大家都能感觉出来上一个代码很简单,也很扯,感觉实现起来完全不行,不要说海量数据了, 有点数据感觉就不行了,虽然可以扩容但是也是一件很复杂的事情。这里我们要实现的是将以前的数组变成一个指针数组,这里每个数据存放的都是一个指针,这样发生冲突的话,就不必要再去找下一个位置,每发生一次冲突就在当前位置的最后一个数据后边挂上另一个数据。
typedef int KeyType;
typedef int ValueType;
typedef struct HashNode
{
KeyType _key;
ValueType _value;
struct HashNode* _next;
}HashNode;
typedef struct HashTable
{
HashNode** _tables;
size_t _size;
size_t _N;
}HashTable;
size_t HashFunc(KeyType key, size_t N)
{
return key%N;
}
也就是说每个位置放得都是一个结构体,结构体放着两个数据,一个是存放的数据,一个是next指针。用来寻找下一个元素。
HashNode** _tables;这里创建的是一个指针数组,也就是创建了一个数组,数组中的所有位置的元素都是一个指针。
HashNode* BuyHashNode(KeyType key, ValueType value)
{
HashNode *NewNode = NULL;
NewNode = (HashNode*)malloc(sizeof(HashNode));