簡單的雜湊表實現 C語言

2022-03-22 21:53:05 字數 4097 閱讀 6042

這是乙個簡單的雜湊表的實現,用c語言做的。

先說一下原理。

先是有乙個bucket陣列,也就是所謂的桶。

雜湊表的特點就是資料與其在表中的位置存在相關性,也就是有關係的,通過資料應該可以計算出其位置。

這個雜湊表是用於儲存一些鍵值對(key -- value)關係的資料,其key也就是其在表中的索引,value是附帶的資料。

通過雜湊演算法,將字串的key對映到某個桶中,這個演算法是確定的,也就是說乙個key必然對應乙個bucket

然後是碰撞問題,也就是說多個key對應乙個索引值。舉個例子:有三個key:key1,key3,key5通過雜湊演算法keytoindex得到的索引值都為2,也就是這三個key產生了碰撞,對於碰撞的處理,採取的是用鍊錶連線起來,而沒有進行再雜湊。

這是包含的標頭檔案

#include #include #include #define bucketcount 16

1

struct

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

//雜湊雜湊方法函式

2int keytoindex(const

char*key)

312 index >>= 27

;13 index &= (bucketcount - 1

);14

return

index;

15 }

這是比較多餘的做法,因為c標準庫中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 }

用於測試的資料來自於本機相關資訊。

int

main()

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 而直接訪問的資料結構。它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式 存放記錄的陣列 叫做雜湊表。雜湊表既有陣列的特點 定址容易 又有鍊錶的特點 方便插入,刪除 雜湊表結構示意圖 下面編寫乙個...