hash表C语言实现
算法参考《算法导论》第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语言实现的更多相关文章
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
- PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]
catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- NGINX(三)HASH表
前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...
- 自己写一个 Hash 表
项目地址: https://github.com/kelin-xycs/HashTableLib 为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇, 不过最近 ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- Hash表及hash算法的分析
Hash表中的一些原理/概念,及根据这些原理/概念: 一. Hash表概念 二. Hash构造函数的方法,及适用范围 三. Hash处理冲突方法,各自特征 四. ...
- C++ STL hash表用法
C++ STL unordered_map用法 在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联 ...
- 四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据
一.题目描述 找出数组中重复的数字 > 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
随机推荐
- linux的帮助信息获取以及man章节的划分
linux的帮助信息获取以及man章节的划分 linux 帮助 man 章节 linux 获取帮助的途径 (1)help (2)man (3)info command在线获取 (4)程序自带帮助文档 ...
- 通过form表单获取值
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 突破php的imagecopyresampled 和imagecopyresized 实现图片马JPG
编辑器加载中...之前有人发布了 利用PNG 图片上述压缩函数的方法 原理利用 PNG的结构IDAT chunks填充一句话webshell,并进行一套取模运算 详见: https://www.ido ...
- 《精通C#》第十二章 Linq
Linq是在.Net3.5之后首次引入的,这种查询语言简单易学,可用范围非常广泛在学着之前,一直用在数据库操作之上,但是在学习这节课之后才发现,凡是实现泛型的接口类型都可以使用linq,简单来说就是实 ...
- mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --> <settings ...
- php知识分享
PHP 获取ip地址代码汇总 ...
- visio个人专注
字体颜色 1 填充 2 标注 3 箭头 4 线条 5 粗细 6
- 使用AXIS2客户端调用 WEBSERVICE
问题 在调用WEBSERVICE时,可以使用wsdl2java生成java代码,调用接口,这种方法在接口固定的情况下是一种不错的选择,如果需要动态调用接口,那么这样就行不通了. 解决办法 1.直接构建 ...
- 大数的除法 不使用BigInteger Java实现
import java.util.Arrays; public class Solution { public void div(String a, String b) { char[] chara ...
- [转载]什么是FCKeditor?功能强大的HTML编辑器!
天天在用FCKeditor写博客,但一直不清楚FCKeditor到底是什么,今天终于找到了一些相关的资料,大家一起来分享下. FCKeditor文本编辑程序(共享软件)为用户提供在线的文档编辑服务,其 ...