glibc中的简单的哈希表编程

本文详细探讨了glibc中哈希表的实现原理,包括哈希函数的选择、冲突解决策略、动态扩容机制等关键点,旨在帮助读者深入掌握哈希表在C库中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*主要用到的函数:*/



创建哈希表
int hcreate_r (size_t __nel, struct hsearch_data *__htab);

查询哈希表

int hsearch_r (ENTRY __item, ACTION __action, ENTRY **__retval,struct hsearch_data *__htab) __THROW;

销毁哈希表

void hdestroy_r (struct hsearch_data *__htab) __THROW;







例子:


#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* for memset() */
#include <errno.h>
#define __USE_GNU /* for reentrant functions hsearch_r etc. */
#include <search.h>


char *data[] = { "alpha", "bravo", "charlie", "delta",
                 "echo", "foxtrot", "golf", "hotel", "india", "juliet",
                 "kilo", "lima", "mike", "november", "oscar", "papa",
                 "quebec", "romeo", "sierra", "tango", "uniform",
                 "victor", "whisky", "x-ray", "yankee", "zulu"
};


#define INIT_TABLE_SIZE ((size_t) 128)


int main(void) {
  ENTRY e;
  ENTRY* search_result;
  int ret;
  int i;
  struct hsearch_data tab;


  memset(&tab, 0, sizeof(tab));
 
  ret = hcreate_r(sizeof(data), &tab);
  if(!ret) { 
    if(errno == ENOMEM) { 
      printf("NOMEM\n");
    }
    printf("ERROR\n");
    return 0;
  }
  /* REGISTER DATA */
  for(i = 0; i < 24; i++) {
    e.key = data[i];
    e.data = (void*)i;
    ret = hsearch_r(e, ENTER, &search_result, &tab);
    if(ret == 0) {
      printf("Hash table is full\n");
      return 0;
    }
    printf("Registered %s:%d\n", e.key, (int)e.data);
  }
  
  for (i = 22; i < 24; i++) {
    e.key = data[i];
    ret = hsearch_r(e, FIND, &search_result, &tab);
    printf("%s : %s:%d\n", e.key,
           ret ? search_result->key : "NULL", ret ? (int)(search_result->data) : 0);
  }
  /* SEARCH TEST: NO HIT */
  e.key = data[24];
  ret = hsearch_r(e, FIND, &search_result, &tab);
  printf("%s : %s:%d\n", e.key,
         ret ? search_result->key : "NULL", ret ? (int)(search_result->data) : 0);
  
  return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值