哈希表的简单实现

下面这个散列表的实现来自K&R,很经典。在其他场景中遇到的实现更复杂,基本原理不变,只是在hash算法,或者在快速查询上做了优化。

#include <stdio.h>

#include <stdlib.h>

//具有相同hash值构成的链表

struct nlist{

struct nlist
* next;

char * name;  //key-定义的名字

char * defn;  //value-替换文本

};

#define HASHSIZE 101  //桶的大小

static struct nlist
*hashtable[HASHSIZE]; //hash table

//字符串hash函数

unsigned hashchar *s){

unsigned hashval;

for(hashval
= 0; s != ‘\0‘; s++)

hashval = *s + hashval * 31; //the seed can
be 1313,131313 etc..

return hashval
% HASHSIZE;

}

//查找函数,在 hashtable中找字符串s所在的bucket

struct nlist *lookupchar *s){

struct nlist
*np;

for(np
= hashtable[hash(s)]; np; np = np-> next)

if (strcmp(s,
np->name ) == 0)

return np;

return NULL;

}

//加入函数,将(name, defn)加入到 hashtable中,如果已经存在则更新

//如果无足够空间申请表项则返回空

struct nlist *installchar *name, char *defn){

struct nlist
*np;

unsigned hashval;

if((np
= lookup(name)) == NULL){ //要插入的key不存在

np = ( struct nlist
*)malloc( sizeofstruct nlist));

if (np
== NULL || (np-> name =
strdup(name)) == NULL)

return NULL;

hashval = hash(name);

//放入相应的桶中

np-> next =
hashtable[hashval];

hashtable[hashval] = np;

else{ //已存在,则更新

free(( void *)np->defn );

}

//最后统一处理 value

if((np-> defn =
strdup(defn) ) == NULL)

return NULL;

return np;

}

//从哈希表中删除一个key-value

void undefchar *s){

unsigned h;

struct nlist
*prev, *np;

prev = NULL;

h = hash(s);

for(np
= hashtable[h]; np != NULL; np = np-> next){

if (strcmp(s,
np->name ) == 0)

break ; //找到相应的结点

prev = np; // 保留目标结点的前一个结点

}

if(np
!= NULL){

if (prev
== NULL) //说明要删除的是桶的第一个成员

hashtable[h] = np-> next;

else

prev-> next =
np-> next;

free(( void *)np->name ); //切记要分别释放

free(( void *)np->defn );

free(( void *)np);

}

}

哈希表的简单实现,布布扣,bubuko.com

时间: 2024-10-25 21:35:44

哈希表的简单实现的相关文章

哈希表的简单操作

哈希表中,关键值通过哈希函数映射到数组上,查找时通过关键值直接访问数组.哈希表的关键问题在于哈希函数的构造和解决冲突的方法. 下面采用最简单的线性探测展示一下哈希表的基本操作: 1 //Hashtable 2 class HashTable { 3 private: 4 string *elem; 5 int size; 6 public: 7 HashTable() { 8 size = 2000; 9 elem = new string[size]; 10 for (int i = 0; i

普通集合和泛型集合的区别,哈希表和字典表的区别,队列和堆栈的区别以及堆和栈的区别。

普通集合和泛型集合的区别: 泛型集合与传统集合相比 类型更安全. 泛型集合无需装箱拆箱操作. 泛型的重要性. 泛型是未来五年的主流技术 ... 通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱. 下面的泛型类型对应于现有的集合类型: List 是对应于 ArrayList 的泛型类. Di

哈希表应用

在C#中应用哈希表(Hashtable) 2006-05-24 15:16 491人阅读 评论(0) 收藏 举报 c#stringobjectsystemclass.net 一.哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中key/value

c#哈希表的用法

一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对. 二,哈希表的简单操作 在哈希表中添加一个key/value键值对:Hashta

[转]net中哈希表的使用 Hashtable

本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 Hashtable to store cached parametersprivate static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); ... //缓存数据string cacheKey = "xxxx&q

C语言实现的哈希表

C语言实现的哈希表哈希表可以简单理解为多个链表的集合,将每个新的成员根据其哈希值进行分类,这样可以加快链表的查找速度参考:https://www.cnblogs.com/s-b-b/p/6208565.html #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 10 typedef unsigned int uint; /*定义一个链表的节点*/ typedef str

数据结构 - 哈希表

哈希表 1. 哈希表的引入 1.1 哈希表的简单概述   哈希表一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作 (高效的操作):python中的字典是通过哈希表实现的 insert(key, value):插入键值对(key,value) get(key):如果存在键为key的键值对则返回其value,否则返回空值 delete(key):删除键为key的键值对  1.2.直接寻址表 当关键字的key 的 全域U(关键字可能出现的范围)比较小时,直接寻址是一种简单而有效的方法 存

来吧!一文彻底搞定哈希表!

哈希表是个啥? 小白: 庆哥,什么是哈希表?这个哈希好熟悉,记得好像有HashMap和HashTable之类的吧,这是一样的嘛??? 庆哥: 这个哈希确实经常见??,足以说明它是个使用非常频繁的玩意儿,而且像你说的HashMap和HashTable之类的与哈希这个词肯定是有关系的,那哈希是个啥玩意啊,这个咱们还是得先来搞明白啥是个哈希表.?? 我们看看百科解释吧: 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的

【算法导论】简单哈希表的除法实现

哈希表,又名散列表,hashtable...云云,看似很高大上,其实不过是直接寻址的延伸而已.直接寻址为何物,看一个数组:a[10],那么取其中一个元素a[1],这就是直接寻址,直接去这个a+1的地址上,就找到了这个数值,时间复杂度为O(1).而哈希表的目的就是要让查找的时间复杂度尽量往O(1)上靠. 一.哈希表的最简单形式 假如有10000个数,比如0~9999,是可能出现的数字的集合,我们现在要将一段时间内,出现的数字,全部保存起来.如果出现的数字都不重复的情况下,我们可以使用一个长度为10