数据结构 c语言实现哈希(hash)表查找 除留余数法构建hash函数开放定值法线性探测处理冲突
来源:互联网 发布:中小型企业网络搭建 编辑:程序博客网 时间:2024/06/04 18:08
一.hash函数头文件实现hash.h
#ifndef __HASH_H__
#define __HASH_H__
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<unistd.h>
#define N 11
typedef int datatype;
typedef struct hastbl
{
datatype *h;
int length;
}hash_tbl,*hash_tp;
extern void init_hash(hash_tp *hp,int m);
extern void create_hash(hash_tp hp,datatype *a);
extern int hash_search(hash_tp hp,int key);
extern void hash_show(hash_tp hp,int hash_val);
#endif
二.hash函数函数实现hash.c
#include"hash.h"
int p;
void init_hash(hash_tp *hp,int m)
{
(*hp) = malloc(sizeof(hash_tbl));
if(NULL == *hp)
{
perror("malloc");
exit(1);
}
(*hp)->length = m;
(*hp)->h =(datatype*)malloc((*hp)->length * sizeof(datatype));
if(NULL == (*hp)->h)
{
perror("malloc");
exit(1);
}
for(int i = 0;i <(*hp)->length;i++)
(*hp)->h[i] = -1;
}
int fun(int m)
{
int i;
for(;m > 1;m--)
{
for(i = 2;i < m;i++)
{
if(m % i == 0)//求质数
break;
}
if(i >= m)
return m;
}
return -1;
}
void create_hash(hash_tp hp,datatype *a)
{
int hash_val,i;
p = fun(hp -> length);
if(p == -1)
exit(1);
for(i = 0;i < N;i++)
{
//1.用除留余数法构建hash函数
hash_val = a[i] % p;
//2.用线性探查法处理冲突
while(hp->h[hash_val] != -1)
hash_val = (hash_val +1)%hp ->length;
//3.将记录存储在hash_val的位置
hp->h[hash_val] = a[i];
hash_show(hp,hash_val);
sleep(1);
}
}
int hash_search(hash_tp hp,int key)
{
int hash_val,flag = 0;
hash_val = key % p;//用除留余数法得到hash地址
while(hp -> h[hash_val] != key)
{
hash_val = (hash_val + 1) % hp->length;
flag++;
if(flag == hp->length)
return -1;
}
return hash_val;
}
void hash_show(hash_tp hp,int hash_val)
{
int i;
for(i = 0;i < hp->length;i++)
{
if(i == hash_val)
printf("hp->h[%02d]:%d<---当前插入\n",i,hp->h[i]);
else
printf("hp->h[%02d]:%d\n",i,hp->h[i]);
}
printf("***************************************");
}
三.主函数包含main的test文件
#include"hash.h"
int main()
{
hash_tp hp;
int m,i,key;
char ch;
datatype a[N] = {23,34,14,38,46,16,68,15,7,31,26};
//1.根据记录个数得到hash表的长度
m =(int) ceil(N/0.75); //向下取整
//2,初始化哈系表空间
init_hash(&hp,m);
//3.创建hash表
create_hash(hp,a);
//4.hash表查找
while(1)
{
printf("pls input key");
scanf("%d",&key);
i = hash_search(hp,key);
if(i == -1)
{
printf("search error!\n");
}
else
{
printf("search %d at %d\n",key,i);
}
printf("continue?(Y/y)");
while(getchar() != '\n');
scanf("%c",&ch);
if(ch == 'y' || ch == 'Y')
continue;
else
break;
}
return 0;
}
四.makefile文件
CC = gcc
CFLAGS= -Wall -g -O0
test:hash.c test.c
$(CC) $(CFLAGS) -o $@ $^
clean:
$(RM) hash_search .*.sw?
- 数据结构 c语言实现哈希(hash)表查找 除留余数法构建hash函数开放定值法线性探测处理冲突
- 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表
- 【除留余数法定义hash函数+平方探测法解决hash冲突】数据结构实验之查找五:平方之哈希表
- 除留余数法实现简单hash函数
- 开放定址法解决hash冲突问题(C语言实现)
- HASH表(采用开放地址法处理hash冲突)
- 数据结构 c语言 hash查找 链地址法实现
- 根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。
- hash线性探测开放定址法解决冲突
- 开放定址法解决hash冲突(C语言)
- C语言 开放寻址法HASH表存储简单实现
- 等式数量--hash算法之除留余数法
- 数据结构_8:查找:Hash:C语言
- 分离链接法解决hash冲突问题(C语言实现)
- Hash Table 开放寻址处理冲突
- java数据结构——Hash的实现(数组) 线性探测的方法解决冲突
- hash函数以及冲突处理
- 线性探测-Hash表的创建-查找
- Python类对象的JSON序列化处理
- 优雅设计封装基于Okhttp3的网络框架(四):多线程下载添加数据库支持(greenDao)及 进度更新
- 常用处理兼容性问题的方法
- 方正科技怎么了?
- 《零基础入门学习Python》学习过程笔记【018函数开头文档,及参数相关问题】
- 数据结构 c语言实现哈希(hash)表查找 除留余数法构建hash函数开放定值法线性探测处理冲突
- Ubuntu安装JDK详解
- 在C#中使用RadioButton
- 论如何学习一门编程语言
- ubuntu扩容
- 计算机视觉小实例 No.3 基于Hough变化的答题卡识别
- POSIX常用字符集合
- 在 Ubuntu 14.04 下安装 mysql 5.7.10
- [资源分享]NavMeshComponents(Unity官方插件)动态创建自动烘培地形