1. 初始化
void HashInit(HashTable* ht, HashFunc func)
{
if(ht == NULL || func == NULL)
{
return;
}
ht -> size = 0;
ht -> func = func;
int i = 0;
for(; i < HashMaxSize; i++)
{
ht -> data[i].state = Empty;
}
}
2. 哈希表的銷燬
void HashDestroy(HashTable* ht)
{
if(ht == NULL)
{
return;
}
ht -> size = 0;
ht -> func = NULL;
size_t i = 0;
for(; i < HashMaxSize; i++)
{
ht -> data[i].state = Empty;
}
}
3. 哈希表的插入
void HashInsert(HashTable* ht, ValueType key, KeyType value)
{
if(ht == NULL)
{
return;
}
//判斷是否可以插入, 此處的負載因子規定爲 0.8
if(ht -> size >= 0.8 * HashMaxSize)
{
return;
}
int offset = ht -> func(key);
while(1)
{
//插入的基本思路就是按照插入成功, 插入失敗, 插入衝突處理
if(ht -> data[offset].state != Valid)
{
ht -> data[offset].key = key;
ht -> data[offset].value = value;
ht -> data[offset].state = Valid;
++ht -> size;
return;
}
else if(ht -> data[offset].state == Valid && ht -> data[offset].key == key)
{
//此處認爲插入的值在哈希表中已經存在, 就認爲插入失敗
return;
}
else
{
++offset;
if(offset >= HashMaxSize)
{
offset = 0;
}
}
}
}
4. 哈希表的查找
int HashFind(HashTable* ht, KeyType key, ValueType* value)
{
if(ht == NULL || value == NULL)
{
return 0;
}
if(ht -> size == 0)
{
return 0;
}
size_t offset = ht -> func(key);
while(1)
{
if(ht -> data[offset].key == key && ht ->data[offset].state == Valid)
{
*value = ht -> data[offset].value;
return 1;
}
if(ht -> data[offset].state == Empty)
{
return 0;
}
else if(ht -> data[offset].key != key)
{
offset++;
if(offset >= HashMaxSize)
{
offset = 0;
}
}
}
return 0;
}
5. 哈希表的刪除
void HashRemove(HashTable* ht, KeyType key)
{
if(ht == NULL)
{
return;
}
if(ht -> size == 0)
{
return;
}
size_t offset = ht -> func(key);
while(1)
{
if(ht -> data[offset].key == key && ht -> data[offset].state == Valid)
{
//找到了要刪除的元素
ht -> data[offset].state = Deleted;
return;
}
else if(ht -> data[offset].state == Empty)
{
return;//說明沒有找到要刪除的元素
}
else
{
offset++;
if(offset >= HashMaxSize)
{
offset = 0;
}
}
}
}