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.8if(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;}}}
}