在C语言开发中,处理大量数据时常常需要高效的查找、插入和删除操作。标准C库并没有提供现成的哈希表(Hash Table)结构,而 uthash 是一个轻量级、开源、仅需头文件即可使用的哈希表库,非常适合嵌入到C项目中。本文将带你从零开始掌握 uthash使用教程,即使是编程小白也能轻松上手!
uthash 是由 Troy D. Hanson 开发的一个用纯C编写的宏库,它允许你将任意结构体变成哈希表。你不需要手动管理内存或实现复杂的哈希算法——uthash 会帮你完成这些工作。
uthash 只是一个头文件(uthash.h),你可以从其 官方网站 下载,或者使用包管理器安装(如 vcpkg、Homebrew 等)。
下载后,只需在你的C源文件中包含它:
#include "uthash.h" 使用 uthash 的核心在于:定义一个包含 UT_hash_handle 成员的结构体,并通过宏操作该结构体的实例。
假设我们要存储用户信息(ID 和姓名),结构体如下:
typedef struct { int id; // 键(key) char name[32]; // 值(value) UT_hash_handle hh; // uthash必需的句柄} User; 注意:UT_hash_handle hh 是必须的,名称可以任意(但通常叫 hh),它是uthash内部用来管理链表和哈希桶的。
你需要一个指向结构体的全局或局部指针,作为哈希表的“头”:
User *users = NULL; // 初始化为空 使用 HASH_ADD_INT(用于整型键)或 HASH_ADD_STR(用于字符串键)等宏插入数据:
void add_user(int id, const char *name) { User *s; HASH_FIND_INT(users, &id, s); // 先查找是否已存在 if (s == NULL) { s = (User*)malloc(sizeof(User)); s->id = id; strcpy(s->name, name); HASH_ADD_INT(users, id, s); // 插入到哈希表 }} User* find_user(int id) { User *s; HASH_FIND_INT(users, &id, s); // 注意:第二个参数是指针 return s;} void delete_user(int id) { User *s = find_user(id); if (s) { HASH_DEL(users, s); // 从哈希表中移除 free(s); // 手动释放内存 }} 遍历所有元素:
User *current_user, *tmp;HASH_ITER(hh, users, current_user, tmp) { printf("ID: %d, Name: %s\n", current_user->id, current_user->name);} 释放整个哈希表:
HASH_ITER(hh, users, current_user, tmp) { HASH_DEL(users, current_user); free(current_user);}// users 自动变为 NULL #include <stdio.h>#include <stdlib.h>#include <string.h>#include "uthash.h"typedef struct { int id; char name[32]; UT_hash_handle hh;} User;User *users = NULL;void add_user(int id, const char *name) { User *s; HASH_FIND_INT(users, &id, s); if (s == NULL) { s = (User*)malloc(sizeof(User)); s->id = id; strcpy(s->name, name); HASH_ADD_INT(users, id, s); }}User* find_user(int id) { User *s; HASH_FIND_INT(users, &id, s); return s;}int main() { add_user(1, "Alice"); add_user(2, "Bob"); add_user(3, "Charlie"); User *u = find_user(2); if (u) { printf("Found: %s\n", u->name); // 输出 Bob } // 遍历 User *current, *tmp; HASH_ITER(hh, users, current, tmp) { printf("ID=%d, Name=%s\n", current->id, current->name); } // 清理内存 HASH_ITER(hh, users, current, tmp) { HASH_DEL(users, current); free(current); } return 0;} HASH_ADD_STR)。free 内存,uthash 只管理链表结构,不负责内存释放。通过本篇 C语言哈希表 教程,你应该已经掌握了 uthash库入门 的基本用法。无论是做算法题、嵌入式开发还是系统编程,哈希表C语言实现 都是一项非常实用的技能。希望这篇 uthash使用教程 能帮助你快速上手,写出更高效的C程序!
—— 学会uthash,让C语言也能轻松玩转哈希表! ——
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127500.html