這是乙個簡單的雜湊表的實現,用c
語言做的。
先說一下原理。
先是有乙個bucket
陣列,也就是所謂的桶。
雜湊表的特點就是資料
與其在表中的位置存在相關性
,也就是有關係的,通過資料應該可以計算出其位置。
這個雜湊表是用於儲存一些鍵值對(key -- value
)關係的資料,其key
也就是其在表中的索引,value
是附帶的資料。
通過雜湊演算法,將字串的key
對映到某個桶中,這個演算法是確定的,也就是說乙個key
必然對應乙個bucket
。
然後是碰撞問題,也就是說多個key
對應乙個索引值。舉個例子:有三個key
:key1
,key3
,key5
通過雜湊演算法keytoindex
得到的索引值都為2
,也就是這三個key
產生了碰撞,對於碰撞的處理,採取的是用鍊錶連線起來,而沒有進行再雜湊。
這是包含的標頭檔案
#include #include #include #define bucketcount 16
1struct
hashentry2;
78 typedef struct
hashentry entry;910
struct
hashtable11;
1415 typedef struct hashtable table;
1//初始化雜湊表
2void inithashtable(table*t)312
}1314//
釋放雜湊表
15void freehashtable(table*t)
1629
}30 }
1這是比較多餘的做法,因為c標準庫中//雜湊雜湊方法函式
2int keytoindex(const
char*key)
312 index >>= 27
;13 index &= (bucketcount - 1
);14
return
index;
15 }
string.h
中有一系列這樣的函式。
1//在堆上分配足以儲存str的記憶體2//
並拷貝str內容到新分配位置
3char* strdup(const
char*str)415
return
ret;
16 }
string.h
中的相關函式
#include這個了插入和修改是乙個方法,如果char *strdup(const
char *s);
char *strndup(const
char *s, size_t n);
char *strdupa(const
char *s);
char *strndupa(const
char *s, size_t n);
key
在雜湊表中已經存在,那麼就是修改value
,否則就是插入乙個節點。
1因為這個雜湊表中儲存的是//向雜湊表中插入資料
2int insertentry(table* t , const
char* key , const
char*value)310
11 index =keytoindex(key);
12if (t->bucket[index].key ==null)
16else
27 memcpy(e->value , value , vlen1 + 1
);28
return index; //
插入完成了29}
30 ep =e;
31 e = e->next;
32 } //
end while(e...
3334
//沒有在當前桶中找到
35//
建立條目加入
36 e = (entry*)malloc(sizeof
(entry));
37 e->key =strdup(key);
38 e->value =strdup(value);
39 e->next =null;
40 ep->next =e;41}
42return
index;
43 }
鍵值對
,所以這個方法是從雜湊表中查詢key
對應的value
的。要注意,這裡返回的是value
的位址,不應該對其指向的資料進行修改,否則可能會有意外發生。
1這個函式用於將雜湊表中//在雜湊表中查詢key對應的value2//
找到了返回value的位址,沒找到返回null
3const
char* findvaluebykey(const table* t , const
char*key)
410 index =keytoindex(key);
11 e = &(t->bucket[index]);
12if (e->key == null) return null;//
這個桶還沒有元素
13while (e !=null)
17 e = e->next;18}
19return
null;
20 }
key
對應的節點移除,如果其不存在,那就返回null
。如果存在,就返回這個節點的位址。注意,這裡並沒有釋放節點,如果不需要了,應該手動釋放它。
1這個函式用於列印雜湊表的內容的。//在雜湊表中查詢key對應的entry2//
找到了返回entry,並將其從雜湊表中移除3//
沒找到返回null
4 entry* removeentry(table* t , char*key)
511 index =keytoindex(key);
12 e = &(t->bucket[index]);
13while (e !=null)
26else 32}
33else
43return
ep;44 }//
end if(strcmp...
45 e = e->next;46}
47return
null;
48 }
1用於測試的資料來自於本機相關資訊。void printtable(table*t)214
}15 }
intmain()
printtable(&t);
const
char* keys = ;
for (int i = 0; i < 4; ++i)
else
}freehashtable(&t);
getchar();
return0;
}
雜湊表 雜湊表 C語言簡單實現
本文參考自 大話資料結構 通過某個函式f計算出記錄的儲存位置,而不需要通過比較,這就是一種新的儲存技術 雜湊技術。雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 在查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查...
C語言雜湊表的實現
寫這個hashmap的最初目的是在微控制器上使用,後來就著學習的態度自己就把他完善了一下,hashmap的大小 key的最大長度 value的最大長度都是在標頭檔案中通過巨集定義配置。完整 使用到了 完整 created by ankun on 2019 12 3.ifndef myhashmap ...
簡單雜湊表實現
雜湊表定義 雜湊表又稱雜湊表,是根據關鍵碼值 key value 而直接訪問的資料結構。它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式 存放記錄的陣列 叫做雜湊表。雜湊表既有陣列的特點 定址容易 又有鍊錶的特點 方便插入,刪除 雜湊表結構示意圖 下面編寫乙個...