数据结构定义如下:

 typedef unsigned int Index;
typedef Index Position; struct HashTbl;
typedef struct HashTbl *HashTable; HashTable InitializeTable(int TableSize);
void DestroyTable(HashTable H);
Position Find(ElementType Key, HashTable H);
void Insert(ElementType Key, HashTable H);
ElementType Retrieve(Position P, HashTable H);
HashTable Rehash(HashTable H); enum KindOfEntry {Legitimate, Empty, Deleted};
struct HashEntry{
ElementType Element;
enum KindOfEntry Info;
};
typedef struct HashEntry Cell; struct HashTbl{
int TableSize;
Cell *TheCells;
};

初始化函数代码如下:

 HashTable InitializeTable(int TableSize){
HashTable H;
int i; if(TableSize < MinTableSize){
printf("Table size too small\n");
return NULL;
} H = malloc(sizeof(struct HashTbl));
H->TableSize = NextPrime(TableSize);
H->TheCells = malloc(H->TableSize * sizeof(Cell)); for(i=; i<H->TableSize; i++)
H->TheCells[i].Info = Empty; return H;
}

Find函数实现代码如下:

 Position Find(ElementType Key, HashTable H){
Position Pos;
int i; i=;
Pos = Hash(Key, H->TableSize);
while(H->TheCells[Pos].Info != Empty
&& H->TheCells[Pos].Element != Key){
Pos += (++i)*-;
if(Pos >= H->TableSize)
Pos -= H->TableSize;
}
return Pos;
}

Insert函数代码实现如下:

 void Insert(ElementType Key, HashTable H){
Position Pos;
Pos = Find(Key, H);
if(H->TheCells[Pos].Info != Legitimate){
H->TheCells[Pos].Info = Legitimate;
H->TheCells[Pos].Element = Key;
}
}

Rehash函数代码实现如下:

 HashTable rehash(HashTable H){
int i, OldSize = H->TableSize;
HashTable OldH = H;
Cell *OldCells = H->TheCells; H = InitializeTable(*OldSize);
for(int i=; i<OldSize; i++){
if(OldCells[i].Info == Legitimate)
Insert(OldCells[i].Element, H);
} free(OldH);
free(OldCells);
return H;
}

开放地址法散列表ADT的更多相关文章

  1. Hash冲突的线性探测开放地址法

    在实际应用中,无论如何构造哈希函数,冲突是无法完全避免的. 开放地址法 这个方法的基本思想是:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止.这个过程可用下式描述:  ...

  2. 分离链表法散列ADT

    分离链表法解决冲突的散列表ADT实现 数据结构定义如下: struct ListNode; typedef struct ListNode *Position; struct HashTbl; typ ...

  3. 面试准备 - HashTable 的C#实现 开放地址法

    Hashtable是很经常在面试中遇到的数据结构,因为他的O(1)操作时间和O(n)空间 之所以自己写一份是因为: 加深对于hashtable的理解 某些公司面试的时候需要coding....... ...

  4. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...

  5. 开放地址法实现HashTable

    前注:本文不是讲解Java类库的Hashtable实现原理,而是根据计算机哈希表原理自己实现的一个Hashtable. HashTable内部是用数组存放一个(Key-Value pair)键值对的引 ...

  6. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  7. Java 集合 散列表hash table

    Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...

  8. 哈希表(散列表),Hash表漫谈

    1.序 该篇分别讲了散列表的引出.散列函数的设计.处理冲突的方法.并给出一段简单的示例代码. 2.散列表的引出 给定一个关键字集合U={0,1......m-1},总共有不大于m个元素.如果m不是很大 ...

  9. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

随机推荐

  1. # 2017-2018-1 20155224 加分项-实现mypwd

    2017-2018-1 20155224 加分项-实现mypwd 1. 学习pwd命令 pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根目录)写入标准输出.全部目录使用 ...

  2. c++ 二叉树的遍历

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  3. 如何实现PyQt5与QML响应彼此发送的信号?

    对于PyQt5+QML+Python3混合编程,如何实现PyQt5与QML响应彼此发送的信号,这是一个棘手的问题. 大抵有如下五种方式: (要运行下面五个例子,千万不能在eric6中运行,会报错.错误 ...

  4. 13 - stark总结、github代码

    1.stark - 总结 (单例,继承,反射,面向对象,modelform 应用得很好!!) 1.注册表 单例模式 site = StarkSite() 2.生成url url(r'^stark/', ...

  5. 网络编程的演进——从Apache到Nginx

    Apache 1.Apache HTTP服务器是 Robert McCool 在1995年写成,并在1999年开始在Apache软件基金会的 框架下进行开发. 由于Apache HTTP服务器是基金会 ...

  6. Flutter - Error: 'xxx' is imported from both package...

    Compiler message: lib/main.dart:77:32: Error: 'Toast' is imported from both 'package:easy_alert/src/ ...

  7. C#简单的四位纯数字验证码

    验证码练手,整型.四位验证码 大体意思就是:四位纯数字验证,只要验证不成功就无限验证 刚开始在纠结怎么让整个过程循环起来,什么循环放到最外层,其实就是一个循环,看来自己的循环练习的还是不够多,不够灵活 ...

  8. 为什么 Action/ViewController/ProperttyEditor不可见或不可用?

    英文版:https://documentation.devexpress.com/eXpressAppFramework/112818/Concepts/Extend-Functionality/De ...

  9. Rxjava - 操作符,线程操作的简单使用

    目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...

  10. Selenium2+python自动化-八种元素定位(Firebug和Firepath)

    前言    自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位.元素定位在这四个环节中 ...