6-4 线性探测法的查找函数
来源:互联网 发布:第九届网络攻防大赛 编辑:程序博客网 时间:2024/06/06 17:10
试实现线性探测法的查找函数。
函数接口定义:
Position Find( HashTable H, ElementType Key );
其中HashTable是开放地址散列表,定义如下:
#define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */typedef int ElementType; /* 关键词类型用整型 */typedef int Index; /* 散列地址类型 */typedef Index Position; /* 数据所在位置与散列地址是同一类型 *//* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */typedef enum { Legitimate, Empty, Deleted } EntryType;typedef struct HashEntry Cell; /* 散列表单元类型 */struct HashEntry{ ElementType Data; /* 存放元素 */ EntryType Info; /* 单元状态 */};typedef struct TblNode *HashTable; /* 散列表类型 */struct TblNode { /* 散列表结点定义 */ int TableSize; /* 表的最大长度 */ Cell *Cells; /* 存放散列单元数据的数组 */};
函数Find应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并返回。如果Key不存在,则返回线性探测法找到的第一个空单元的位置;若没有空单元,则返回ERROR。
裁判测试程序样例:
#include <stdio.h>#define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */typedef int ElementType; /* 关键词类型用整型 */typedef int Index; /* 散列地址类型 */typedef Index Position; /* 数据所在位置与散列地址是同一类型 *//* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */typedef enum { Legitimate, Empty, Deleted } EntryType;typedef struct HashEntry Cell; /* 散列表单元类型 */struct HashEntry{ ElementType Data; /* 存放元素 */ EntryType Info; /* 单元状态 */};typedef struct TblNode *HashTable; /* 散列表类型 */struct TblNode { /* 散列表结点定义 */ int TableSize; /* 表的最大长度 */ Cell *Cells; /* 存放散列单元数据的数组 */};HashTable BuildTable(); /* 裁判实现,细节不表 */Position Hash( ElementType Key, int TableSize ){ return (Key % TableSize);}#define ERROR -1Position Find( HashTable H, ElementType Key );int main(){ HashTable H; ElementType Key; Position P; H = BuildTable(); scanf("%d", &Key); P = Find(H, Key); if (P==ERROR) printf("ERROR: %d is not found and the table is full.\n", Key); else if (H->Cells[P].Info == Legitimate) printf("%d is at position %d.\n", Key, P); else printf("%d is not found. Position %d is returned.\n", Key, P); return 0;}/* 你的代码将被嵌在这里 */
输入样例1:(注:-1表示该位置为空。下同。)
11
11 88 21 -1 -1 5 16 7 6 38 10
38
输出样例1:
38 is at position 9.
输入样例2:
11
11 88 21 -1 -1 5 16 7 6 38 10
41
输出样例2:
41 is not found. Position 3 is returned.
输入样例3:
11
11 88 21 3 14 5 16 7 6 38 10
41
输出样例3:
ERROR: 41 is not found and the table is full.
解题思路:
明确哈希表的创建过程,理清线性探测法的过程。
根据裁判定义的散列函数Hash( Key, H->TableSize ),从散列表H中查到Key的位置,如果找到则返回。注意若第一次查找未找到,继续向后找,即代码中用到的循环。如果第一次找时,该位置为Empty,说明这个数不在该散列表里面,因为在创建过程中,如果该位置已被占用,则应按公式寻找下一个空位置,如果没被占用,则该数存在此位置,所以不存在该数存在且第一次查找位置为空的情况。
代码
Position Find( HashTable H, ElementType Key ){ Position p,m; p=Hash( Key, H->TableSize ); if(H->Cells[p].Data==Key||H->Cells[p].Info==Empty) return p; else { for(int i=1;i<H->TableSize;i++) { m=(p+i)%H->TableSize; if(H->Cells[m].Data==Key||H->Cells[m].Info==Empty) return m; } return ERROR; }}
阅读全文
0 0
- 6-4 线性探测法的查找函数
- 6-4 线性探测法的查找函数(哈希表)
- 线性探测法的查找函数
- 线性探测法的查找函数
- 线性探测法的查找函数
- 线性探测-Hash表的创建-查找
- 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
- 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
- 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
- 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
- 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
- 链地址法和线性探测法求查找成功与不成功的平均查找长度ASL
- 基于线性探测法的散列表
- 哈希表的构造之线性探测法
- 哈希表---线性探测法
- 线性探测法hash
- 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表
- 数据结构实验之查找七:线性之哈希表(线性探测解决哈希表的冲突)
- jQuery实现视频转base64及上传
- 正则中?:问好冒号的使用
- 2017年度最流行的十大中国开源软件
- 使用sqoop从Oracle或mysql抽取数据到HDFS遇到的报错及解决
- Git push 代码报错
- 6-4 线性探测法的查找函数
- Javascript原型链(二)
- python学习之路day2-循环
- Linux下原子操作函数
- HTML学习小结之HTML标签
- 【腾讯TMQ】Appium:轻松玩转app+webview混合应用自动化测试
- 数独解法的Python实现
- UVa 508 摩斯码匹配单词
- transwarp Slipstream 简介之高级功能