1. uthash简介
开源的第三方头文件,这只是一个头文件:uthash.h。
uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。
2 uthash的使用
2.1 定义结构体
2.2 添加
2.3 查找
2.4 替换
2.5 删除
2.6 循环删除
2.7 删除哈希表所有元素
2.8 计算哈希表元素个数
2.9 遍历哈希表中的所有项目
2.10 排序哈希表
2.1 定义结构体
#include "uthash.h"
struct my_struct {
int id; /* key */
char name[10];
UT_hash_handle hh; /* makes this structure hashable */
};
/*声明哈希为NULL指针*/
struct my_struct *users = NULL; /* important! initialize to NULL */
当结构体中的键值为字符串数组时
struct my_struct {
char name[10]; /* key (string is WITHIN the structure) */
int id;
UT_hash_handle hh; /* makes this structure hashable */
};
当结构体中的键值为字符串指针时
struct my_struct {
const char *name; /* key */
int id;
UT_hash_handle hh; /* makes this structure hashable */
};
2.2 添加
HASH_ADD_INT表示添加的键值为int类型
HASH_ADD_STR表示添加的键值为字符串类型
HASH_ADD_PTR表示添加的键值为指针类型
HASH_ADD表示添加的键值可以是任意类型
void add_user(int user_id, char *name) {
struct my_struct *s;
/*重复性检查,当把两个相同key值的结构体添加到哈希表中时会报错*/
HASH_FIND_INT(users, &user_id, s); /* id already in the hash? */
/*只有在哈希中不存在ID的情况下,我们才创建该项目并将其添加。否则,我们只修改已经存在的结构。*/
if (s==NULL) {
s = (struct my_struct *)malloc(sizeof *s);
s->id = user_id;
HASH_ADD_INT( users, id, s ); /* id: name of key field */
}
strcpy(s->name, name);
}
2.3 查找
struct my_struct *find_user(int user_id) {
struct my_struct *s;
s = (struct my_struct *)malloc(sizeof *s);
HASH_FIND_INT( users, &user_id, s ); /* s: output pointer */
return s;
}
2.4 替换
void replace_user(HashHead *head, HashNode *newNode) {
HashNode *oldNode = find_user(*head, newNode->id);
if (oldNode)
HASH_REPLACE_INT(*head, id, newNode, oldNode);
}
2.5 删除
要从哈希表中删除结构,必须具有指向它的指针。(如果只有键,请先执行HASH_FIND以获取结构指针)。
void delete_user(struct my_struct *user) {
HASH_DEL(users, user); /* user: pointer to deletee */
free(user); /* optional; it's up to you! */
}
2.6 循环删除
HASH_ITER是一个宏定义,程序执行时被替换为一个循环
void delete_all() {
struct my_struct *current_user, *tmp;
HASH_ITER(hh, users, current_user, tmp) {
HASH_DEL(users,current_user); /* delete; users advances to next */
free(current_user); /* optional- if you want to free */
}
}
2.7 删除哈希表所有元素
如果您只想删除所有项目,但不释放它们或进行每个元素的清理,则可以通过一次操作更有效地做到这一点:
HASH_CLEAR(hh,users);
2.8 计算哈希表元素个数
unsigned int num_users;
num_users = HASH_COUNT(users);
printf("there are %u users\n", num_users);
2.9 遍历哈希表中的所有项目
void print_users() {
struct my_struct *s;
for(s=users; s != NULL; s=s->hh.next) {
printf("user id %d: name %s\n", s->id, s->name);
}
}
2.10 排序哈希表
HASH_SORT( users, name_sort );