[譯]C語言實現一個簡易的Hash table(2)
阿新 • • 發佈:2019-01-10
上一章,簡單介紹了Hash Table
,並提出了本教程中要實現的幾個Hash Table
的方法,有search(a, k)
、insert(a, k, v)
和delete(a, k)
,本章將介紹Hash table
使用的資料結構。
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/dd317913e6fe),calloc
會申請一片空間並用NULL
來填充,記錄為NULL
就代表空的。
// 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表
並試著銷燬它,儘管現在並沒有做太多東西。
// main.c
#include hash_table.h
int main() {
ht_hash_table* ht = ht_new();
ht_del_hash_table(ht);
}
上一章:hash表介紹
下一章:hash函式
原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/02-hash-table