c/c++ 哈希表 hashtable
c/c++ 哈希表 hashtable
概念:用key去查找value
实现hash函数有很多方法,本文用除留余数法。
除留余数法的概念:
取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不均匀
发生冲突时,用链地址法解决
图形入图:

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <stdbool.h>
#define ElemType int
#define P 13
typedef struct HashNode{
ElemType data;
struct HashNode* link;
}HashNode;
typedef HashNode* HashTable[P];
void init_hash(HashTable ht){
for(int i = 0; i < P; ++i){
ht[i] = NULL;
}
}
int hash(ElemType key){
return key % P;
}
void insert_hash_table(HashTable ht, ElemType x){
int index = hash(x);
HashNode* s = (HashNode*)malloc(sizeof(HashNode));
assert(s != NULL);
s->data = x;
//头插
s->link = ht[index];
ht[index] = s;
}
void show_hash_table(HashTable ht){
for(int i = 0; i < P; ++i){
printf("%d: ", i);
HashNode* p = ht[i];
while(NULL != p){
printf("%d->", p->data);
p = p->link;
}
printf("Nul.\n");
}
}
HashNode* search_hash_table(HashTable ht, ElemType x){
int index = hash(x);
HashNode* p = ht[index];
while(NULL != p && p->data != x){
p = p->link;
}
return p;
}
bool remove_hash_node(HashTable ht, ElemType x){
HashNode* p = search_hash_table(ht, x);
if(NULL == p)return false;
int index = hash(x);
HashNode* q = ht[index];
if(p == q){
ht[index] = p->link;
free(p);
return true;
}
while(q->link != p){
q = q->link;
}
q->link = p->link;
free(p);
return true;
}
int main(){
HashTable ht;
init_hash(ht);
ElemType ar[] = {19,14,23,1,68,20,84,27,55,11,10,79};
int n = sizeof(ar) / sizeof(ElemType);
for(int i = 0; i < n; ++i){
insert_hash_table(ht, ar[i]);
}
show_hash_table(ht);
ElemType key = 68;
HashNode* p = search_hash_table(ht, key);
if(NULL != p){
printf("%d\n", p->data);
}
remove_hash_node(ht, key);
show_hash_table(ht);
return 0;
}
c/c++ 哈希表 hashtable的更多相关文章
- 哈希表(hashtable)的javascript简单实现
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
- 哈希表(Hashtable)简述
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- 转 C#中哈希表(HashTable)的用法详解
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...
- C# 哈希表HashTable的简单使用
本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...
- C#中哈希表(HashTable)的用法详解
描述: 哈希表存放 key.values ,key值可以用于快速调取用,values 对应object类型,也就是说所有类型. 实例: 1.HashTable存放学生的成绩 Hashtable ht1 ...
- [PHP] PHP数组的实现哈希表(HashTable)结构
PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...
- java——哈希表 HashTable
在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...
随机推荐
- 流式大数据计算实践(2)----Hadoop集群和Zookeeper
一.前言 1.上一文搭建好了Hadoop单机模式,这一文继续搭建Hadoop集群 二.搭建Hadoop集群 1.根据上文的流程得到两台单机模式的机器,并保证两台单机模式正常启动,记得第二台机器core ...
- 基于vue技术的企业移动办公系统的设计与实现
如何打包: http://www.cnblogs.com/smilehuanxiao/p/7693858.html http://www.cnblogs.com/1314y/p/6207153.htm ...
- #2 Python面向对象(一)
前言 对于萌新来说,面向对象,这是一个很陌生的词语.如果你接触过Linux,你一定知道“一切皆文件”,也就是说,在Linux中所有都是文件,鼠标是文件.键盘是文件.目录是文件等等一切都是文件:Pyth ...
- 翻译:XtraDB/InnoDB中的AUTO_INCREMENT处理方式(已提交到MariaDB官方手册)
本文为mariadb官方手册:XtraDB/InnoDB中的AUTO_INCREMENT处理方式的译文. 原文:https://mariadb.com/kb/en/auto_increment-han ...
- SpringBoot系列——WebSocket
关于websocket的介绍与实现,我之前写过一篇博客,记录了用springboot-websocket实现了私聊.群聊的简单实例,这里就只提供一个入口,不再重复的写了,WebSocket+Java ...
- [转]Docker和Rancher的安装与基本使用
本文转自:https://blog.csdn.net/wangshouhan/article/details/80405672 一.Docker1.CentOS下Docker安装 安装 $ yum - ...
- 第一册:lesson seventeen。
原文:How do ;you do? A:Come and meet our employees,Mr.B. B:Thank you Mr.A. A:This is ...and this is .. ...
- SharedPreferences存储读取数据
存储 //创建SharedPreferences 存储用户名SharedPreferences sharedPreferences = getSharedPreferences("name& ...
- 在SoapUI中模拟用户操作
SoapUI作为一款接口测试工具,具有极大的灵活性和拓展性.它可以通过安装插件,拓展其功能.Selenium作为一款Web自动化测试插件可以很好的与SoapUI进行集成.如果要在SoapUI中模拟用户 ...
- MyBatis学习笔记(二) Executor
一.概述 当我们打开一个SqlSession的时候,我们就完成了操作数据库的第一步,那MyBatis是如何执行Sql的呢?其实MyBatis的增删改查都是通过Executor执行的,Executor和 ...