案例:记录用户得分的哈希表
注意
- HASH_ADD里的name是结构体的字段,不是变量;
- 如果要确保哈希表每个键值对唯一,需要在添加时额外判断;
#include <stdio.h>
#include "uthash.h"
#define MAX_NAME_LENGTH 20
// 用户和分数的哈希表
/*
语法
HASH_ADD_STR(g_user, name, user) name是结构体的字段 不是变量
HASH_FIND_STR(g_users, name, user) name是函数的参数变量 FIND变ADD不变
HASH_DEL(g_users, user)
HASH_ITER(hh, g_users, user, temp) hh是UT_hash_handle结构体在哈希表结构体中的字段名
HASH_COUNT(g_users)
HASH_SORT(g_users, compareFunc)
*/
typedef struct UserInfo
{
char name[20];
int score;
UT_hash_handle hh;
} UserInfo;
UserInfo *FindUser(const char *);
// 用户信息哈希表
UserInfo *g_users = NULL;
// 添加用户
void AddUser(const char *name, int score)
{
// 先判断是否存在表中
UserInfo *user = FindUser(name);
if(user == NULL){
// 不在表中 添加新用户
user = malloc(sizeof(UserInfo));
snprintf(user->name, MAX_NAME_LENGTH, name);
user->score = score;
// 添加到哈希表
HASH_ADD_STR(g_users, name, user); // name是结构体字段 不是变量
printf("ADD USER %s SUCCESS\n", name);
}
else{
user->score = score;
}
}
// 查找表中是否有用户
UserInfo *FindUser(const char *name)
{
UserInfo *user = NULL;
HASH_FIND_STR(g_users, name, user);
return user;
}
// 删除用户
void DelUser(const char *name)
{
UserInfo *user = FindUser(name);
if (user != NULL){
HASH_DEL(g_users, user);
free(user);
}
}
// 删除所有用户
void DelAllUsers()
{
UserInfo *current, *temp;
HASH_ITER(hh, g_users, current, temp){
HASH_DEL(g_users, current);
free(current);
}
}
// 用户数量
int GetUserCount()
{
return HASH_COUNT(g_users);
}
// 打印所有用户
void PrintAllUsers()
{
UserInfo *current, *temp;
HASH_ITER(hh, g_users, current, temp){
printf("User:%s, Score: %d\n",current->name, current->score);
}
}
int main() {
// 1. 添加用户测试
printf("===ADD User TEST ===\n");
AddUser("Alice", 88); // 添加新用户
AddUser("Bob", 90); // 添加新用户
AddUser("Alice", 95); // 更新已存在用户
AddUser("Charlie", 85);
printf("CURRENT NUM: %d\n", GetUserCount());
PrintAllUsers();
// 2. 查找用户测试
printf("\n=== SEARCH USER ===\n");
const char *searchName = "Bob";
UserInfo *found = FindUser(searchName);
if (found) {
printf("FIND: %s, SCORE: %d\n", found->name, found->score);
} else {
printf("NOT FOUND: %s\n", searchName);
}
// 3. 删除用户测试
printf("\n=== DELETE USER ===\n");
DelUser("Bob");
printf("count after DEL BOB: %d\n", GetUserCount());
PrintAllUsers();
// 5. 清理测试
printf("\n=== CLEAN===\n");
DelAllUsers();
printf("TOTAL NUM: %d\n", GetUserCount());
return 0;
}