根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除。

初始化哈希表时把elem[MAXSIZE]、elemflag[MAXSIZE]和count分别置0。创建哈希表时按哈希函数创建哈希表,输入数据元素的关键字时,以“0”结束输入且要求关键字为正整数,数据元素个数不允许超过表长MAXSIZE。

输出的形式:根据所选择的哈希表的功能输出相应提示语句和正确结果。

程序的功能:将一组个数不超过哈希表长度的数据元素,按其关键字和哈希函数存入哈希表中,如果产生冲突用开放定址法处理并找出相应的地址。能实现用哈希表对数据元素的插入,显示,查找,删除。

测试数据:maxsize=10

哈希函数:H(key)=key%7

处理冲突方法:开放定址法 Hi=(H(key)+di)%13   i=1,2,3,…,9

哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈希函数或散列函数。按这种方法建立的表称为哈希表或散列表。

处理冲突的方法:

开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:

1.di=1,2,3,…, m-1,称线性探测再散列;

2.di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列;

3.di=伪随机数序列,称伪随机探测再散列。

再散列法:Hi=RHi(key), i=1,2,…,k. RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间;

链地址法(拉链法):将所有关键字为同义词的记录存储在同一线性链表中;

建立一个公共溢出区

#include <iostream>

using namespace std;

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 10

#define SUCCESS 1

#define UNSUCCESS 0

typedef struct

{  int elem[MAXSIZE];

int elemflag[MAXSIZE];

int count;

}HashTable;

void InitialHash(HashTable &H)/*哈希表初始化*/

{     int i;

H.count=0;

for(i=0;i<MAXSIZE;i++)

{   H.elem[i]=0;

H.elemflag[i]=0;

}

}

int Hash(int kn) /*哈希函数H(key)=key MOD 7*/

{   return (kn%7);

}

int SearchHash(HashTable &H,int k) /*查找关键字为k的元素*/

{  int t,s;

s=t=Hash(k);

xun:     if(H.elem[t]==k&&H.elemflag[t]==1) return SUCCESS;

else  if(H.elem[t]!=k&&H.elemflag[t]==1)

{   t=(t+1)%MAXSIZE;

goto xun;

}

else return UNSUCCESS;

}

int InsertHash(HashTable &H,int e)/*插入元素e*/

{      int p;

p=Hash(e);

if(SearchHash(H,e) )

{     cout<<"已有此数!"<<endl;

return UNSUCCESS;

}

else

{  H.elemflag[p]=1;

H.elem[p]=e;

H.count++;

return SUCCESS;

}

}

void CreateHash(HashTable &H)/*创建哈希表*/

{  int s;

int e;

cout<<"请输入哈希表:(输入0结束!)"<<endl;

cin>>e;

while(e)

{   s=InsertHash(H,e);

if(!s)

{     cout<<"此数已存在!";

cin>>e;

}

else

cin>>e;

}

}

void PrintHash(HashTable H) /*显示元素及其位置*/

{  cout<<"哈希表地址:";

int i;

for(i=0;i<MAXSIZE;i++)

cout<<i<<"  ";

cout<<endl<<"关键字:     ";

for(i=0;i<MAXSIZE;i++)

cout<<H.elem[i]<<"  ";

cout<<endl<<"关键字标志:";

for(i=0;i<MAXSIZE;i++)

cout<<H.elemflag[i]<<"  ";

}

int DeleteHash(HashTable &H,int e) /*删除元素e*/

{  int i;

int a=0;

for(i=0;i<MAXSIZE;i++)

if(H.elem[i]==e&&H.elemflag[i]==1)

{   H.elemflag[i]=2;

H.count--;

H.elem[i]=0;

a++;

return SUCCESS;

}

if(!a)

{  cout<<"无此数!"<<endl;

return 0;//return UNSUCCESS;

}

return 0;

}

void main()

{  HashTable H;

int m,k,p;

int R;

do{cout<<endl<<"\t\t******************请选择功能********************"<<endl;

cout<<"\t\t\t1.初始化哈希表"<<endl<<"\t\t\t2.创建哈希表"<<endl<<"\t\t\t3.查找"

<<endl<<"\t\t\t4.插入"<<endl<<"\t\t\t5.删除"<<endl<<"\t\t\t6.输出哈希表:"<<endl<<"\t\t\t0.退出"<<endl;

cout<<"\t\t************************************************"<<endl;

cin>>m;

switch(m)

{     case 1: InitialHash(H);break;

case 2: CreateHash(H);break;

case 3: cout<<endl<<"请输入要查找的关键字:";

cin>>k;

p=SearchHash(H,k);

if(p) cout<<"查找成功!"<<endl;

else cout<<"查找失败!"<<endl;

break;

case 4: cout<<endl<<"请输入要插入的关键字:";

cin>>R;

p=InsertHash(H,R);

if(p) cout<<"插入成功!"<<endl;

else cout<<"插入失败!"<<endl;

break;

case 5: cout<<"请输出要删除的关键字:";

cin>>R;

p=DeleteHash(H,R);

if(p) cout<<"删除成功!"<<endl;

else  cout<<"删除失败!"<<endl;

break;

case 6: PrintHash(H);break;

case 0: break;

default: cout<<endl<<"选择错误!";break;

}

}while(m!=0);

}

线性探测再散列 建立HASH表的更多相关文章

  1. 哈希表---线性探测再散列(hash)

    //哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include ...

  2. DS哈希查找--线性探测再散列

    题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字. --程序要求-- 若使用C++只能include一个 ...

  3. 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现

    #include<iostream>#include<iomanip>using namespace std; typedef struct Node{ int data; s ...

  4. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

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

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

  6. Python与数据结构[4] -> 散列表[2] -> 开放定址法与再散列的 Python 实现

     开放定址散列法和再散列 目录 开放定址法 再散列 代码实现 1 开放定址散列法 前面利用分离链接法解决了散列表插入冲突的问题,而除了分离链接法外,还可以使用开放定址法来解决散列表的冲突问题. 开放定 ...

  7. 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)

    散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...

  8. oracle的散列聚簇表

    在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...

  9. Redis数据类型之散列类型hash

    在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...

随机推荐

  1. iOS LoginDemo

    // // ViewController.m // FicowLoginDemo1 // // Created by Ficow on 15/11/12. // Copyright © 2015年 F ...

  2. ural 1070. Local Time

    1070. Local Time Time limit: 1.0 secondMemory limit: 64 MB Soon the USU team will go to Vancouver to ...

  3. ASP.NET 操作Cookie详解 增加,修改,删除

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它是网景公司的前雇员Lou Montulli在1993年3 ...

  4. java中的IO操作总结

    一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...

  5. 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)

    现在的翻译软件功能越来越多,也越来越臃肿,还不时弹广告,真的很烦恼. 鉴于这种情况,自己做了个翻译软件,能满足日常需求就好了.需要用的时候可以直接在桌面输入单词翻译,或者直接使用快捷键呼出翻译窗口.最 ...

  6. [Codeforces] Round #320 (Div.2)

    1.前言 虽然这次我依旧没有参加正式比赛,但是事后还是看了看题目的...一般不怎么刷Codeforces. A.Raising Bacteria You are a lover of bacteria ...

  7. dom事件不求甚解,色解事件捕获和冒泡

    以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...

  8. ASP.NET状态保持方案若干

    客户端方案: 1.ViewState 2.隐藏域 3.cookie 大小4KB限制,不消耗服务器资源,可配置到期时间,但安全性不高,还被客户端禁用. 4.QueryString 方法简单,但不安全,有 ...

  9. mysql 存储过程,搞死人的语法

    MySQL 真心不如sqlserver灵活 存储过程注意事项: 1.declare 依次声明 DECLARE MyAccountID VARCHAR (36); DECLARE Balance DEC ...

  10. QQ 微信 新浪 无法 分享 收集

    1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...