C语言哈希表uthash的使用方法详解

C语言哈希表uthash的使用方法详解,第1张

C语言哈希表uthash的使用方法详解 uthash简介

由于C语言本身不存在哈希,但是当需要使用哈希表的时候自己构建哈希会异常复杂。因此,我们可以调用开源的第三方头文件,这只是一个头文件:uthash.h。我们需要做的就是将头文件复制到您的项目中,然后:

#include "uthash.h"

由于uthash仅是头文件,因此没有可链接的库代码。

使用uthash添加,查找和删除通常是常数时间的 *** 作,此哈希的目标是简约高效。它大约有1000行C。它会自动内联,因为它是作为宏实现的。 uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。

uthash的使用

这里我们将id作为一个索引值,也就是键值,将name作为value。

#include "uthash.h"
struct my_struct {
    int id;                    
    char name[10];
    UT_hash_handle hh;         
};

struct my_struct *users = NULL;    

注意:一定要包含UT_hash_handle hh;hh不需要初始化。它可以命名为任何名称,但是我们一般都命名为hh。

添加

HASH_ADD_INT表示添加的键值为int类型 HASH_ADD_STR表示添加的键值为字符串类型 HASH_ADD_PTR表示添加的键值为指针类型 HASH_ADD表示添加的键值可以是任意类型

void add_user(int user_id, char *name) {
    struct my_struct *s;
    
    HASH_FIND_INT(users, &user_id, s);  
    
    if (s==NULL) {
      s = (struct my_struct *)malloc(sizeof *s);
      s->id = user_id;
      HASH_ADD_INT( users, id, s );  
    }
    strcpy(s->name, name);
}

HASH_ADD_INT函数中,第一个参数users是哈希表,第二个参数id是键字段的名称。最后一个参数s是指向要添加的结构的指针。

查找
struct my_struct *find_user(int user_id) {
    struct my_struct *s;
    HASH_FIND_INT( users, &user_id, s );  
    return s;
}

在上述代码中,第一个参数users是哈希表,第二个参数是user_id的地址(一定要传递地址)。最后s是输出变量。当可以在哈希表中找到相应键值时,s返回给定键的结构,当找不到时s返回NULL。

替换

HASH_REPLACE宏等效于HASH_ADD宏,HASH_REPLACE会尝试查找和删除项目外。如果找到并删除了一个项目,它还将返回该项目的指针作为输出参数。

void replace_user(HashHead *head, HashNode *newNode) {
    HashNode *oldNode = find_user(*head, newNode->id);
    if (oldNode)
        HASH_REPLACE_INT(*head, id, newNode, oldNode);
}
删除

要从哈希表中删除结构,必须具有指向它的指针。(如果只有键,请先执行HASH_FIND以获取结构指针)。

void delete_user(struct my_struct *user) {
    HASH_DEL(users, user);  
    free(user);             
}

同样,这里users是哈希表,user是指向我们要从哈希中删除的结构的指针。

删除结构只是将其从哈希表中删除,并非free 。何时释放结构的选择完全取决于自己;uthash永远不会释放您的结构

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4751999.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-08
下一篇2022-11-09

发表评论

登录后才能评论

评论列表(0条)

    保存