本文主要是对优秀博文的总结。

C语言本身是不附带uthash.h头文件的,因为C语言本身就不附带哈希表,很多同学应该都是通过自己创建的,过程会有点复杂,今天就来讲解一下uthash的使用吧,我是新手,如果有错误的地方,还请您慷慨指出来,谢谢。

好,现在开始就以我知道的给大家讲解。

主要的讲解内容就是:增加,删除,查找,遍历,计算哈希元素个数,哈希元素排序

对了有些同学一定迫不及待的想要头文件了吧,那就提供给大家下载。

链接:https://pan.baidu.com/s/1_oXkPWvUpUv-oySzA6JMhA  提取码:un1z

为了照顾一些小白的同学,这里说一下怎么把下载下来的哈希库头文件放到C语言库中,其实很简单。

第一步:复制刚刚下载的头文件,全选复制

第二步:找到C语言软件(我的是vs2010)所存储的位置,找到VC文件里include文件,最后打开include文件,讲刚刚第一步复制的头文件粘贴进去即可

 好了,正式进入主题。

①哈希表结构体

· key为键

·name是键key对应的值,表示的是键当下所存储的信息

·hh是hash内存使用的处理句柄,在使用的过程中,只需要对其进行定义即可,不需要为其赋值,一定要记得在结构体内定义UT_hash_handle hh;,hh可以定义为其他变量名,但一般习惯定义为hh。

·uthash库提供的哈希表操作可实现类似于双向链表的功能,可以通过结构成员体hh的hh.prev和hh.next去获取当前结点的前一个结点或者后一个结点

②增加部分

增加还分为下面的几个部分:

1.HASH_ADD_INT:添加键key为int类型

2.HASH_ADD_STR:添加键key为字符串类型,STR就是字符串string缩写

3.HASH_ADD_PTR:添加键key为指针类型,PTR就是指针pointer缩写

4.HASH_ADD:添加键key可以为任何类型

这里讲解HASH_ADD_INT,其他类型的就是照葫芦画瓢了。

 解释:HASH_ADD_INT函数第一个参数hash是哈希表;第二个参数key是键名称字段,在哈希结构体中,我定义的键名称为key,如果你定义为其他的,这里的第二个参数就用所定义的名称;第三个参数s是指向需要增加的结构的指针,其实s就是一个哈希桶。

HASH_FIND_INT函数又是干嘛用的呢,它在这里就是为了检查哈希表是否已经存在了需要加入的键key,如果存在会直接报错。

③查找

查找的分类对应于上面增加的分类

HASH_FIND_INT函数第一个参数hash是哈希表;第二个参数&key是键的地址(一定要传递地址过去);第三个参数s是输出变量,如果存在该键key的话,直接将所在的哈希桶地址赋值给s,s作为返回值返回,如果不存在直接返回NULL。说到底,HASH_FIND_INT函数就是查找键所在的结构指针

④删除

如果要在哈希表中去删除结构,那就必须传入需要删除结构的地址。如果只给键,就借助上面的查找函数获得指向该键所在的结构指针。

 HASH_DEL函数第一个参数hash为哈希表;第二个参数s为指向需要删除键的结构指针,直接看作是链表的删除,删除链表首先需要找到指向该链表的指针。 

 ⑤排序

排序函数

HASH_SORT第一个参数是哈希表;第二个参数是比较函数。哈希表的排序原理跟qsort排序函数原理是一样的。只要你懂得qsort理解就不难了。

 qsort函数栗子:

⑥遍历

for语句中判断条件只有一个参数s,也就是当s不为NULL就指向for循环,反之退出循环。hh.next是指向下一个结点,看下面链表的结构图你可能就明白了。

⑦循环删除

其中HASH_ITER函数是一个宏定义,在编译的过程中会被替换成一个循环。

uthash.h头文件定义的HASH_ITER函数

我来解释一下HASH_ITER在编译的过程中执行什么内容的,刚刚上面提到了HASH_ITER函数是一个宏定义,实际上它是一个循环,所以在编译时会直接被替代成下面的循环。其实这个循环很简单,先来了解一下它的参数。

HASH_ITER第一个参数为hh;第二个参数head为哈希表;第三个参数el和第四个参数tmp都是用来循环的指针。el指针时指向哈希表的头结点的,tmp指针就是el的next指针,一直循环下去,直到哈希表的尾部。图解:

DECLTYPE函数是 decltype(x)函数,我去查了一下这个函数,作用就是将参数类型转换为与x相同的类型,如下:图是盗用的,侵权可删。

出处:C++ decltype用法详解_qq_38196982的博客-CSDN博客_c++ decltype

⑧计算哈希表元素个数

 参数就只有一个哈希表

整体代码:

键key为字符串类型:

HASH_ADD_STR;添加

HASH_FIND_STR;查找

整体栗子代码如下:

 运行结果:

键key为指针类型:

HASH_ADD_PTR;添加

HASH_FIND_PTR;查找 

整体栗子代码: 

 

运行结果:

 

最后特别感谢两位博主,很多内容都是从他们中学到和总结的。

C开源hash代码uthash的用法总结_jiangrongjr的博客-CSDN博客_hash_find_int

C语言哈希表uthash的使用方法详解(附下载链接)_嵌入式与Linux那些事的博客-CSDN博客_uthash使用

查看原文