上一章,簡單介紹了Hash Table
,並提出了本教程中要實現的幾個Hash Table
的方法,有search(a, k)
、insert(a, k, v)
和delete(a, k)
,本章將介紹Hash table
使用的數據結構。segmentfault
Hash table
數據結構hash表中存儲的每一項key-value
的數據結構:數組
// hash_table.h typedef struct { char* key; char* value; } ht_item;
咱們的hash表中保存着一個指向每一項的指針數組,裏面還包括hash表的大小,結構以下:數據結構
// hash_table.h typedef struct { int size; int count; ht_item** items; } ht_hash_table;
在hash表
中,咱們須要定義一個函數來初始化一條記錄(ht_item
),這個函數會爲每一條記錄(ht_item
)申請內存,而後將k
和v
保存在這個內存中。爲了讓該函數只能在咱們的hash table
中使用,咱們用static
來修飾。函數
// hash_table.c #include <stdlib.h> #include <string.h> #include "hash_table.h" static ht_item* ht_new_item(const char* k, const char* v) { ht_item* i = malloc(sizeof(ht_item)); i->key = strdup(k); // 複製操做 i->value = strdup(v); return i; }
ht_new
初始化一個新的hash表
,size
表示這個hash表
能夠存儲多少條記錄,如今是固定的53條。咱們將在後面講解如何擴充這個hash表
,咱們使用calloc
函數來初始化一條記錄(若是對calloc
不熟悉,能夠看看我這篇文章:https://www.jianshu.com/p/dd3...),calloc
會申請一片空間並用NULL
來填充,記錄爲NULL
就表明空的。spa
// hash_table.c ht_hash_table* ht_new() { ht_hash_table* ht = malloc(sizeof(ht_hash_table)); ht->size = 53; ht->count = 0; ht->items = calloc((size_t)ht->size, sizeof(ht_item*)); return ht; }
咱們還須要額外的函數來刪除ht_item
和ht_hash_table
,這個函數會釋放(free
)咱們以前申請的內存空間,以致於不會形成內存泄漏:指針
// hash_table.c static void ht_del_item(ht_item* i) { free(i->key); free(I->value); free(i); } void ht_delete_hash_table(ht_hash_table* ht) { for (int i = 0; i < ht->size; ++i) { ht_item* item = ht_items[I]; if (item != NULL) { ht_del_item(item); } } free(ht->items); free(ht); }
如今,咱們已經完成定義一個hash表
,如今咱們能夠試着建立一個hash表
並試着銷燬它,儘管如今並無作太多東西。code
// main.c #include hash_table.h int main() { ht_hash_table* ht = ht_new(); ht_del_hash_table(ht); }