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 ...
随机推荐
- eclipse使用maven打包的时候发现静态资源没包含进去
今天在打包的时候,发现传上去的包里没有配置静态资源. (右键项目--->Run As ---> 8 Maven install ) 后来发现是因为在pom.xml里没有配置打包静态资源的 ...
- [转]phpredis中文手册
本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...
- for循环中变量的作用域问题
看下面这一行代码 for (let i = 0; i < 3; i++) { let i = 'abc' console.log(i) } // abc // abc // abc 从上面可以看 ...
- AFNetworking封装-项目使用
本篇博客是接着上一篇AFNetworking源码解析的后续,如果想对AFNetworking源码有所了解. 请读一下https://www.cnblogs.com/guohai-stronger/p/ ...
- sql存储过程,根据多个条件查询,返回一个dataTable或者DataSet
不废话,先直接代码 首先sql部分(我在这里加了一个@zx作为判断,一般不需要这个参数): ALTER Proc [dbo].[Proc_Boss_Show] ),--开始条数 ),--结束条数 @S ...
- [转]centos6.5修改yum安装的mysql默认目录
本文转自:https://www.cnblogs.com/fefjay/p/6044444.html 0.说明 Linux下更改yum默认安装的mysql路径datadir.linux下,MySQL默 ...
- 7. Callable 创建线程的方式三
package com.gf.demo06; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionEx ...
- sqoop将mysql数据导入hbase、hive的常见异常处理
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10700700.html,否则将追究法律责任!!! 一.需求: 1.将以下这张表(test_ ...
- 面试必会之HashMap源码分析
相关文章 面试必会之ArrayList源码分析 面试必会之LinkedList源码分析 简介 HashMap最早出现在JDK1.2中,底层基于散列算法实现.HashMap 允许 null 键和 nul ...
- js对象工厂函数与构造函数
转自:http://www.cnblogs.com/Jener/p/5920963.html ★概述: 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而 ...