【C】UThash使用笔记

头文件: uthash.h

1.定义(key为int型)

struct hashTable{
	int key;
	int val;
	UT_hash_handle hh;  //必须要写上
}

2.声明

其次需要声明一个结构体指针hashtable,并初始化为空指针,它指向储存数据的hash表。

struct hashTable* hashtable= NULL;

3.查找item(key为int型)

HASH_FIND_INT(hashtable, &ikey, tmp);

第一个参数是之前定义过的指向hash表的指针hashtable;
第二个参数是要查找的键值的地址;
第三个参数返回查找结果的一个指针,在查找前定义为空即可:struct hashTable* tmp;

注: key是int,使用INT; key是字符串,使用STR; key是指针,使用PTR 。

一个例子:

struct my_struct *find_user(int ikey)
{
    struct my_struct *s;
    HASH_FIND_INT(hashtable, &ikey, s); 
    return s;
}

4.添加item(key为int型)

HASH_ADD_INT(hashtable, key, tmp);

第一个参数是之前定义过的指向hash表的指针hashtable;
第三个参数是要添加的结构的指针tmp,需要对其申请内存和赋值:

tmp = malloc(sizeof(struct hashTable));
tmp->key = ikey;
tmp->val = i;

第二个参数是tmp的key。
下面是使用了添加和查找的一个例子,在添加前,必须先确保tmp的key值不在hashtable当中。

void insert(int ikey) {//传入一个字符串
    struct hashTable* tmp;
    HASH_FIND_INT(hashtable, &ikey, tmp);//查找键值key是否已经出现在hashtable里
    if (tmp != NULL) {
        tmp->val = -1;
    } else {
        tmp = (struct hashTable*)malloc(sizeof(struct hashTable));
        tmp->key = ikey;
        tmp->val = 1;
        HASH_ADD_INT(hashtable, key, tmp);//在key字段处插入tmp
    }

5.迭代hash

可以通过hh.next指针遍历hash表中所有items

struct hashTable*s;
for(s=hashtable; s != NULL; s=s->hh.next){
    printf("user id %d: name %s\n", s->id, s->name);
}

这种for用法并不安全,因为s是临时变量,每次遍历都会改变,所以需要再定义一个临时变量用于保存s->hh.next取到的item,可以简化为下面这种方法:

struct hashTable*s, *tmp;
HASH_ITER(hh, hashtable, s, tmp) {
    printf("user id %d: name %s\n", s->id, s->name);
}

注:具体参数作用可以比对第一种for用法进行理解。

6.删除

HASH_DEL(hashtable, tmp);

第一个参数是哈希表,第二个参数是指向要删除的结构体指针。
例子:

void delete_user(struct hashTable *tmp)
{
    HASH_DEL(hashtable, tmp);  
    free(tmp);             /* 需要自己手动释放结构体tmp的内存 */
}

7.替换、排序、统计

参考: http://t.csdn.cn/XoVG2

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值