uthash.h
#include <stdio.h>
#include "uthash.h"
struct my_struct {
int key;
char value[10];
UT_hash_handle hh;
};
/*定义一个hash结构的空指针,用于指向保存数据的hash表,必须初始化为空,在后面的查、插操作中,uthash内部会根据其是否为空而进行不同的操作*/
struct my_struct* g_users = NULL;
/*查找:先定义一个hash结构体指针变量,然后通过HASH_FIND_INT接口找到该key对应的hash结构体*/
struct my_struct* find_users(int ikey) {
struct my_struct* s;
HASH_FIND_INT(g_users, &ikey, s);
return s;
}
/*插入:由于uthash要求键必须一致,而uthash内部未对key值的唯一性进行很好地处理,因此他要求外部在插入操作时要确保其key值不在当前的hash表中,这就需要在插入操作时,先查找hash表看其值是否已经存在,不存在时再进行插入操作,在这里需要注意:
1、插入时先查找,当键不在当前的hash表中时再进行插入,以确保键的唯一性
2、需要调用插入接口函数时需要明确告诉接口函数,自己定义的键变量的名字是什么
*/
void add_user(int ikey, char *value_buf) {
struct my_struct* s;
HASH_FIND_INT(g_users, &ikey, s); // 查看key值是否已经在hash表g_users中了
if (s == NULL) {
s = (struct my_struct*)malloc(sizeof(struct my_struct));
s->ikey = ikey;
HASH_FIND_INT(g_users, &ikey, s); // 告诉插入函数我们定义的hash结构体中键变量的名字
}
strcpy(s->value, value_buf);
}
/*删除:删除操作的接口函数为HASH_DEL,只需要告诉接口要释放哪个hash表(这里是g_users)里的哪个节点(这里是s),需要注意:释放申请的hash结构体变量,uthash函数只将结构体从hash表中移除,并未释放该结构体所占据的内存*/
void delete_user(int ikey) {
struct my_struct* s = NULL;
HASH_FIND_INT(g_users, &ikey, s);
if (s == NULL){
HASH_DEL(g_users, s);
free(s);
}
}
/*清空hash表:*/
void delete_all() {
struct my_struct *current_user, *tmp;
HASH_ITER(hh, g_users, current_user, tmp) {
HASH_DEL(g_users, current_user);
free(current_user);
}
}