上一章,簡單介紹了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://blog.csdn.net/u013184273/article/details/103766521),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);
}
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。