C语言哈希表的简单实现——数组+链表(拉链法)

1.哈希表简介

哈希表详细介绍可以参考这篇文章

2.哈希表拉链法实现

2.1完全由本人思路实现,如有错误,欢迎批评指正

哈希声明文件hash.h

/* 哈希表
*  by  : I'M渣渣
*  date: 2021.5.11
*/#ifndef __HASH_H_
#define __HASH_H_#define size 100  //哈希数组大小为100
#include <stdbool.h> //C语言使用bool类型需要调用的头文件
#include <stdio.h>
#include <stdlib.h>//创建哈希结构体
typedef struct hash_value_{int _int_key;double _double_key;float _float_key;char _char_key;char *_str_key;int _int;double _double;float _float;char _char;char *_str;struct hash_value_ * _hash_value_next;
}hash_value;
//创建hash_value指针数组
hash_value *hash_arry[size];void hash_default(hash_value *hash_arry_[]); //哈希数组初始化
int hash_int(int key);
int hash_double(double key);          //哈希函数
int hash_float(float key);
int hash_char(char key);
int hash_charstr(char *key);
bool add_mod_key_value_int(int key,int value); //添加与修改 <int key,int value>
int get_key_value_int(int key); //获取value <int key>
bool add_mod_key_value_charstr_int(char *key,int value);//添加与修改 <str key,int value>
int get_key_value_charstr_int(char *key);//获取value <str value>
#endif // !__HASH_H_

哈希实现hash.c

/* 哈希表
*  by  : I'M渣渣
*  date: 2021.5.11
*/
#include "hash.h"
#include "string.h"//初始化指针数组,全部赋值为空
void hash_default(hash_value *hash_arry_[]){for(int i=0;i<size;++i){hash_arry_[i]=NULL;}
}//创建哈希函数,返回哈希值
int hash_int(int key){return key%size;
}
int hash_double(double key){return (int)key%size;
}
int hash_float(float key){return (int)key%size;
}
int hash_char(char key){return (int)key%size;
}
int hash_charstr(char *key){int x=0;int i=0;while(*(key+i)!='\0'){x=x+(int)(*key);i++;}return x%size;
}//添加操作
bool add_mod_key_value_int(int key,int value){hash_value *head=hash_arry[hash_int(key)];hash_value *p=NULL;while(head){if(key==head->_int_key){head->_int=value;break;}if(head->_hash_value_next==NULL) break; if(key>head->_int_key&&key<head->_hash_value_next->_int_key) break;head=head->_hash_value_next;}hash_value *V=(hash_value *)malloc(sizeof(hash_value));if(head==NULL) {V->_int_key           = key;V->_int               = value;V->_hash_value_next   = NULL;//这里为初始指针赋值,初始数组里初始为NULL,不能用headhash_arry[hash_int(key)]=V;}else {V->_int_key           = key;V->_int               = value;p                     = head->_hash_value_next;head->_hash_value_next= V;V->_hash_value_next   = p;  } return true;
}
//获取value值
int get_key_value_int(int key){int *x;x=(int *)malloc(2*sizeof(int));hash_value *head=hash_arry[hash_int(key)];while(head){if(key==head->_int_key){return head->_int;} if(key>head->_int_key&&key<head->_hash_value_next->_int_key){return -1;}head=head->_hash_value_next;}return -1;
}bool add_mod_key_value_charstr_int(char *key,int value){hash_value *head=hash_arry[hash_charstr(key)];hash_value *p=NULL;while(head){if(strcmp(key,head->_str_key)){head->_int=value;break;}if(head->_hash_value_next==NULL) break; head=head->_hash_value_next;}hash_value *V=(hash_value *)malloc(sizeof(hash_value));if(head==NULL) {V->_str_key           = key;V->_int               = value;V->_hash_value_next   = NULL;hash_arry[hash_charstr(key)]=V;}else {V->_str_key           = key;V->_int               = value;p                     = head->_hash_value_next;head->_hash_value_next= V;V->_hash_value_next   = p;  } return true;
}
int get_key_value_charstr_int(char *key){int *x;x=(int *)malloc(2*sizeof(int));hash_value *head=hash_arry[hash_charstr(key)];while(head){if(strcmp(key,head->_str_key)==0){return head->_int;}head=head->_hash_value_next;}return -1;
}

测试文件main.c

/* 哈希表
*  by  : I'M渣渣
*  date: 2021.5.11
*/
#include "hash.h"
#include "stdio.h"int main(int argc,char *argv[]){int arry_key[10000];int arry[10000];    char *arrystr[10]={//字符串一定要用,号隔开"agcdef","dasdawenei","liasdawxuan","apple","yiyaasdwen","asdwert","laasdnshasdu","chenchegfhfghng","qwe","rrrr",};int arrystrint[10];hash_default(hash_arry);printf("**********\n");/*for(int i=0;i<10000;++i){arry_key[i]=i;arry[i]=i;add_mod_key_value_int(arry_key[i],arry[i]);}while (1){int x;scanf("%d",&x);printf("key:%d,value:%d\n",x,get_key_value_int(x));}*/printf("**********\n");for(int i=0;i<10;++i){arrystrint[i]=i;//printf("\n%s",*(arrystr+i));add_mod_key_value_charstr_int(*(arrystr+i),arrystrint[i]);//printf("&&&\n");}printf("**********\n");while (1){char x[1024];//字符串键入要有一定的内存大小,不能char *xscanf("%s",x);//printf("%s",x);printf("key:%s,value:%d\n",x,get_key_value_charstr_int(x));}return 0;
}

C语言哈希表的简单实现——数组+链表(拉链法)相关推荐

  1. 哈希表(闭散列、拉链法--哈希桶)

    哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构.它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据. 关于哈希表,主要为以下几个方面: 一.哈希表 ...

  2. 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时:ASL =1n\frac{1}{n}n1​ ∑i=1 ...

  3. c语言哈希表电子辞典_关于redis涉及的知识点,C语言如何操作redis

    redis是什么? redis是一个由 Salvatore Sanfilippo 写的 key-value 存储系 统.Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网 ...

  4. c语言哈希表电子辞典_C语言实现的哈希表实现程序

    下面我们一起来看一个C语言实现的哈希表实现程序了,这个程序没有过多的说明只是一个例子,大家有兴趣可以进入看看或测试一下. 为了巩固一下链表知识,自己实现的一个哈希表,在GCC 4.4.7下编译通过: ...

  5. LeetCode 2423. Remove Letter To Equalize Frequency【哈希表】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...

  6. 剑指 Offer II 114. 外星文字典(困难 图 bfs 哈希表 拓扑排序 字符串 数组)

    剑指 Offer II 114. 外星文字典 现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同. 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按 ...

  7. 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法

    本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...

  8. C语言,功能一、利用一维数组和选择法对成绩高低排序,功能二、输出对应的学号,功能三、查找对应学生成绩

    声明:该编译器为vs,所以输入函数写为scanf_s形式! 1.顺序查找 (1)主要在线性表中进行查找,顺序查找通常分为对一般的无序线性表(无序表)的顺序查找和对按关键字有序的顺序表(有序表)的顺序查 ...

  9. stl 基于哈希的map c++_关于哈希表,你该了解这些!

    (给算法爱好者加星标,修炼编程内功) 来源:代码随想录(本文来自作者投稿) 哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道 ...

最新文章

  1. Node.js与Sails~方法拦截器policies
  2. Centos7安装Nginx+PHP
  3. 【正一专栏】欧冠决赛点评——只服齐达内,送别布冯
  4. linux同名文件夹覆盖_第一天:Linux——复习
  5. 取消java相关网络协议_java相关网络协议可以关掉吗
  6. SAP CRM WebClient UI Home page里Workflow task retrieve logic
  7. 变结构滑模控制抖振处理(1)------动态滑模法
  8. 扫描控件Web在线Applet
  9. 关于IEnumeratorT泛型枚举器 和 IEnumerableT
  10. 利用递归分割(Split)字符串
  11. 【Tips小技巧】电脑全屏截图网页滚动截图
  12. 微信公众号排版方法及相关素材网站
  13. 时间序列预测 | Python实现GAN时间序列数据生成建模
  14. 网页版在线使用PS网站源码
  15. 动态调度之记分牌算法
  16. 腾讯华为签署《深圳市APP个人信息保护自律承诺书》举措新解读
  17. Ruby gem的proxy代理设置方法
  18. OpenGL 灰度图
  19. 数据结构基础--搜索树
  20. Hyperlynx DDR SI 仿真分析技术 | IBIS 模型适配

热门文章

  1. 在线作图丨绘制一个含饼图的组内网络分析图(Network Analysis)
  2. iMeta | 第1卷第1期在线正式发布(2022/3/28)
  3. 《微生物学报》“微生物大数据资源”专刊邀稿函
  4. 宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)
  5. 用circlize包绘制circos-plot
  6. 扩增子统计绘图6韦恩图:比较组间共有和特有OTU或分类单元
  7. R语言中使用pkgbuild::find_rtools查看是否有Rtools、使用Sys.which函数查看make是否存在、如果没有则安装、使用writeLines函数绑定R和Rtools
  8. pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows date index between a certain date interval)
  9. python中使用squarify包可视化treemap图:使用treemap图可视化个人或者集体的股票、基金的持仓结构(treemap with squarify package)
  10. pandas使用date_range函数按照指定的频率(freq)和指定的个数(periods)生成dataframe的时间格式数据列、基于dataframe的日期数据列生成日期索引