我们在这篇博客 哈希表初探
已经初步了解了哈希表的作用,那么接下来就应该自己实现一下哈希表了.
同样的,实现两种不同的解决哈希冲突的方案1,闭散列 2,哈希桶
闭散列
头文件
#pragma once
#include<stdio.h>
//这个结构体表示哈希表中的一个元素
//这个元素中同时包含了键值对
typedef int KeyType;
typedef char ValType;
typedef enum State
{
Empty, //空状态
Vaild,//有效状态
Deleted,//服务于remove
}State;
struct HashTable;
typedef size_t (*HashFunc)(KeyType key,struct HashTable* );
typedef struct HashElem{
KeyType key;
ValType val;
//每个hashtable内元素的状态``
State state;
}HashElem;
typedef struct HashTable{
HashElem* data;
size_t size;
size_t capacity;
// 填装因子
float Load_Factor;
//哈希函数
HashFunc func;
}HashTable;
void HashInit(HashTable* ht,HashFunc hash_func);
void HashDestory(HashTable* ht);
void HashInsert(HashTable* ht,HashElem elem);
ValType HashFind(HashTable* ht, KeyType key);
size_t hash_func( KeyType key,HashTable*ht);
void HashRemove(HashTable* ht, KeyType key);
void HashPrint(HashTable* ht);
各个函数的实现
void HashInit(HashTable* ht,HashFunc hash_func);
初始化哈希表的工作很简单,分配存储哈希元素的数组,然后初始化 哈希表内各个成员的初始值,
值得注意的是我们在申请哈希表空间之后,数组内的元素是随机值,我们要标识该元素是否有效,那么得把数组内每个元素的状态都至为Empty,(简单的把元素都至为0是不行的,万一要插入的key是0,那么会出现此位置已经被占用的错误)
size_t GetHashTableCapacity(HashTable* ht)
{
if(ht == NULL)
return -1;
return ht->capacity;
}
size_t hash_func( KeyType key,HashTable*ht)
{
return key % GetHashTableCapacity(ht);
}
void HashInit(HashTable* ht,HashFunc hash_func)
{
if(ht == NULL || hash_func == NULL)