首先要感謝下面博主: mark 一下
說的很清楚,**也能直接用,只是做了一點點小改進:1,將衝突的hash值存放到了鏈尾.2.增加了remove函式,方便刪除不要的節點.此方法中,乙個key至只對應乙個value.
lookup函式:
//定義乙個查詢根據key查詢結點的方法,首先是用hash函式計算頭位址,然後根據頭位址向下乙個個去查詢結點,如果結點的key和查詢的key值相同,則匹配成功,lookup即為查詢key
install 函式:
//定義乙個插入結點的方法,首先是檢視該key值的結點是否存在,如果存在則更改value值就好,如果不存在,則插入新結點。
hashlist3.h的**如下
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define hashsize 10
typedef unsigned int uint;
//節點定義,key,value,與next指標
typedef struct nodenode;
//one key to one value
class hashtable;
hashtable::hashtable()
}//bkdr hash 演算法
uint hashtable::bkdrhash(const char* key)
return hash%hashsize;
}uint hashtable::hash(const char* key)
return hash%hashsize;
}node* hashtable::lookup(const char* key,uint &pos)
} return null;
}bool hashtable::install(const char* key,const char* value)
else
tail->next = np;
} // np->next = node[index];
// node[index] = np;
} np->value=value;
return true;
}bool hashtable::remove(const char* key)
else
pre->next = pre->next->next;
} free(np);
return true;
} return false;
}void hashtable::display()
else
printf("]\n");
} }}
測試**(hashlist3.cpp)如下
#include "hashlist3.h"
int main(int argc, char const *ar**)
; const char* value=;
for (int i = 0; i < 5; ++i)
printf("-------------------------\n");
ht->display();
printf("-------------------------\n\n");
ht->remove("u");
ht->display();
printf("-------------------------\n\n");
ht->remove("a");
ht->display();
return 0;
}
執行結果:
原文是將後加入的節點放在鍊錶的最前端,這裡將後加入的節點放置鍊錶最末端.hash演算法有更該.當然少量資料看不到區別,大量資料才有對比性.
雜湊錶鏈位址法解決衝突
問題描述 為了美麗的校園計畫,學校決定改進排隊制度,比如說給飯卡充錢等 給每個人乙個rp值,這個rp值決定這個人來了之後要排的位置,如果當前位置已經有人,那麼從這個位置以後的人後移一位,這個人插進去,如果沒有人的話就直接排到這個位置上去。現在已知按時間從前到後來的人的名字和rp值,求按排隊順序輸出排...
hash table 解決雜湊衝突(鏈位址法)
此 運算雜湊值的運算公式f x x 14 當然也可以通過別的函式運算其雜湊值,由於雜湊值會直接作為下標,因而其雜湊值盡量控制在0 15之間,如若雜湊表過長則會造成空間的浪費,一般來說資料個數 0.75 雜湊表長,比較適宜。2020.1.20 在這個特殊的日子,我決定痛改前非給你們解釋一下我的 新增了...
雜湊表鏈結位址法實現
說明 0 7相對於陣列下標,每個陣列元素下標又相當於乙個單鏈表。ifndef hash h define hash h define hashsize 10 typedef struct node node class hashtable endif hash h include pch.h inc...