glibc中的簡單的哈希表編程

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


創建哈希表
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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章