直接上代码

#include <iostream>
#include <cmath>
using namespace std;
#define MAX 100000 //允许开辟的最大散列表长度
typedef int ElementType;
typedef int Index;      // 散列地址类型
typedef Index Position; // 数据所在的位置
typedef enum
{Legitimate, // 合法Empty,      // 空Deleted     // 已经删除
} EntryType;
typedef struct HashEntry Cell; // 散列单元类型
struct HashEntry
{ElementType Data;ElementType Info; //单元状态
};
typedef struct TblNode *HashTable; // 散列表类型
struct TblNode
{int TableSize; // 表的最大长度Cell *Cells;   // 存放数据的数组
};
// 返回一个大于N且不超过MAX的最小素数
int NextPrime(int N)
{// 从大于N的第一个奇数开始int p = (N % 2) ? N + 2 : N + 1;while (p <= MAX){int i;for (i = (int)sqrt(p); i > 2; i--){if (!(p % i))break; // 不是素数}if (i == 2)break;elsep += 2;}return p;
}
HashTable CreateTable(int TableSize)
{HashTable H;H = (HashTable)malloc(sizeof(struct TblNode));// 保证散列表的最大长度是素数H->TableSize = NextPrime(TableSize);// 数组H->Cells = (Cell *)malloc(H->TableSize * sizeof(Cell));// 初始化数组为空单元for (int i = 0; i < H->TableSize; i++)H->Cells[i].Info = Empty;return H;
}
// 平方探测
Position Find(HashTable H, ElementType Key)
{Position Currentpos, NewPos;int CNum = 0; // 记录冲突次数// NewPos = Currentpos = Hash(Key, H->TableSize); // 初始散列的位置int p = H->TableSize;          // 应该是吧NewPos = Currentpos = Key % p; // 除留余数法// 为空的话就是找不到while (H->Cells[NewPos].Info != Empty && H->Cells[NewPos].Data != Key){// 奇数次冲突 加i的平方if (++CNum % 2){// CNum相当于i的映射// NewPos是增加后的位置NewPos = Currentpos + ((CNum + 1) / 2) * ((CNum + 1) / 2);// 如果加超了// 调增成合法的地址if (NewPos >= H->TableSize)NewPos = NewPos % H->TableSize;}else{NewPos = Currentpos - (CNum / 2) * (CNum / 2);while (NewPos < 0)NewPos += H->TableSize;}}/*// 开放地址法while (H->Cells[NewPos].Info != Empty && H->Cells[NewPos].Data != Key){NewPos = (Currentpos + (++CNum)) % H->TableSize;}*/// 此时NewPos 或者是Key的地址 或者是空单元地址return NewPos;
}
bool Insert(HashTable H, ElementType Key)
{Position Pos = Find(H, Key);if (H->Cells[Pos].Info != Legitimate){H->Cells[Pos].Info = Legitimate;H->Cells[Pos].Data = Key;return true;}else{cout << "键值已存在\n";return false;}
}
bool Delete(HashTable H, ElementType Key)
{Position pos = Find(H, Key);if (H->Cells[pos].Info == Empty || H->Cells[pos].Info == Deleted)return false;else if (H->Cells[pos].Info == Legitimate){H->Cells[pos].Info = Deleted;return true;}return true;
}void PrintHashTable(HashTable H)
{for (int i = 0; i < H->TableSize; i++){if (H->Cells[i].Info == Legitimate)cout << H->Cells[i].Data << ' ';}cout << "\n";
}
int main()
{HashTable htb;int N;cin >> N;htb = CreateTable(N);ElementType x;for (int i = 0; i < 5; i++){cin >> x;Insert(htb, x);}PrintHashTable(htb);cin >> x;cout << Delete(htb, x) << endl;PrintHashTable(htb);return 0;
}

线性探测法和平方探测法 - 哈希表 - 完整代码相关推荐

  1. 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时:ASL =1n\frac{1}{n}n1​ ∑i=1 ...

  2. SDUT 3377 数据结构实验之查找五:平方之哈希表

    数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组 ...

  3. 散列(2)线性探测法和双重散列法

    接上篇 散列的简要描述和链地址法 解决散列冲突的方法: 1. 线性探测法 如果我们能够预测将要存入表中元素的数目,而且我们有足够的内存空间可以容纳带有空闲空间的所有关键字,那么使用链地址法是不值得的. ...

  4. 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法

    本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...

  5. e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗

    #新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...

  6. E数据结构实验之查找五:平方之哈希表

    Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=± ...

  7. 数据结构实验之查找五:平方之哈希表

    题目描述 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1 ...

  8. e - 数据结构实验之查找五:平方之哈希表_leetcode算法之哈希表

    今天该来盘一盘 哈希表 这类题目 分类别解析leetcode上的一些相关的例题路,代码采用C++与python实现. 哈希表 哈希表是一种很有用的数据结构, 其作用主要是以空间换时间, 在c++中主要 ...

  9. 哈希表 - (代码、分析 )

    目录: 代码: 分析: 代码: BSTree.h BSTree.c 二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) Hash.h #ifnde ...

最新文章

  1. 这可能是最好的RxJava 2.x 入门教程(二)
  2. WebStorm调试Electron
  3. oracle用EXPLAIN PLAN 分析SQL语句
  4. sourcemap总结
  5. orcale中case when和group by同时使用会报无效标识符
  6. 神经网络不应视为模型,推理过程当为机器学习问题一等公民
  7. 编译 linux 3,linux内核的编译(3)
  8. 实验4-1-4 求整数的位数及各位数字之和 (15 分)
  9. Android 图片展示器
  10. 【MySQL】与【Oracle】
  11. 小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍
  12. Redis相关面试题
  13. Failing OffsetCommit request since the consumer is not part of an active group
  14. 力扣LeetBook<链表>学习笔记
  15. 紫薇星上的数据结构(7)
  16. 中山大学曾兆阳_官居几品怎么打压势力
  17. win7系统备份还原软件_非常好用的系统备份和还原的软件,OneKey一键还原工具
  18. 【洛谷 P4408】逃学的小孩【树的直径】
  19. Geogebra的使用
  20. Android 找不到资源异常,Android 问题之找不到资源解决办法

热门文章

  1. 大整数加法基本思路和代码(C++实现)
  2. 音频文件的结构与规范——RIFF和WAVE音频文件格式
  3. 自动阅读项目到底能不能做?看成本分析再决定
  4. 西电计组实验一 存储器实验
  5. android分辨率 尺寸 dpi换算
  6. 前人铺路系列组件hevue-img-preview 2.5更新,增加键盘控制,节流,图片加载等待等,来看看有没有你可以借鉴的思路或功能
  7. 小米路由器的服务器无响应怎么回事,小米路由器常见问题与解决方法(高级功能) | 192路由网...
  8. robocup2D教程
  9. 达达,不能只做京东的达达
  10. 局域网有几台电脑频繁断网_电脑经常自动断网掉线分析