實現哈希表構造和查找算法

實現哈希表構造和查找算法 

實現哈希表構造和查找算法

使用的是除留餘數法構造哈希函數,這裏我用了兩種方法解決衝突:

  1. 一次探測再散列;
  2. 二次探測再散列解決衝突。
#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章