链式哈希表的实现

哈希算法一般用于快速查找和加密算法

chtbl.h

#ifndef CHTBL_H
#define CHTBL_H

#include <stdlib.h>

#include "list.h"

/* Define a structure for chained hash tables. */

typedef struct CHTbl_ {

int                buckets;

int                (*h)(const void *key);
int                (*match)(const void *key1, const void *key2);
void               (*destroy)(void *data);

int                size;
List               *table;

} CHTbl;

/* Public Interface. */

int chtbl_init(CHTbl *htbl, int buckets, int (*h)(const void *key), int
   (*match)(const void *key1, const void *key2), void (*destroy)(void *data));

void chtbl_destroy(CHTbl *htbl);

int chtbl_insert(CHTbl *htbl, const void *data);

int chtbl_remove(CHTbl *htbl, void **data);

int chtbl_lookup(const CHTbl *htbl, void **data);

#define chtbl_size(htbl) ((htbl)->size)

#endif

chtbl.m

#include <stdlib.h>
#include <string.h>

#include "list.h"
#include "chtbl.h"

/* chtbl_init */

int chtbl_init(CHTbl *htbl, int buckets, int (*h)(const void *key), int
   (*match)(const void *key1, const void *key2), void (*destroy)(void*data)) {

int                i;

/*Allocate space for the hash table.*/

if ((htbl->table = (List *)malloc(buckets * sizeof(List))) == NULL)
   return -1;

/*Initialize the buckets.*/

htbl->buckets = buckets;

for (i = 0; i < htbl->buckets; i++)
   list_init(&htbl->table[i], destroy);

/*Encapsulate the functions.*/

htbl->h = h;
htbl->match = match;
htbl->destroy = destroy;

/*Initialize the number of elements in the table.*/

htbl->size = 0;

return 0;

}

/* chtbl_destroy */

void chtbl_destroy(CHTbl *htbl) {

int                i;

/*Destroy each bucket.*/

for (i = 0; i < htbl->buckets; i++) {

   list_destroy(&htbl->table[i]);

}

/*Free the storage allocated for the hash table.*/

free(htbl->table);

/*No operations are allowed now, but clear the structure as a precaution.*/

memset(htbl, 0, sizeof(CHTbl));

return;

}

/* chtbl_insert */

int chtbl_insert(CHTbl *htbl, const void *data) {

void               *temp;

int                bucket,
                   retval;

/* Do nothing if the data is already in the table. */

temp = (void *)data;

if (chtbl_lookup(htbl, &temp) == 0)
   return 1;

/* Hash the key. */

bucket = htbl->h(data) % htbl->buckets;

/*Insert the data into the bucket.*/

if ((retval = list_ins_next(&htbl->table[bucket], NULL, data)) == 0)
   htbl->size++;

return retval;

}

/* chtbl_remove */

int chtbl_remove(CHTbl *htbl, void **data) {

ListElmt           *element,
                   *prev;

int                bucket;

/*Hash the key.*/

bucket = htbl->h(*data) % htbl->buckets;

/*Search for the data in the bucket.*/

prev = NULL;

for (element = list_head(&htbl->table[bucket]); element != NULL; element =
   list_next(element)) {

   if (htbl->match(*data, list_data(element))) {

      /*Remove the data from the bucket.*/

      if (list_rem_next(&htbl->table[bucket], prev, data) == 0) {

         htbl->size--;
         return 0;

         }

      else {

         return -1;

      }

   }

   prev = element;

}

/*Return that the data was not found.*/

return -1;

}

/* chtbl_lookup */

int chtbl_lookup(const CHTbl *htbl, void **data) {

ListElmt           *element;

int                bucket;

/*Hash the key.*/

bucket = htbl->h(*data) % htbl->buckets;

/*Search for the data in the bucket.*/

for (element = list_head(&htbl->table[bucket]); element != NULL; element =
   list_next(element)) {

   if (htbl->match(*data, list_data(element))) {

      /*Pass back the data from the table.*/

      *data = list_data(element);
      return 0;

   }

}

/*Return that the data was not found.*/

return -1;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值