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的更多相关文章

  1. 哈希表(hashtable)的javascript简单实现

    javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...

  2. 哈希表(Hashtable)简述

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...

  3. C#中哈希表(HashTable)的用法详解以及和Dictionary比较

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  4. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  5. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...

  6. C# 哈希表HashTable的简单使用

    本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...

  7. C#中哈希表(HashTable)的用法详解

    描述: 哈希表存放 key.values ,key值可以用于快速调取用,values 对应object类型,也就是说所有类型. 实例: 1.HashTable存放学生的成绩 Hashtable ht1 ...

  8. [PHP] PHP数组的实现哈希表(HashTable)结构

    PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...

  9. java——哈希表 HashTable

    在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...

随机推荐

  1. 【原创】VirtualBox 磁盘扩容教程

    问题和环境说明 环境: 主机:Ubuntu 15.10 客户机:Windows 7 x64 VirtualBox:5.0.10 虚拟机磁盘类型:VDI(VirtualBox磁盘映像) 问题: 在虚拟机 ...

  2. spring-boot(七) 随机端口

    学习文章:springboot小技巧 随机端口 为Spring Cloud的应用实用随机端口非常简单,主要有两种方法: 设置server.port=0,当应用启动的时候会自动的分配一个随机端口,但是该 ...

  3. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

  4. AngularJs_自定义注入对象_笔记1

    A-自定义控件示例: 我的自定义控件文件为:angular-seagull2-common.js (function (window, angular) { 'use strict'; $urlPro ...

  5. C#操作DataReader类

    一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度 FieldCount 获取当前行中的列数 HasRows 获取一个值,该值指示 SqlDataReader 是否有行 IsC ...

  6. thinkphp3.2模块名如何不区分大小写?

    thinkphp3.2中已配置:'URL_CASE_INSENSITIVE' => true,对于控制器及操作名大小写都可以,但仍对于模块名的大小写就运行机制出错,比如:http://www.x ...

  7. Android 实现倒计时操作

    new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { } @Overri ...

  8. CSS实现两列布局,一列固定宽度,一列宽度自适应方法

    不管是左是右,反正就是一边宽度固定,一边宽度自适应. 博客园的很多主题也是这样设计的,我的博客也是右侧固定宽度,左侧自适应屏幕的布局方式. html代码: <div id="wrap& ...

  9. jQuery插件开发进阶

    jQuery插件开发模式 软件开发过程中是需要一定的设计模式来指导开发的,有了模式,我们就能更好地组织我们的代码,并且从这些前人总结出来的模式中学到很多好的实践. 根据<jQuery高级编程&g ...

  10. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...