实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突。


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/*typedef struct {ElemType *elem;int count;int sizeindex;
}HashTable;*/
typedef struct{int key;
}keytype;typedef struct { keytype elem[100];int length;   /*当前的长度*/int size;  /*哈希表的总长*/
}hashtable;
int a=0,b=0,select;
int hash2(int i,int t)
{  if(i%2==0)t=t+pow(++a,2);elset=t-pow(++b,2);return t;
}
int hash1(int i,int t)
{
i++;t=i;return t;
}
int hash(hashtable h,int k)
{return  k%(h.size);
}
void creat(hashtable *h)
{  int i,j,key,t,p;printf("请输入哈希表的长度,和表中的记录长:");scanf("%d%d",&h->size,&h->length);printf("请选择:\n1。采用线性探测再散列处理冲突\n2。采用二次探测再散列处理冲突"); scanf("%d",&select);for(i=0;i<h->size;i++)//初始化将哈希表中的关键字都置为-1,代表此存储位子为空 h->elem[i].key=-1;printf("input data:\n");for(j=0;j<h->length;j++){  scanf("%d",&key);p=hash(*h,key);if(h->elem[p].key==-1)h->elem[p].key=key;else{  i=0;t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2){  if(select==2){p=hash2(i,t);i++;}else if(select==1){p=hash1(i,t);i++;}}a=b=0;     //此纪录找到储存位置,将a,b参数置0,为下一个记录冲突做准备 h->elem[p].key=key;}}
}
int SearchHash(hashtable H,int k){int  p,i=0,t=0;p=hash(H,k);                                //求得Hash的地址 while(H.elem[p].key!=-1&&(k!=H.elem[p].key))//该地址中有记录,并且关键字不相等 {if(select==2){p=hash2(i,t);                            // 用二次探测法求的下一个探测的地址 i++;   }else if(select==1){p=hash1(i,t);                            // 用二次探测法求的下一个探测的地址 i++;}}if(k==H.elem[p].key)return p;elsereturn -1;}void printhash(hashtable *h){  int i;for(i=0;i<h->size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*h->size;i++)printf("--");printf("\n");for(i=0;i<h->size;i++)printf("%-4.2d",h->elem[i].key);}
int main(){   hashtable t;int i,key,key1,c;creat(&t);printf("显示哈希表:\n\n");printhash(&t);printf("\n\n当前哈希表记录长为:%d\n",t.length);printf("\n请输入要查找记录的关键字:");scanf("%d",&key);c=SearchHash(t,key);if(c!=-1)printf("该记录的位子是:%d\n",c);elseprintf("没有找到该记录!\n");return 0;}

测试结果如下:

请输入哈希表的长度,和表中的记录长:30 10
请选择:
1。采用线性探测再散列处理冲突
2。采用二次探测再散列处理冲突2
input data:
12 13 14 56 25 35 36 38 37 12
显示哈希表:00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29
------------------------------------------------------------------------------------------------------------------------
-01 -01 -01 -01 -01 35  36  37  38  -01 -01 -01 12  13  14  -01 -01 -01 -01 -01 -01 -01 -01 -01 -01 25  56  -01 -01 -01 当前哈希表记录长为:10请输入要查找记录的关键字:14
该记录的位子是:14

哈希表的构造和查找算法相关推荐

  1. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  2. 数据结构:哈希表函数构造和冲突解决方法

    哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...

  3. 哈希表的构造及解决冲突

    1. 数字分析法 如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址.例如,有80个记录,关键字为8位十进制整数d1d2d3-d7 ...

  4. 哈希表(散列查找)(c/c++)

    通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...

  5. 数据结构的学生信息哈希表的建立与查找

    设有若干个学生的考试成绩,采用除留余数求哈希地址,将学生的信息存储到该地址空间,并且采用线性探测法解决冲突问题. #include <iostream.h>#include <con ...

  6. 算法就这么回事(一)七大查找算法汇总

    前言 查找(search)是在一个数据结合中查找满足给定条件的记录.对于查找问题来说,没有一种算法对于任何情况下都是合适的.有的查找速度比其他算法快,但是需要较多的存储空间(例如 Hash 查找):有 ...

  7. 【ZZ】详解哈希表的查找

    详解哈希表的查找 https://mp.weixin.qq.com/s/j2j9gS62L-mmOH4p89OTKQ 详解哈希表的查找 2018-03-01 算法与数据结构 来自:静默虚空 http: ...

  8. 查找三 哈希表的查找

    要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash ...

  9. lfu算法实现c语言_哈希查找算法(C语言实现)

    上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作.在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该 ...

最新文章

  1. oracle中怎样查询用户权限
  2. 用python画爱心-python画一个玫瑰和一个爱心
  3. Linux Kernel and Android 休眠与唤醒(中文版)
  4. Boost::context模块fiber的jump测试程序
  5. 手动编译php,手动编译安装php7的方式
  6. 使用CLion在Gtkmm中加载glade文件时的相对路径问题
  7. 1Python全栈之路系列之MySQL数据库基本操作
  8. 1.2 Enterprise Library 应用程序块
  9. 201621123015《Java程序设计》第11周学习总结
  10. 论各类BI工具的“大数据”特性!
  11. Linux学习笔记十七——Linux系统启动流程
  12. CSS文件在jsp 文件中应该放的位置
  13. Boosting原理学习
  14. 人间繁华江上明月,乃浮生一梦,惟真情长在——读沈君山《浮生再记》(并转书评)...
  15. 工业相机视场和分辨率计算
  16. php输出26个大小写英文字母
  17. Redis 跳跃表的原理和实现
  18. 框架使用 - 收藏集 - 掘金
  19. Vue 扫码及生成二维码
  20. 小程序长按识别公众号二维码-已实现

热门文章

  1. 集合(collection)
  2. Spring源码解析(二)BeanDefinition的Resource定位
  3. spring-data-mongodb查询结果返回指定字段
  4. 怎么在前台取的ViewBag中的值
  5. 汉字转UNICODE?
  6. 回调函数这个是什么鬼?
  7. [RK3399 Android7.1] 开启保存上一次重启前日志
  8. STM32项目(七) —— 智能仓库管理系统
  9. 广联达文件被锁怎么修复_事无巨细的绕过Apple id教程+修复蜂窝数据/电话
  10. 如何 给给软件开发 添加 代理_敏捷开发是如何被跑偏的