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 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
随机推荐
- Java_ToolKit用法
转自:http://blog.sina.com.cn/s/blog_9e4556250100z5kv.html 此类是所有 Abstract Window Toolkit 实际实现的抽象超类.Tool ...
- [sqoop1.99.7] sqoop入门-下载、安装、运行和常用命令
一.简介 Apache Sqoop is a tool designed for efficiently transferring data betweeen structured, semi-str ...
- Git代码管理常用命令
1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git查看远程仓库:$ git remote -v添加远程仓库:$ git re ...
- Unity 3D 正交相机(Orthographic)
1. Camera.aspect 表示摄像机显示区域的纵横比.宽高比,摄像机初始化的时候会默认设置成当前屏幕的宽高比,可以更改,也可以通过 Camera.ResetAspect 来重置. 2. Cam ...
- MVC5 Entity Framework学习之Entity Framework高级功能(转)
在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...
- 定位 position: absolute & relative
[position:absolute] 意思是绝对定位,他默认参照浏览器的左上角,配合TOP.RIGHT.BOTTOM.LEFT(下面简称TRBL)进行定位,有以下属性: 1)如果没有TRBL,以父级 ...
- 动态加载zTree,用key属性设置url链接、icon图标等
setting 举例 1. 设置 zTree 显示节点时,将 treeNode 的 xUrl 属性当做节点链接的目标 URL var setting = { data: { key: { url: ...
- How to Develop blade and soul Skills
How to Develop Skills Each skill can be improved for variation effects. Some will boost more strengt ...
- UIScrollView内容缩放
•有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理 也就是说,要完成缩放功能的话,只需要将需要缩放的内容添加到UIScr ...
- Android中ListView的各种显示效果
在android应用开发中,ListView是使用频率非常高的一个组件,基本上稍微复杂点的布局都会用到它,利用它可以让你的界面美观,有层次 .ListView可以用来作为数据显示的容器,也可以作为界面 ...