#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define NULLKEY -1
typedef struct{
int key;
}KeyType;
typedef struct{
KeyType *elem;//表示生成的空间的首地址
int count; //哈希表元素个数
int sizeindex; //哈希表长度
}HashTable;
void Hash(HashTable *H){
int i,key,p,q,j;
printf("输入元素:\n");
for(i=0;i<H->count;i++){
j=1;
scanf("%d",&key);
p=key%H->sizeindex;
if(H->elem[p].key==NULLKEY)
H->elem[p].key=key;
else{
q=p;
while(H->elem[p].key!=NULLKEY){
p=(q+j)%H->sizeindex;
j++;
}
H->elem[p].key=key;
}
}
}
void Hash2(HashTable *H,int k[11]){
int i,key,p,q,j;
printf("输入元素:\n");
for(i=0;i<H->count;i++){
j=1;
scanf("%d",&key);
p=key%H->sizeindex;
if(H->elem[p].key==NULLKEY)
H->elem[p].key=key;
else{
q = p;
while(H->elem[p].key!=NULLKEY&&p>-1){
p=(q+k[j])%H->sizeindex;
j++;
}
H->elem[p].key=key;
}
}
}
void InitHash(HashTable *H){
int i;
printf("输入哈希表的元素个数及长度:\n");
scanf("%d%d",&H->count,&H->sizeindex);
H->elem=(KeyType *)malloc(H->sizeindex * sizeof(KeyType)); //申请内存
for(i=0;i<H->sizeindex;i++)
H->elem[i].key=NULLKEY;
}
void print(HashTable H){
int i=0;
for(i=0;i<H.sizeindex;i++){
printf("%d ",H.elem[i].key);
}
}
int SearchHash(HashTable H,int key){
int i;
//p=key%H.sizeindex;
for(i=0;i<H.sizeindex;i++){
if(H.elem[i].key==key) return i;
}
}
int main(){
int n ,key;
int k[11] = {0,1,-1,4,-4,9,-9,16,-16,25,-25};
HashTable H;
InitHash(&H);
printf("请选择:一次散列:1;二次散列:2");
printf("\n");
scanf("%d",&n);
if(n==1) Hash(&H);
else Hash2(&H,k);
printf("\n输出哈希表:\n");
print(H);
printf("\n输入要查找的key:\n");
scanf("%d",&key);
int i=SearchHash(H,key);
printf("位置是%d",i);
return 0;
}
这里二次散列用了数组,如果哈希表太大则不能用
仅供参考