哈希查找
除留余数法与开放定址法构建哈希表:
定义哈希表类型:
typedef datatype{
int key;
int hi; //表示本该存储的位置到最后存储的位置的冲突次数
}
typedef HashTable{
datatype *base; //指向表的指针
int length; //表长
int num; //表内元素个数
}hashtable; //哈希表
void createhashtable(hashtable H,int m,hash[]){ //m为表长,hash数组存储要存进哈希表的元素
H->base=(datatype *)malloc(m*sizeof(datatype)); //构建哈希表
if(!H->base)return -1;
H->length=m;
for(i=0;i
H->base[i]->key=0;
H->base[i]->hi=-1; //表中单元空的标志
}
for(i=0;i
adrr=hash[i]%p; //哈希函数,除留余数法,p自选
sum=0; //记录冲突次数
if(H->base[adrr]->hi==-1){
H->base[adrr]->key==hash[i];
H->base[adrr]->hi=0;
}
else{
do{
adrr=(adrr+k)%m; //线性探测再散列
sum+1;
}while(H->base[adrr]->hi!=-1);
H->base[adrr]->key=hash[i];
H->base[adrr]->hi=sum;
}
}
H->num=m;
}
在哈希表查中找元素:
void searchhash(hashtable H,int x){
adrr=x%p; //哈希函数
id=adrr;
while(H->base[adrr]->hi!=-1){ //在哈希表中查找,遇到空单元就退出。因为若遇到空单元还没找到,则该元素一定不存在
if(H->base[adrr]->key==x)
return adrr;
else{
adrr=(adrr+k)%H->length; //线性探测
}
if(adrr==id) //整个哈希表没有空单元,遍历一遍还没找到则退出
break;
}
return -1;
}