[译]C语言实现一个简易的Hash table(2)
上一章,简单介绍了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/dd3...),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函数
相关推荐
表格的现在还是较为常用的一种标签,但不是用来布局,常见处理、显示表格式数据。在HTML网页中,要想创建表格,就需要使用表格相关的标签。<table> <tr> <td>单元格内的文字</td> ...