算法参考《算法导论》第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. SPSS数据分析—多维偏好分析(MPA)

    之前的主成分分析和因子分析中,收集的变量数据都是连续型数值,但有时会碰到分类数据的情况,我们知道最优尺度变换可以对分类变量进行量化处理,如果将这一方法和主成分分析相结合,就称为了基于最优尺度变换的主成 ...

  2. activitygroup下的activity不回调onactivityresult的解决方法

    就是activitygroup下的子activity启动第三方activity的时候需要通过getparent的startactivityforresult方法来启动.getparent其实就是这个a ...

  3. Web开发中管理ipad屏幕的方向变化

    Web开发中,我们会遇到在手机垂直或水平视角时展示不同状态的情况.下面我来总结一下检测移动设备方向变化的一些方法. 1 使用javascript 直接看代码: <script type=&quo ...

  4. 很重要的vue的生命周期

  5. css个人总结

    1.什么是css,指的是叠层样式表,控制网页的的外观显示. 2.引入css的三种方式,外部链接,内部链接,内联,分别的语法是,<link rel="stylesheec" t ...

  6. F2工作流引擎之组织用户模型(四)

    1 概述 工作流组织模型是工作流引擎中核心重要的一部份,是实现人机交互中不可或缺的组成部分,而由于工作流引擎需要适应不同的系统之间存在组织用户结构的不同, 如组织表中字段名不同,所以需要实现适应不同系 ...

  7. php学习笔记之wamp安装配置

    一.下载apache.php.mariadb apache 下载地址:http://www.apachehaus.com/cgi-bin/download.plx VC9版本分为:32位版.64位版. ...

  8. Spring 定时器的使用

    spring定时器应用 相关类: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean 配置定时远行方法 o ...

  9. PHP文件的读取

    1.PHP部分文件操作函数 ( fopen ,fread ,filesize,fwrite,fclose ) 2.unlink()  rmdir() 删除函数 unlink(路径和文件名): rmdi ...

  10. PHP基础教程-54课-问题

    question: $arr = array(1,2,3,4); /*如何通过foreach 将数组变成 $arr = arry(2,4,6,8) */ 起初用: $arr = array(1,2,3 ...