在标准C语言中,并没有哈希表这种数据结构。因此各大大佬开源了自己的实现方式。

其中比较有名的就是本文要介绍的,uthash

下面以介绍记录整形数据int为键的具体使用。

基本配置

在下载好资源后找出uthash.h该文件。然后只要在我们需要用的地方include即可。

然后非常重要一点,我们需要手动编写自己的哈希节点的数据结构。

// header
#include "uthash.h"

// hash node
struct MyHashNode {
    // 至少存在一个用来作为key的元素
    int key;
    // 可选,作为记录的元素
    int value;
    // 核心 uthash.h 规定必须这么写,作为用来实现hash的句柄

查看UT_hash_handle是怎么设计的,可以得知这个句柄内部对前后和健值做了指向。

typedef struct UT_hash_handle {
   struct UT_hash_table *tbl;
   void *prev;                       /* prev element in app order      */
   void *next;                       /* next element in app order      */
   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */
   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */
   const void *key;                  /* ptr to enclosing struct's key  */
   unsigned keylen;                  /* enclosing struct's key len     */
   unsigned hashv;                   /* result of hash-fcn(key)        */
} UT_hash_handle;

而具体的操作,是先定义一个结构体指针,并初始为NULL。在通过uthash.h内置的宏函数进行操作。

注意,增删的操作后会改变原hashtable的结构,因此需要传入原对象。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐