两数相加使用哈希表C语言详解

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;
}