哈希表基础及应用

哈希表结构体

        头文件 “uthash.h
        typedef struct HASH
        {
            int key;
            int value;                       
//不是必需的
            UT_hash_handle hh;    //头文件定义的类型
        }tHash;                   //用户自己定义

        在结构体定义中,key的数据类型可以是整型、字符、指针等

        value的类型也是自定义的,value不一定存在的
        可以在结构体中只定义key值,这样哈希表就只关注表中有没有某个key,而不关心它对应的value值;

        typedef struct HASH
        {
            int key;

            UT_hash_handle hh;    //头文件定义的类型
        }tHash;                   //用户自己定义

        结构体中key的定义一定要有,UT_hash_handle hh也不能去掉。

初始化哈希表

        tHash *hash_table = NULL;

查找元素

        HASH_FIND_INT( hash_table , &user_id, temp );

        hash_table :待查询的hash表;
        &user_id:指向想查询的key的地址;user_id表示要查的key值,前面加& 取址;
        temp:表示该函数的输出值,根据user_id查到的键值对;它是一个指向哈希表users中一个键值对的指针。
        因此在调用该函数前,要先定义s, 完整用法如下:

        tHash *temp;

        HASH_FIND_INT(hash_table,&user_id,temp);

        if(temp == NULL)

        {

                //xxxx    no find

        }

        else

        {

                //xxx   have find

        }

插入元素

       保持哈希表中的唯一性,在插入键值对之前,一定要先判断表中是否已经存在要插入的键,如果已存在,就直接修改键对应的value;如果没有存在,插入键值对。

        HASH_ADD_INT( hash_table , id, temp );

        hash_table :待插入的hash表;

        id:key域的变量名;

        s:待插入的键值对结构体,是指针形式。

        tHash *temp;

        HASH_FIND_INT(hash_table,&user_id,temp);

        if(temp == NULL)

        {

               temp = (tHash *)malloc(sizeof(tHash));
               temp->key = id;
               temp->value = 100;
               HASH_ADD_INT(hash_table ,key,temp);
        }

        else

        {

                //xxx   have find

        }

统计元素个数

        num_users = HASH_COUNT(hash_table );

        hash_table :待统计元素个数的hash表

        函数输出即为哈希表中存在的键值对个数

应用

        LeetCode两数之和

        给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
 

struct hashTable
{
    int key;
    int val;
    UT_hash_handle hh;
};

struct hashTable* hashtable;

struct hashTable* find(int ikey)
{
    struct hashTable* tmp;
    HASH_FIND_INT(hashtable, &ikey, tmp);
    return tmp;
}

void insert(int ikey, int ival) 
{
    struct hashTable* it = find(ikey);
    if (it == NULL)
    {
        struct hashTable* tmp = malloc(sizeof(struct hashTable));
        tmp->key = ikey, tmp->val = ival;
        HASH_ADD_INT(hashtable, key, tmp);
    }
    else
    {
        it->val = ival;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bigger_One

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值