本文主要是对优秀博文的总结。
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使用
发表评论