C语言--数据结构--哈希表
·
一、哈希表
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;
}
参考文章:
更多推荐


所有评论(0)