#include <stdio.h>
#include <math.h>
#define N 11 //源数组大小
#define A 0.75 //装填因子
#define INIT_DATA -1 //新数组初始化值
#define D 1 //开放地址法 值
extern int getPri(int num);
extern void hash(int *arr,int *arrs);
extern int hash_find(int *arrs,int data);
static int maxPri;
static int size;
int main(void)
{
//源数据
int arr[N]={23,34,14,38,46,16,68,15,07,31,26};
//1. 得到新的数组大小
size = (int)ceil(N/A); //ceil向上取整函数
printf("size:%d\n",size);
//创建该数组
int arrs[size]; //变长数组
//对新的数组初始化操作,里面全部存 -1
int i;
for(i=0;i<size;i++){
arrs[i]=INIT_DATA;
}
//通过新的数据大小得到最大的质数
maxPri = getPri(size);
printf("maxPri: %d\n",maxPri);
//将源数组中的数据保存到新的数据中
hash(arr,arrs);
for(i=0;i<size;i++){
printf("%d ",arrs[i]);
}
printf("\n");
int data,loc;
while(1){
scanf("%d",&data);
loc = hash_find(arrs,data);
if(loc==-1){
printf("没有找到数据\n");
}else{
printf("%d在第%d个位置\n",data,loc+1);
}
}
return 0;
}
/*
得到最大质数
*/
int getPri(int num)
{
int i,j;
for(i=num;i>1;i--){ //2
for(j=2;j<i;j++){
if(i%j==0){
break;
}
}
if(j==i){
return i;
}
}
return -1;
}
void hash(int *arr,int *arrs)
{
//遍历源数组
int i,loc;
for(i=0;i<N;i++){
//源数组中的数据对最大质数取余
loc = arr[i]%maxPri;
//处理冲突操作--- 开放地址法 +1
while(arrs[loc]!=INIT_DATA){
loc = (loc+D)%size;
}
arrs[loc]=arr[i];
}
}
int hash_find(int *arrs,int data)
{
//数据对最大质数取余
int loc = data%maxPri;
while(arrs[loc]!=data){
if(arrs[loc]==INIT_DATA){
return -1;
}
loc = (loc+D)%size;
}
return loc;
}
C语言哈希查找算法
最新推荐文章于 2024-03-27 09:44:32 发布