实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突。
#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);elset=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;elsereturn -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);elseprintf("没有找到该记录!\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