哈希表的构造和查找算法

实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突。


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/*typedef struct {
	ElemType *elem;
	int count;
	int sizeindex;
}HashTable;*/
typedef struct{
    int key;
}keytype;

typedef struct { 
    keytype elem[100];
    int length;   /*当前的长度*/
    int size;  /*哈希表的总长*/
}hashtable; 
int a=0,b=0,select;
int hash2(int i,int t)
{  if(i%2==0)
     t=t+pow(++a,2);
   else
     t=t-pow(++b,2);
   return t;
}
int hash1(int i,int t)
{ 
i++;
 t=i;
   return t;
}
int hash(hashtable h,int k)
{
    return  k%(h.size);
}
void creat(hashtable *h)
{  int i,j,key,t,p;
   printf("请输入哈希表的长度,和表中的记录长:");
   scanf("%d%d",&h->size,&h->length);
   printf("请选择:\n1。采用线性探测再散列处理冲突\n2。采用二次探测再散列处理冲突"); 
   scanf("%d",&select);
   for(i=0;i<h->size;i++)//初始化将哈希表中的关键字都置为-1,代表此存储位子为空 
   h->elem[i].key=-1;
   printf("input data:\n");
   for(j=0;j<h->length;j++)
    {  scanf("%d",&key);
       p=hash(*h,key);
       if(h->elem[p].key==-1)
         h->elem[p].key=key;
       else
         {  i=0;
            t=p;
            while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2)
              {  
              if(select==2){
			  
			  p=hash2(i,t);
                 i++;
             }else if(select==1){
			 
             p=hash1(i,t);
                 i++;
             }
              }
            a=b=0;     //此纪录找到储存位置,将a,b参数置0,为下一个记录冲突做准备 
            h->elem[p].key=key;
         }
     }
}
int SearchHash(hashtable H,int k){
        int  p,i=0,t=0;
	p=hash(H,k);                                //求得Hash的地址 
	while(H.elem[p].key!=-1&&(k!=H.elem[p].key))//该地址中有记录,并且关键字不相等 
	 {
	 	if(select==2){
		 
	 p=hash2(i,t);                            // 用二次探测法求的下一个探测的地址 
	 i++;   
         }else if(select==1){
         	 p=hash1(i,t);                            // 用二次探测法求的下一个探测的地址 
	         i++;
		 }
    }
	if(k==H.elem[p].key)
	return p;
	else
	return -1;
	
}

void printhash(hashtable *h)

{  int i;

   for(i=0;i<h->size;i++)

    printf("%-4.2d",i);

     printf("\n");

    for(i=0;i<2*h->size;i++)

    printf("--");

    printf("\n");

    for(i=0;i<h->size;i++)

    printf("%-4.2d",h->elem[i].key);

}
int main()

{   hashtable t;
    int i,key,key1,c;
    creat(&t);
    printf("显示哈希表:\n\n");
    printhash(&t);
    printf("\n\n当前哈希表记录长为:%d\n",t.length);
    printf("\n请输入要查找记录的关键字:");
    scanf("%d",&key);
    c=SearchHash(t,key);
    if(c!=-1)
      printf("该记录的位子是:%d\n",c);
    else
      printf("没有找到该记录!\n");
      
      
      
      
      return 0;

}

测试结果如下:

请输入哈希表的长度,和表中的记录长:30 10
请选择:
1。采用线性探测再散列处理冲突
2。采用二次探测再散列处理冲突2
input data:
12 13 14 56 25 35 36 38 37 12
显示哈希表:

00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  
------------------------------------------------------------------------------------------------------------------------
-01 -01 -01 -01 -01 35  36  37  38  -01 -01 -01 12  13  14  -01 -01 -01 -01 -01 -01 -01 -01 -01 -01 25  56  -01 -01 -01 

当前哈希表记录长为:10

请输入要查找记录的关键字:14
该记录的位子是:14

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值