代码随想录算法训练营第七天| 哈希相关题目

uthash.h

#include <stdio.h>
#include "uthash.h"

struct my_struct {
	int key;
	char value[10];
	UT_hash_handle hh;
};

/*定义一个hash结构的空指针,用于指向保存数据的hash表,必须初始化为空,在后面的查、插操作中,uthash内部会根据其是否为空而进行不同的操作*/
struct my_struct* g_users = NULL; 


/*查找:先定义一个hash结构体指针变量,然后通过HASH_FIND_INT接口找到该key对应的hash结构体*/ 
struct my_struct* find_users(int ikey) {
	struct my_struct* s;
	HASH_FIND_INT(g_users, &ikey, s);
	return s;
}

/*插入:由于uthash要求键必须一致,而uthash内部未对key值的唯一性进行很好地处理,因此他要求外部在插入操作时要确保其key值不在当前的hash表中,这就需要在插入操作时,先查找hash表看其值是否已经存在,不存在时再进行插入操作,在这里需要注意:
1、插入时先查找,当键不在当前的hash表中时再进行插入,以确保键的唯一性
2、需要调用插入接口函数时需要明确告诉接口函数,自己定义的键变量的名字是什么
*/
void add_user(int ikey, char *value_buf) {
	struct my_struct* s;
	HASH_FIND_INT(g_users, &ikey, s); // 查看key值是否已经在hash表g_users中了
	if (s == NULL) {
		s = (struct my_struct*)malloc(sizeof(struct my_struct));
		s->ikey = ikey;
		HASH_FIND_INT(g_users, &ikey, s); // 告诉插入函数我们定义的hash结构体中键变量的名字
	}
	strcpy(s->value, value_buf);
}

/*删除:删除操作的接口函数为HASH_DEL,只需要告诉接口要释放哪个hash表(这里是g_users)里的哪个节点(这里是s),需要注意:释放申请的hash结构体变量,uthash函数只将结构体从hash表中移除,并未释放该结构体所占据的内存*/
void delete_user(int ikey) {
	struct my_struct* s = NULL;
	HASH_FIND_INT(g_users, &ikey, s);
	if (s == NULL){
		HASH_DEL(g_users, s);
		free(s);
	}
}

/*清空hash表:*/
void delete_all() {
	struct my_struct *current_user, *tmp;
	HASH_ITER(hh, g_users, current_user, tmp) {
		HASH_DEL(g_users, current_user);
		free(current_user);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

is_xiaotian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值