hash表C语言实现

时间:2022-09-22 21:31:44

算法参考《算法导论》第11章散列表。采用链地址法解决冲突.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <strings.h>
/*通过链接法解决碰撞*/
typedef const char* hash_key_type;
typedef int hash_value_type;
typedef int (*hash_fun)(hash_key_type key);
typedef bool (*equal_fun)(hash_key_type keya, hash_key_type keyb); typedef struct list_node_tag {
hash_key_type key;
hash_value_type value;
struct list_node_tag *next;
} list_node; typedef struct hash_tag {
list_node **list_array;
int num;
hash_fun f;
equal_fun e;
} hash; hash *hash_create(int num, hash_fun f, equal_fun e){
hash *h = (hash*)malloc(sizeof(hash));
h->num = num;
h->f = f;
h->e = e;
h->list_array = (list_node**)calloc(sizeof(list_node*), num);
for (int i = 0; i < num; i++) {
h->list_array[i] = NULL;
}
return h;
} void hash_destroy(hash *h){
for (int i = 0; i < h->num; i++) {
for(list_node * p = h->list_array[i]; p != NULL; ){
list_node * q = p;
p = p -> next;
free(q);
}
};
free(h->list_array);
free(h);
} void hash_insert(hash *h, hash_key_type key, hash_value_type value){
list_node *x = (list_node*)malloc(sizeof(list_node));
x->key = key;
x->value = value;
int hval = h->f(key) % h->num;
x->next = h->list_array[hval];
h->list_array[hval] = x;
} bool hash_search(hash *h, hash_key_type key, hash_value_type *value){
int hval = h->f(key) % h->num;
list_node *x = h->list_array[hval];
while (x != NULL && !h->e(x->key, key)) {
x = x->next;
}
if(x != NULL){
*value = x->value;
return true;
} else {
return false;
}
} void hash_delete(hash *h, hash_key_type key){
int hval = h->f(key) % h->num;
list_node **head = &h->list_array[hval];
list_node *x = *head;
list_node *prev = NULL;
while(x != NULL && !h->e(x->key , key)){
prev = x;
x = x->next;
}
if(h->e(x->key, key)){
if(prev == NULL){
h->list_array[hval] = x->next;
} else {
prev->next = x->next;
}
free(x);
}
} int hash_key_fun(hash_key_type key){
const char *str = (const char*)key;
int seed = 131;
int hash = 0;
while (*str){
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
} typedef struct node_tag{
char *str;
struct node_tag *next;
} node; bool str_equal(const char *a, const char *b){
return strcmp(a, b) == 0;
} int main(){
hash *h = hash_create(10, hash_key_fun, str_equal);
const char *str[10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
for (int i = 0; i < 10; i++) {
printf("key:%s,value:%d\n", str[i], i);
hash_insert(h, str[i], i);
}
printf("\n");
for (int i = 0; i < 10; i++) {
int value;
bool result = hash_search(h, str[i], &value);
printf("查找关键字:%s的结果:%s,value:%d\n", str[i], result ? "true" : "false", value);
hash_delete(h, str[i]);
result = hash_search(h, str[i], &value);
printf("删除关键字:%s的结果:%s\n", str[i], result ? "false" : "true");
}
hash_destroy(h);
return 0;
}

hash表C语言实现的更多相关文章

  1. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  2. PHP数组&sol;Hash表的实现&sol;操作、PHP变量内核实现、PHP常量内核实现 - &lbrack; PHP内核学习 &rsqb;

    catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...

  3. 十一、从头到尾彻底解析Hash 表算法

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  4. NGINX&lpar;三&rpar;HASH表

    前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...

  5. 自己写一个 Hash 表

    项目地址:  https://github.com/kelin-xycs/HashTableLib 为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇, 不过最近 ...

  6. 经典递归问题&colon;0&comma;1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  7. Hash表及hash算法的分析

    Hash表中的一些原理/概念,及根据这些原理/概念: 一.       Hash表概念 二.       Hash构造函数的方法,及适用范围 三.       Hash处理冲突方法,各自特征 四.   ...

  8. C&plus;&plus; STL hash表用法

    C++ STL unordered_map用法 在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联 ...

  9. 四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据

    一.题目描述 找出数组中重复的数字 > 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...

随机推荐

  1. linux时间不同步问题

    怪问题: 时间同步失效 系统: centos 6.6  2.6.32-504.el6.x86_64 情况: 定时任务中写了每分钟同步一次系统时间,定时任务执行成功,时间却未同步,奇怪? 现象: [ro ...

  2. 老王Python培训视频教程(价值500元)【基础进阶项目篇 &ndash&semi; 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  3. HDU 4343 D - Interval query 二分贪心

    D - Interval queryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  4. 《JavaScript设计模式与开发实践》读书笔记之中介者模式

    1. 中介者模式 中介者模式的作用就是用来解除对象与对象之间的紧耦合关系,增加中介者后,所有相关对象都通过中介者来通信,而不再相互引用 1.1中介者模式的例子 以泡泡堂游戏为例,先定义一个玩家构造函数 ...

  5. Underscore&period;js 的模板功能介绍与应用

    Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能,需要了解的朋友可以详细参考下   U ...

  6. Service Fabric 与 Ocelot 集成

    概要 云应用程序通常都需要使用前端网关,为用户.设备或其他应用程序提供同一个入口点. 在 Service Fabric 中,网关可以是任意无状态服务(如 ASP.NET Core 应用程序) . 本文 ...

  7. VS 2013 professional版在win10上安装出错的解决方法

    VS 2013 professional版在win10上安装出错的解决方法 win10上安装完VS 2012 professional和VS 2017 professional后,由于项目的需要,要在 ...

  8. mongo 字段重命名

    执行语句 db.getCollection("A表").updateMany( {}, { $rename: { "A": "A1"} } ...

  9. mysqldump&colon; Got error&colon; 1066&colon; Not unique table&sol;alias

    mysqldump: Got error: 1066: Not unique table/alias myql 导出时提示如下: [root@localhost mysql]# mysqldump  ...

  10. 基础练习 FJ的字符串

    基础练习 FJ的字符串   时间限制:1.0s   内存限制:512.0MB        问题描述 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACAB ...