哈希查找

除留余数法与开放定址法构建哈希表:
 
定义哈希表类型:
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;
}
原文地址:https://www.cnblogs.com/yujon/p/5467589.html