一、哈希表

1、定义

2、初始化

#include "uthash.h"
typedef struct {
    int key; //哈希表的key
    int value;//哈希表的value
    UT_hash_handle hh;//uthash需要
} Hash;
Hash *hashtable = NULL;//创建一个空哈希表

3、增加和修改哈希表

void hash_insert(int ikey, int ival) {
    struct Hash* it = find(ikey); //在哈希表中查找键ikey是否存在
    if (it == NULL) {             //键不存在,插入新键值对
        struct Hash* tmp = malloc(sizeof(struct Hash));//创建新节点
        tmp->key = ikey, tmp->val = ival;
        HASH_ADD_INT(hashtable, key, tmp);    //将新节点添加到哈希表
    } 
    else {        //键存在,更新对应的值
        it->val = ival;
    }
}

4、查找

找到返回hash数据;找不到返回NULL

struct hashTable* hash_find(int ikey) {
    struct Hash* tmp;
    HASH_FIND_INT(hashtable, &ikey, tmp);    //查找键为ikey的元素
    return tmp;    //找到键为tmp->key;键值为tmp->value
}

5、删除

删除成功返回1;删除失败返回0

int hash_delete(int ikey) {
	struct Hash* it = find(ikey);
	if (it != NULL) {
		HASH_DEL(hash, it);
	    free(it);
	    it = NULL;
	    return 1;
	}else{
		return 0;
	}
}

6、释放节点

清空哈希表,释放所有节点的内存

struct Hash* tmp;
HASH_ITER(hh, idx_map, e, tmp) {    //遍历哈希表中所有元素
    HASH_DEL(idx_map, e);
    free(e);
}

例题:

给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。返回正整数 k ,如果不存在这样的整数,返回 -1 。

#define MAX(a, b) ((a) > (b) ? (a) : (b))

typedef struct{
    int key;
    UT_hash_handle hh;
}HashEntry;

int findMaxK(int* nums, int numsSize) {
    HashEntry* map=NULL;
    int maxk=-1;

    for(int i=0;i<numsSize;i++){
        HashEntry* tmp;
        int t=-nums[i];
        HASH_FIND_INT(map,&t,tmp);
        if(tmp==NULL){
            tmp=(HashEntry*)malloc(sizeof(HashEntry));
            tmp->key=nums[i];
            HASH_ADD_INT(map,key,tmp);
        }
        else{
            //tmp->value=fabs(nums[i]);
            maxk=MAX(maxk,fabs(nums[i]));   //相反数存在,更新最大值
        }
    }

    // 清理内存
    HashEntry *current, *temp;
    HASH_ITER(hh, map, current, temp) {
        HASH_DEL(map, current);
        free(current);
    }
    return maxk;
}

 参考文章:

【uthash库】C语言中哈希表的使用_c语言 hash库-CSDN博客

更多推荐