jhjhnknj 2022-02-26 18:20 采纳率: 100%
浏览 1006
已结题

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

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

  • 写回答

2条回答 默认 最新

  • 猫猫爱吃鱼 2022-02-26 18:32
    关注
    #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);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 五一编程 2022-02-26 18:44
    关注

    当键值为整型时,可以使用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;
    }
    
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 创建了问题 2月26日

悬赏问题

  • ¥15 设计程序,利用函数getCharacterCnt,实现求解出str所指字符串中指定字符的个数,并返回此值。
  • ¥15 设计程序,实现管理30个学生5门课程的成绩,功能模块要求如下。
  • ¥15 B660主板安装xp系统老是出现错误怎么办
  • ¥15 定义过的变量报错未定义
  • ¥15 如何在EXCEL某单元格中查找是否存在另一列中的内容。
  • ¥50 非对称加密(相关搜索:密码学)
  • ¥15 关于非编程寻迹小车的分析
  • ¥15 java导出EXCEL这里已经执行成功了,但是流浪器没有下载
  • ¥15 帮我把代码改的能正常运行就行
  • ¥50 有限元修正、模型修正、最小二乘法,详细步骤