C语言中实现hash表

引入所需的头文件

一般高级语言都会有封装好的hash存储结构,使用c语言的时候同样也可以实现hash,我们自己实现的话逻辑会非常复杂,并且可能会出错,这里我们需要利用一个第三方开源的头文件uthash.h来实现,大家可以在github或者码云上面找到这个文件。

另外,在官网也有它的用法介绍,链接附上

在这里插入图片描述
下面我们利用这个头文件来实现一个hash结构,实现添加元素、删除元素、统计元素个数、遍历元素等功能。

hash的实现

官方文档说我们需要实现这样的一个结构体,以便我们实现hash表这个结构。UT_hash_handle hh;是我们把这个结构体变成hash表所必须的一个字段,我们只需要在结构体中定义即可。
在这里插入图片描述

#include <stdio.h>   /* gets */
#include <stdlib.h>  /* atoi, malloc */
#include <string.h>  /* strcpy */
#include "uthash.h"

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

首先我们需要声明一个hash,

struct MyStruct *g_user = NULL;   /* important! initialize to NULL */

添加元素

void addUser(int ikey,char * ivalue){
	struct MyStruct *s;
	HASH_FIND_INT(g_user,&ikey,s);
	if(s==NULL){
		s=(struct MyStruct *)malloc(sizeof(struct MyStruct));
		s->key=ikey;
		HASH_ADD_INT(g_user,key,s); 
	}
	strcpy(s->value,ivalue);
}

根据key获取元素

struct MyStruct * getUser(int key){
	struct MyStruct *s;
	HASH_FIND_INT(g_user,&key,s);
	return s;
}

根据key删除元素

void deleteUser(int key){
	struct MyStruct *s = NULL;
	HASH_FIND_INT(g_user,&key,s);
	if(s!=NULL){
		HASH_DEL(g_user,s);
		free(s);
	}
}

获取元素的总个数

int getNum(){
	return HASH_COUNT(g_user);
}

删除所有的元素

void delAll(){
	struct MyStruct *current,*temp;
	HASH_ITER(hh,g_user,current,temp){
		HASH_DEL(g_user,current);
		free(current);
	}
	
}

判断是否包含某个键值为key的元素

int containUser(int key){
	struct MyStruct *s = NULL;
	HASH_FIND_INT(g_user,&key,s);
	return s!=NULL;
}

遍历输出所有的元素

void printUsers() {
    struct MyStruct *s;
    for(s=g_user; s != NULL; s=(struct MyStruct*)(s->hh.next)) {
        printf("user id %d: name %s\n", s->key, s->value);
    }
}

基础的演示

int main(int argc, char *argv[]) {
    char in[10];
    int id=1, running=1,i;
    struct MyStruct  *s;
    unsigned num_users;

    while (running) {
        printf(" 1. add user\n");
        printf(" 2. contain user?\n");
        printf(" 3. find user\n");
        printf(" 4. delete user\n");
        printf(" 5. delete all users\n");
        printf(" 6. print users\n");
        printf(" 7. count users\n");
        printf(" 8. quit\n");
        gets(in);
        switch(atoi(in)) {
            case 1:
                printf("name?\n");
                addUser(id++, gets(in));
                break;
            case 2:
                printf("id?\n");
                i=atoi(gets(in));
                i = containUser(i);
                if(i)printf("Contain !\n");
                else printf("NO contain !\n");
                break;
            case 3:
                printf("id?\n");
                s = getUser(atoi(gets(in)));
                printf("user: %s\n", s ? s->value : "unknown");
                break;
            case 4:
                printf("id?\n");
                i = atoi(gets(in));
                deleteUser(i);
                break;
            case 5:
                delAll();
                break;
            case 6:
	            printUsers();
	            break;
            case 7:
                num_users=HASH_COUNT(g_user);
                printf("there are %u users\n", num_users);
                break;
            case 8:
                running=0;
                break;
        }
    }

//    delete_all();  /* free any structures */
    return 0;
}

另外,对于hash的实现,键值可以是不同的类型,可以是指针,也可以是另一个结构体类型,等等。官网介绍非常详细,可以直接参阅。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: ut_hash_handle hh是一个结构体成员,用于示哈希的元素。它是由开源库uthash提供的,用于实现C语言的哈希。hh是一个指向ut_hash_handle结构体的指针,它包含了哈希元素的键值和指向下一个元素的指针等信息。通过hh指针,可以在哈希快速查找、插入和删除元素。 ### 回答2: ut_hash_handle hh是一种哈希数据结构的一个结构体成员变量。在C语言,哈希是一种高效的数据结构,可以用于快速查询、删除和插入数据。 在使用哈希时,需要用一个结构体来示每一个键值对,其包括键和值两个属性。而ut_hash_handle hh就是用来处理这个结构体的键和值在哈希的存储问题,它定义了哈希键值对的索引和指针信息。 具体地说,ut_hash_handle hh在结构体的作用是:作为一个指向哈希索引节点的指针,指向该结构体在哈希的位置;同时,也作为哈希每一个节点的索引值,用于寻找和定位哈希的键值对。因此,在使用哈希时,ut_hash_handle hh是一个非常重要的结构体成员变量,需要仔细理解和管理。 ### 回答3: 在C语言,ut_hash_handle hh是一种数据结构,用于实现哈希。哈希是一种非常常用的数据结构,它可以用于将某个值(通常称之为键)与另一个值(通常称之为值)相关联。在哈希,键通常是唯一的,因此它们可以用来查找和访问相应的值。 在ut_hash_handle hh,hh是指哈希的一个指针,它指向一个哈希的条目。哈希的条目通常由一个结构体来示,该结构体包括键和值两个成员变量,以及一个指向下一个条目的指针。ut_hash_handle hh就是这个指向下一个条目的指针,它可以将条目组织成一个链,从而加快数据的查找和访问。 需要注意的是,ut_hash_handle hh并不是C语言的标准数据类型,它是由uthash这个开源库提供的。uthash是一个非常强大的哈希库,它提供了一系列的API函数,可以方便地实现哈希的插入、删除、查找等操作。如果需要使用ut_hash_handle hh来实现哈希,需要先安装uthash库,并在程序包含相应的头文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北海冥鱼未眠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值