Loading

C语言入门-uthash使用

案例:记录用户得分的哈希表

注意

  1. HASH_ADD里的name是结构体的字段,不是变量;
  2. 如果要确保哈希表每个键值对唯一,需要在添加时额外判断;
#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;
}
posted @ 2025-08-06 23:25  Sunyaa  阅读(84)  评论(0)    收藏  举报