生活随笔
收集整理的這篇文章主要介紹了
哈希表1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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;}}}
}
總結
以上是生活随笔為你收集整理的哈希表1的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。