一个简单的Hash表算法 zz

一个简单的Hash表算法


关键字是一个整数。


#define M 100                               //表长度,一般选择为素数值
int t[M];                                            //Hash table
void makenull(int t[]);                   //Hash表的初始化,为0表示还没有填入元素
{
int i;
for(i=0;i<M;i++)
t[i]=0;
}


int search(int t[],int k)                   //Hash表的搜索
{
int i,j;
i=h(k);                                             //求Hash数
for(j=0;j<M&&t[(i+j)%M]!=k&&t[(i+j)%M]!=0;j++);                //三种情况:发生碰撞;未找到;找到
i=(i+j)%M;                                                                                  
if(t[i]==k) return i;
return -1;
}


int insert(int t[],int k)
{
int i,j;
i=h(k);
for(j=0;j<M&&t[(i+j)]%M!=k&&t[(i+j)%M>0;j++);
i=(i+j)%M;
if(t[i]<=0) //has been deleted or is empty
        t[i]=k;
return 0;
}
return 1;
}


int delete1(int t[],int k)
{
int i,j;
i=h[k];
for(j=0;j<M&&t[(i+j)]%M!=k&&t[(i+j)%M!=0;j++);
i=(i+j)%M;
if(t[i]==k) //has this element
{
t[i]=-1;
return 0;
}
return 1;
}

-----------------------------------------------------------------------------------------------------------------------------

以上算法是我从baidu上搜到的,我按照教材例子重写如下,赠强了代码的简洁性:

#define p 97    //p是不大于M的最大素数,除留余数法构造Hash函数: h(key)=key%p (p<m)

int SearchHash(int t[],int k, int &p)                   //Hash表的搜索
{
p=h(k);                                             //求Hash数
int j = 0;
while( t[p]!=k && t[p]!=NULLKEY && j<M)              //发生碰撞,采用开放定址法-线性探测再散列
           p=(p+j)%M;         

 if( t[p] == k)  return SUCCESS;
 else            return FAILURE;                         //没有找到,找到一个空位置或者j=m

}

int InsertHash(nt t[],int k, int &p)
{
   int p;
   if( search(t[M], k, p) ) return DUPLICATED;        //k已存在
   else if(t[p] = NULLKEY) t[p] = k; return OK;        //插入到空位置
   else return HASHISFULL;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值