一. 简介
在C语言中,在C语言中,并没有标准库直接支持哈希表这种数据结构。如果要使用哈希表,有两种方法:第一种是自行实现,第二种是使用第三方库提供的哈希表。前面已经学习过了C语言实现哈希表的操作。本文简单学习C语言中第三方库提供的哈希表操作。
常用的第三方库有uthash,GHashTable,khash。本文就学习一下 uthash第三方库中哈希表的操作。
二. uthash库中常用接口
uthash 第三方库是一个轻量级的哈希表实现方案,通过简单的API提供哈希表操作功能,如插入、查找、删除和遍历等。以宏的形式实现,无需进行额外的编译操作。使用时,只需要把头文件 uthash.h 包含进来即可。
uthash 库中常用的接口
1. 向哈希表中添加新元素
  HASH_ADD_INT(head, keyfield_name, item): 添加整型键的元素
  HASH_ADD_STR(head, keyfield_name, item):添加字符串键的元素
HASH_ADD_PTR(head, keyfield_name, item):添加指针键的元素
HASH_ADD(hh, head, keyfield_name, key_len, item):通用添加宏,适用于任何键类型
HASH_ADD_KEYPTR(hh,head,keyptr,keylen,item):uthash 库中一个更底层的添加元素到哈希表的接口
2. 在哈希表中查找元素
HASH_FIND_INT(head, key_ptr, out):查找整型键的元素
HASH_FIND_STR(head, key_ptr, out):查找字符串键的元素
HASH_FIND_PTR(head, key_ptr, out):查找指针键的元素
HASH_FIND(hh, head, key_ptr, key_len, out): 通用查找宏
3. 删除元素
HASH_DEL(head, item): 从哈希表中删除指定元素
4. 哈希表遍历和统计宏
HASH_ITER(hh, head, item, tmp):安全迭代宏(迭代时可删除元素)
HASH_COUNT(head):返回哈希表中元素的数量
HASH_CLEAR(hh, head):清空整个哈希表(但不释放元素内存)
5. 排序宏
HASH_SORT(head, cmp): 根据比较函数对哈希表排序
三. uthash库部分接口的具体使用方法
(1) HASH_FIND_STR(head, key, out_ptr)
专门用于以字符串作为键值的情况查找哈希表中的条目。
- head: 指向哈希表头部的指针(结构体指针)
- key: 要查找(字符串类型的)键(char * 类型)
- out_ptr: 用来存储查找到的结构体的指针(输出参数)
如果找到了匹配的键,out_ptr 将被设置为对应的结构体指针;否则 为 NULL。
(2) HASH_ADD_STR(head, keyfield, new_node)
专门用于以字符串作为键值的情况添加新条目到哈希表。
- head: 指向哈希表头部的指针(结构体指针)
- keyfiled: 结构体中用作键的字段名(char[] 或 char*)
- new_node: 要添加到哈希表中的结构体指针(结构体指针)
(3) HASH_ITER(hh, head, item, tmp)
逐个访问哈希表中的所有元素。
- hh: 结构体中定义的 UT_hash_handle hh; 字段名(必须)( UT_hash_handle)
- head: 哈希表的头指针(结构体指针)
- item: 当前遍历到的元素指针(输出)(结构体指针)
- tmp: 临时变量,用于保存下一个节点指针,防止删除时断链(结构体指针)
(4) HASH_DEL(head, delptr)
从哈希表中删除条目(内存需手动释放)。
- head: 哈希表的头指针(结构体指针)
- delptr: 指向要删除元素的指针。(结构体指针)
 
                   
                   
                   
                   
                            
 
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   2610
					2610
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            