實現哈希表構造和查找算法
實現哈希表構造和查找算法
使用的是除留餘數法構造哈希函數,這裏我用了兩種方法解決衝突:
- 一次探測再散列;
- 二次探測再散列解決衝突。
#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;
int Hash(HashTable *H,int k){
return (k%H->sizeindex);
}
int Hash2(int i,int t){
int a=0,b=0;
if(i%2==0)
t=t+pow(++a,2);
else
t=t-pow(++b,2);
return t;
}
void CreateHash(HashTable *H){
int i,j,key,p,t,c=0;
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;
printf("輸入元素:\n");
for(j=0;j<H->count;j++){
scanf("%d",&key);
p=Hash(H,key);
if(H->elem[p].key==NULLKEY)
H->elem[p].key=key;
else{
while(H->elem[p].key!=NULLKEY){
t=p+1;
p=Hash(H,t);
}
H->elem[p].key=key;
}
}
}
int SearchHash(HashTable H,int key){
int p,t;
p=Hash(&H,key);
while(H.elem[p].key!=NULLKEY&&H.elem[p].key!=key){
t=p+1;
p=Hash(&H,t);
}
if(H.elem[p].key==key)
return p;
else
return -1;
}
void print(HashTable H){
int i=0;
for(i=0;i<H.sizeindex;i++){
printf("%d ",H.elem[i].key);
}
}
int main(){
HashTable H;
int key,i;
CreateHash(&H);
printf("\n輸出哈希表:\n");
print(H);
printf("\n輸入要查找的key:\n");
scanf("%d",&key);
i=SearchHash(H,key);
if(i==-1)
printf("沒有找到!");
else
printf("%d在哈希表中的位置是%d",key,i);
return 0;
}