哈希表结构体
头文件 “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;
}
}