雜湊表新增
雜湊表(hash table,也叫雜湊表),是根據鍵(key)而直接訪問在記憶體儲存位置的資料結構。也就是說,它通過計算乙個關於鍵值的函式,將所需查詢的資料對映到表中乙個位置來訪問記錄,這加快了查詢速度。這個對映函式稱做雜湊函式,存放記錄的陣列稱做雜湊表。雜湊表相關定義如下:
typedef
enum
hash_result;
typedef
struct __hashentry hashentry;
struct __hashentry key;
union
value;
hashentry *next;};
struct __hashtable
;typedef
struct __hashtable hashtable;
// 向雜湊表中新增元素,其中鍵型別為char*, 元素型別為int。
hash_result hash_add_int
(hashtable * table,
const
char
* key,
int value)
;hash_result 型別為相關函式的返回型別
hashentry 為雜湊表所儲存元素(即鍵值對 《key, value》)型別
hashtable 為雜湊表,其中 bucket 指向大小為size的、元素型別為 hashentry*的指標陣列
雜湊表採用鏈位址法處理衝突
請實現 hash_add_int 函式,向雜湊表中新增元素,其中鍵型別為char
*, 元素型別為int。在新增過程中,如果要新增的鍵值key已在雜湊表中,且對應的值value也已存在,則函式返回 hash_already_added;如果要新增的鍵值key已在雜湊表中,但對應的值value不同,則函式將value值更新到雜湊表中,之後返回 hash_replaced_value;如果要新增的鍵值key不在雜湊表中,則函式建立 hashentry 型別,並將其加入到雜湊表中,且函式返回 hash_added。本題所用的雜湊函式如下:
long
hash_string
(const
char
*str)
(提交**時加上標頭檔案string.h)
hash_result hash_add_int
(hashtable* table,
const
char
* key,
int value)
// 拷貝字串函式,請自行查閱相關細節
strcpy
(p->key.str_value, key)
; p->value.int_value = value;
p->next =
null
; table->bucket[hash]
= p;
return hash_added;
}// 遍歷鍊錶
hashentry* p = table->bucket[hash]
;while
(p !=
null)}
if(p->next !=
null
) p = p->next;
// 即該非空節點是鍊錶的最後乙個節點,p->next就是要分配的位置
else
break;}
// 下同 if (table->bucket[hash] == null) {} 內
hashentry* q =
(hashentry*
)malloc
(sizeof
(hashentry));
if(q ==
null
) q->key.str_value =
null
; q->key.str_value =
(char*)
malloc
(strlen
(key));
if(q->key.str_value ==
null
)strcpy
(q->key.str_value, key)
; q->value.int_value = value;
q->next =
null
; p->next = q;
return hash_added;
}
雜湊表 雜湊表 C語言簡單實現
本文參考自 大話資料結構 通過某個函式f計算出記錄的儲存位置,而不需要通過比較,這就是一種新的儲存技術 雜湊技術。雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 在查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查...
C語言 雜湊表
線性探測法 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。雜湊函式 得到乙個數的hash值的函式,被稱為雜湊函式。1.整數 除留餘數法,對於大小為素數m的陣列,對於任意正整數k,計算k除以m的餘數。m一般取素數。define prime 11...
雜湊表(雜湊表) C 實現
雜湊函式就是 關鍵字key 到 值value 的對映 value f key value反映的是關鍵字key的儲存位址。直接定址法 f key a key b 例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。直接定址法的優點是簡單均勻,也不會產生衝突 缺點是該方法適合表比較小...