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. 【整理】WDK 和 DDK异同

    WDK和DDK的作用 开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发 WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WIND ...

  2. Linux下获取java堆栈文件并进行分析

    当服务器内存飙升或者cpu负载飙升的时候,可以使用如下步骤排查问题: 1.终端输入top命令,键盘大写的情况下按P(cpu负载率从高到低排序)或者M(内存使用率从高到低排序),可以查看导致cpu或者内 ...

  3. ARM 汇编指令 ADR 与 LDR 使用

    简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令.可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR ...

  4. python下载安装requests库

    一.python下载安装requests库 1.到git下载源码zip源码https://github.com/requests/requests 2.解压到python目录下: 3.“win+R”进 ...

  5. popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案

    // 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...

  6. 【转载】MySql新建账号并分配权限

    在服务器的MySQL运维过程中,我们有时会遇到新建MySql账号的情况,要求新建的账号只允许某些特定的数据库操作权限,只能访问到特定的数据库,实现数据库权限的严格管理,以下以MySQL-Front管理 ...

  7. C#语言中字段和属性相关知识剖析

    针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...

  8. [日常] HTTP连接管理

    HTTP连接管理: 1.误解的Connection首部 当http报文经过中间客户端到服务端中间的各种代理设备时,对标签中列出的头信息进行删除,close是事务结束后关掉此条连接 2.消除串行化的时延 ...

  9. [日常] HTTP协议状态码

    100-199 信息性状态码 100 continue 请继续 101 switching protocols 切换协议,返回upgraded头 200-299 成功状态码 200 ok 201 cr ...

  10. 46.Linux-创建rc红外遥控平台设备,实现重复功能(2)

    上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1) 在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platf ...