C語言實現一個簡易的Hash table(二)

上一章,簡單介紹了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)申請內存,然後將kv保存在這個內存中。爲了讓該函數只能在我們的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_itemht_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);
}


著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章