算法参考《算法导论》第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数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]

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

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

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

  4. NGINX(三)HASH表

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

  5. 自己写一个 Hash 表

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

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

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

  7. Hash表及hash算法的分析

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

  8. C++ STL hash表用法

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

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

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

随机推荐

  1. MP3光标移动

    #include<iostream> #include<string.h> using namespace std; int main() { int N; cin>&g ...

  2. js组合继承和寄生组合式继承比较

    本文是原创文章,如需转载,请注明文章出处 1.js中实现组合继承(B继承A): function A(name){ this.name = name; this.ary = ["AA&quo ...

  3. Brew安装MacVim

    brew install macvim --with-cscope --with-lua --with-python cscope lua python支持 附一些简单的brew命令 查看brew的帮 ...

  4. Python’s SQLAlchemy vs Other ORMs[转发 2]Storm

    Storm Storm is a Python ORM that maps objects between one or more databases and Python. It allows de ...

  5. 关于css

    已经学了四天的css.现在对于css的了解还很肤浅,首先,我对基础的还不是很了解. 级联样式表(Cascading Style Sheet)简称“CSS”,通常又称为“风格样式表(Style Shee ...

  6. jquery validate表单验证插件

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.     1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素  3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...

  7. React Native 获取网络数据

    getMoviesFromApiAsync() { return fetch('http://facebook.github.io/react-native/movies.json') .then(( ...

  8. Python自动化测试 (九)urllib2 发送HTTP Request

    urllib2 是Python自带的标准模块, 用来发送HTTP Request的.  类似于 .NET中的,  HttpWebRequest类 urllib2 的优点 Python urllib2 ...

  9. BZOJ AC800纪念

    貌似没什么好纪念的...QAQQQ 好不容易水到了800还是记录一下好了....不过感觉水这么多题没有意义啊[思考熊] 然后就没有然后了恩 不过我到底是为什么才努力的呢...前途一阵迷茫,根本没有什么 ...

  10. 使用C++11的一点总结

          C++11已不是新鲜技术,但对于我来说,工作中用得还不够多(前东家长时间使用gcc3.4.5,虽然去年升了4.8.2,但旧模块维护还是3.4.5居多:新东家用的是4.4.6,不能完整支持C ...