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

article/2025/10/3 2:53:05

由于C语言本身不存在哈希,因此,我们可以调用开源的第三方头文件,这只是一个头文件:uthash.h,使用时只需要在文件首部编写#include<uthash.h>即可。

uthash的使用

#include "uthash.h"
struct my_struct {int id;                    /* key */char name[10];UT_hash_handle hh;         /* makes this structure hashable */
};
/*声明哈希为NULL指针*/
struct my_struct *users = NULL;    /* important! initialize to NULL */

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

注意:一定要包含UT_hash_handle hh(在之后的个别函数中可能会用到这个UT_hash_handle);hh不需要初始化,它可以命名为任何名称,一般都命名为hh。

 查找元素

struct my_struct *find_user(int user_id) {    // 返回哈希结构体类型的变量struct my_struct *s;HASH_FIND_INT( users, &user_id, s );  /* s: output pointer */return s;    // 如果存在就返回正确的地址,反之返回空地址NULL
}

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

添加元素

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

void add_user(int user_id, char *name) {struct my_struct *s;/*重复性检查,当把两个相同key值的结构体添加到哈希表中时会报错*/HASH_FIND_INT(users, &user_id, s);  /* id already in the hash? *//*只有在哈希中不存在ID的情况下,我们才创建该项目并将其添加。否则,我们只修改已经存在的结构。*/if (s==NULL) {s = (struct my_struct *)malloc(sizeof *s);    //现在才实际分配空间s->id = user_id;HASH_ADD_INT( users, id, s );  /* id: name of key field */}strcpy(s->name, name);
}

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

 

替换元素

实际上 HASH_REPLACE_INT 和 HASH_ADD_INT 相差无几,先查看某一键值是否存在,如果不存在就不予以替换,如果存在就予以替换

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

删除元素

void delete_user(struct my_struct *user) {HASH_DEL(users, user);  /* user: pointer to deletee */free(user);             /* optional; it's up to you! */
}

注意

  1. 从哈希表中删除结构,必须具有指向它的指针。(如果只有键,请先执行HASH_FIND以获取结构指针)。
  2. 这里users是哈希表,user是指向我们要从哈希中删除的结构的指针。
  3. 删除结构只是将其从哈希表中删除,实际内存空间没有变,并非free 。何时释放要删除的这个结构的选择完全取决于自己;uthash永远不会释放您的结构,

循环删除

void delete_all() {struct my_struct *current_user, *tmp;HASH_ITER(hh, users, current_user, tmp) {HASH_DEL(users,current_user); /* delete; users advances to next */free(current_user); /* optional- if you want to free */}
}

删除哈希表所有元素

删除的是一种 “ 引用

HASH_CLEAR(hh,users);

计算哈希表元素个数

HASH_COUNT可以直接进行调用

unsigned int num_users;
num_users = HASH_COUNT(users);
printf("there are %u users\n", num_users);

排序哈希表

HASH_SORT( users, name_sort );

HASH_SORT 函数第二个参数是指向比较函数的指针。它必须接受两个指针参数(要比较的项目),并且如果第一个项目分别在第二个项目的前面,等于或后面排序,则必须返回小于零,零或大于零的int。 (这与标准C库中的strcmp或qsort使用的约定相同)。

int sort_function(void *a, void *b) {/* compare a to b (cast a and b appropriately)* return (int) -1 if (a < b)* return (int)  0 if (a == b)* return (int)  1 if (a > b)*/
}

name_sort和id_sort的两个排序函数示例

int name_sort(struct my_struct *a, struct my_struct *b) {return strcmp(a->name,b->name);
}
int id_sort(struct my_struct *a, struct my_struct *b) {return (a->id - b->id);
}

 对排序函数的封装,名字和id两者不同的排序

void sort_by_name() {HASH_SORT(users, name_sort);
}void sort_by_id() {HASH_SORT(users, id_sort);
}


http://chatgpt.dhexx.cn/article/AOYY2RoV.shtml

相关文章

utxo 是什么

UTXO 代表 Unspent Transaction Output。 在比特币社区里&#xff0c;Transaction 被简称为 TX&#xff0c;所以上面这个短语缩写为 UTXO。一般会认为 UTXO 是比特币区块链设计当中的一部分&#xff0c;但事实上 UTXO 和区块链没有必然的联系&#xff0c;你可以完全照搬比特币区…

UT单元测试(一)——基础流程总结篇

参考书籍《单元测试的艺术》 一、单元测试的定义 一个单元测试是一段代码&#xff08;通常是一个方法&#xff09;&#xff0c;这段代码调用另一段代码&#xff08;一个单元可以是一个方法或函数&#xff09;&#xff0c;然后检验某些假设的正确性。如果这些假设是正确的&a…

UT标记详细说明

原来论坛用的是UT标记&#xff0c;UT是UltraThreads的简写。 微软word用的是Microsoft Word XML。 网页用的html ------------------------------------------------------------------ 什么是UT代码&#xff1f; UT标记对HTML的简化。一般情况下&#xff0c;即使指定讨论区禁…

UT-890J ( USB -2- RS422/485 Cable )

USB -2- RS422/485 Cable < 參考 網路文章 / 規格書 > DB9 公頭 (有 DB9轉 KF128螺絲端子轉接板 ) UT890_20190220152556_43695-2.pdf 驅動下載: UT890_Win XP Server2003 2008 Vista 7 8 32-64bit FT-232 USB-232 Chip USB -2- RS422/485 Cable < 參考文章 / 規格書…

RTU是什么及其用途

RTU是Remote Terminal Unit&#xff08;远程终端单元&#xff09;的缩写&#xff0c;是一种用于实现现动器等现场控制设备&#xff0c;实现对现场设备的实时监控&#xff0c;用途包括以下几个方面&#xff1a; 1.压力、流量等。 2.实时监测&#xff1a;RTU可以对现场设备进行…

RTU和DTU的区别是什么?

在物联网应用中&#xff0c;我们经常使用到两种数据传输设备——DTU和RTU。它们的功能大致相似&#xff0c;但又有些许不同。那在实际应用中&#xff0c;什么情况选择DTU&#xff0c;什么情况选择RTU呢&#xff1f;下面我们就一起来看看&#xff0c;它们之间到底有什么区别以及…

RTU和DTU分别是什么?

RTU和DTU是两种常见的远程数据采集和传输设备&#xff0c;虽然它们都是用于实现远程数据采集和传输&#xff0c;但在一些方面存在不同&#xff0c;下面是两者的区别。1、定义RTU是Remote Terminal Unit的缩写&#xff0c;翻译为“远程终端单元”&#xff0c;它是一种用于实现远…

硬刚Hive | 4万字基础调优面试小总结

本文基本涵盖以下内容&#xff1a; 一、基于Hadoop的数据仓库Hive基础知识二、HiveSQL语法三、Hive性能优化四、Hive性能优化之数据倾斜专题五、HiveSQL优化十二板斧六、Hive面试题(一)七、Hive/Hadoop高频面试点集合(二) 基于Hadoop的数据仓库Hive基础知识 Hive是基于Hadoop的…

数据结构知识点_重点期考总结复习

目录 前言数据数据的逻辑结构和物理结构逻辑结构物理结构&#xff08;存储结构&#xff09; 算法特性和时间复杂度算法的五大特性算法的时间复杂度 线性表线性表两种存储结构顺序表链型表线性表分析 栈和队列栈队列 串串的基本操作定长存储结构堆分配存储结构块链存储表示串的模…

前端JS/TS面试题

JS面试题总结 一、this指向问题&#xff08;1&#xff09;this的理解&#xff08;2&#xff09;怎样改变this的指向问题&#xff08;3&#xff09;Call,bind,apply三者的区别&#xff08;4&#xff09;容易判读错的几种this情况&#xff08;5&#xff09;this指向问题&#xff…

3.Hadoop Hive服务

接上文—————> 目录&#xff1a; 一.安装二.have基本命令操作三.hive数据仓库四.hive表的类型&#xff1a;五.hive中重要的元数据表六.hive的连接方式七.使用jdbc编写外部程序操作hive八.hive的基本数据类型九.hive的复杂的数据类型十.hive的建表语句十一.hive 删除表十…

深入理解计算机系统(CSAPP)含lab详解 完结

文章目录 深入理解计算机操作系统-第一章1.1 信息就是位 上下文1.2 程序被其他程序翻译成不同的格式1.3 了解编译系统如何工作是大有益处的1.4 处理器读并解释储存在内存中的指令1.4.1 系统的硬件组成I/O 设备1.4.2 运行 hello 程序 1.5 高速缓存至关重要1.6 存储设备形成层次…

面经-hangzhou

目录 上篇 一、基础篇 网络基础 TCP三次握手 HTTP协议 浏览器输入URL过程 操作系统基础 进程和线程的区别 操作系统内存管理 Java基础 面向对象三大特性 数据结构 设计模式与原则 面试题 构造方法 初始化块 This 重写和重载的区别 Object类方法 基本数据类…

Hive入门详解操作

Hive 第一章 Hive简介 1.1. Hive的简介 1.1.1 hive出现的原因 FaceBook网站每天产生海量的结构化日志数据&#xff0c;为了对这些数据进行管理&#xff0c;并且因为机器学习的需求&#xff0c;产生了hive这门技术&#xff0c;并继续发展成为一个成功的Apache项目。 1.1.2 …

计算机科学速成课 Crash Course Computer Science 笔记(摘要形式)

Crash Course Computer Science总共40节课&#xff0c;架构式地详细介绍了计算机从底层到顶层的构造和新的技术&#xff0c;一节课十分钟左右&#xff0c;可让小白在很短时间内产生对计算机的总体理解 本文是听课后做的笔记&#xff0c;便于复习回顾 点击观看计算机科学速成课 …

算法基础课【合集1】

文章目录 基础算法785. 快速排序786. 第k个数787. 归并排序788. 逆序对的数量789. 数的范围790. 数的三次方根791. 高精度加法792. 高精度减法793. 高精度乘法794. 高精度除法795. 前缀和796. 子矩阵的和797. 差分798. 差分矩阵799. 最长连续不重复子序列800. 数组元素的目标和…

hive知识点总结

Hive 一、Hive简介 什么是Hive Hive由FaceBook实现并开源基于Hadoop的数据仓库工具可以将结构化的数据映射为一张数据库表并提供HQL&#xff08;Hive Sql&#xff09;查询功能底层数据是存储在HDFS上的Hive的本质是将SQL转化为MapReduce任务进行不熟悉MapReduce的用户很方便…

数据结构知识

数据结构 第零章 引入0.1 元素类型说明0.2 数组定义0.3 内存动态分配0.4 参数传递0.5 操作算法中用到的预定义常量和类型0.6 结构类型的比较 第一章绪论1.1 数据结构的研究内容❀内容小结 1.2 基本概念和术语1.2.1 数据、数据元素、数据项、数据对象1.2.2 数据结构1.2.2.1 逻辑…

Hive

文章目录 1️⃣、Hive入门1.1、什么是Hive1.2、Hive架构 2️⃣、Hive安装及使用2.1、 Hive安装地址2.2、Hive安装部署.2.2.1、安装Hive2.2.2、启动并使用Hive 2.3、MySQL安装2.3.1 安装MySQL2.3.2 配置MySQL 2.4、配置Hive元数据存储到MySQL2.4.1 配置元数据到MySQL2.4.2 验证元…

计算机组成与设计 硬件/软件接口 Risc-v 版

第一章 计算机抽象及相关技术 1.1 引言 1.1.1 传统的计算机应用分类及其特点 个人计算机(Personal Computer, PC) 通用&#xff0c;各种软件;受成本、性能权衡 服务器(Sever Computer) 基于网络;高容量、性能、可靠性;范围从小型服务器到建筑规模;用于为多个用户并行运行大…