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;
}
/*在上述代码中,第一个参数hashtable是哈希表,第二个参数是ikey的地址(一定要传递地址)。
最后tem是输出变量。当可以在哈希表中找到相应键值时,temp返回给定键的结构,当找不到时temp
返回NULL*/
void insert(int ikey,int ival){
/*重复性检查,当把两个相同key值的结构体添加到哈希表中时会报错*/
struct hashTable* it = find(ikey);
/*只有在哈希中不存在ID的情况下,我们才创建该项目并将其添加。
否则,我们只修改已经存在的结构。*/
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;
}
}
/*
HASH_ADD_INT表示添加的键值为int类型 HASH_ADD_STR表示添加的键值为字符串类型
HASH_ADD_PTR表示添加的键值为指针类型 HASH_ADD表示添加的键值可以是任意类型
HASH_ADD_INT函数中,第一个参数hashtable是哈希表,第二个参数ikey是键字段的名称。
最后一个参数tmp是指向要添加的结构的指针。
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
hashtable = NULL;/* important! initialize to NULL初始化hashtable指针很重要!! */
for (int i = 0;i < numsSize; i++){
struct hashTable* it = find (target - nums[i]);
if (it != NULL){
int* ret = malloc(sizeof(int) * 2);
ret[0] = it -> val,ret[1] =i;
*returnSize = 2;
return ret ;
}
insert(nums[i],i);
}
*returnSize = 0;
return NULL;
}