C语言HASH_FIND_INT函数什么意思?怎么用?

C语言HASH_FIND_INT函数什么意思?怎么用?做题时遇到此函数不知如何使用。

#include "uthash.h"
typedef struct {
    int key;
    int value;
    UT_hash_handle hh;
} Hash;
Hash *hash = NULL;

// 增加
void add(int key, int value)
{
    Hash *s = NULL;
    s = (Hash *)malloc(sizeof(Hash));
    s->key = key;
    s->value = value;
    HASH_ADD_INT(hash, key, s);
 
}
// 查找
int find(int key)
{
    Hash *s = NULL;
    HASH_FIND_INT(hash, &key, s);
    
    if (s != NULL) {
        // 查找到结果
        return 1;
    } else {
        return 0;
    }
}
// 删除
void delete (Hash *s)
{
    HASH_DEL(hash, s);
    free(s);
    s = NULL;
}
void clearAll()
{
    Hash *s, *tmp;
    HASH_ITER(hh, hash, s, tmp)
    {
        delete (s);
    }
}
//计数
int cnt = HASH_COUNT(hash);

当键值为整型时,可以使用HASH_ADD_INT和HASH_FIND_INT。(对于所有类型的键,其他操作(例如HASH_DELETE和)HASH_SORT都是相同的)。



作者:嵌入式与Linux那些事
链接:https://www.nowcoder.com/discuss/678800?channel=-1&source_id=discuss_terminal_discuss_sim_nctrack
来源:牛客网

#include <stdio.h>   /* gets */
#include <stdlib.h>  /* atoi, malloc */
#include <string.h>  /* strcpy */
#include "uthash.h"
 
struct my_struct {
    int id;                    /* key */
    char name[10];
    UT_hash_handle hh;         /* makes this structure hashable */
};
 
struct my_struct *users = NULL;
 
void add_user(int user_id, char *name) {
    struct my_struct *s;
 
    HASH_FIND_INT(users, &user_id, s);  /* id already in the hash? */
    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);
}
 
struct my_struct *find_user(int user_id) {
    struct my_struct *s;
    s = (struct my_struct *)malloc(sizeof *s);
    HASH_FIND_INT( users, &user_id, s );  /* s: output pointer */
    return s;
}
 
void delete_user(struct my_struct *user) {
    HASH_DEL(users, user);  /* user: pointer to deletee */
    free(user);
}
 
void delete_all() {
  struct my_struct *current_user, *tmp;
 
  HASH_ITER(hh, users, current_user, tmp) {
    HASH_DEL(users, current_user);  /* delete it (users advances to next) */
    free(current_user);             /* free it */
  }
}
 
void print_users() {
    struct my_struct *s;
 
    for(s=users; s != NULL; s=(struct my_struct*)(s->hh.next)) {
        printf("user id %d: name %s\n", s->id, s->name);
    }
}
 
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);
}
 
void sort_by_name() {
    HASH_SORT(users, name_sort);
}
 
void sort_by_id() {
    HASH_SORT(users, id_sort);
}
 
int main(int argc, char *argv[]) {
    char in[10];
    int id=1, running=1;
    struct my_struct *s;
    unsigned num_users;
 
    while (running) {
        printf(" 1. add user\n");
        printf(" 2. add/rename user by id\n");
        printf(" 3. find user\n");
        printf(" 4. delete user\n");
        printf(" 5. delete all users\n");
        printf(" 6. sort items by name\n");
        printf(" 7. sort items by id\n");
        printf(" 8. print users\n");
        printf(" 9. count users\n");
        printf("10. quit\n");
        gets(in);
        switch(atoi(in)) {
            case 1:
                printf("name?\n");
                add_user(id++, gets(in));
                break;
            case 2:
                printf("id?\n");
                gets(in); id = atoi(in);
                printf("name?\n");
                add_user(id, gets(in));
                break;
            case 3:
                printf("id?\n");
                s = find_user(atoi(gets(in)));
                printf("user: %s\n", s ? s->name : "unknown");
                break;
            case 4:
                printf("id?\n");
                s = find_user(atoi(gets(in)));
                if (s) delete_user(s);
                else printf("id unknown\n");
                break;
            case 5:
                delete_all();
                break;
            case 6:
                sort_by_name();
                break;
            case 7:
                sort_by_id();
                break;
            case 8:
                print_users();
                break;
            case 9:
                num_users=HASH_COUNT(users);
                printf("there are %u users\n", num_users);
                break;
            case 10:
                running=0;
                break;
        }
    }
 
    delete_all();  /* free any structures */
    return 0;
}