实践6.2
Hash函数的实现(线性探测法,除留余数法)
源程序:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define HASHSIZE 12
#define NULLKEY -1
struct HashTable
{
int *elem;
int count;
};
//初始化哈希表
int InitHashTable(HashTable &pHashTable)
{
pHashTable.count=0;
pHashTable.elem=new int[HASHSIZE]; //分配整型数组
for(int i=0;i<HASHSIZE;i++)
pHashTable.elem[i]=-1;
return 1;
}
//哈希函数
int Hash(int key)
{
return key % HASHSIZE; //除留余数法
}
//插入关键字到哈希表
int InsertHashTable(HashTable &pHashTable,int key)
{
int addr=Hash(key); //求哈希地址
while(pHashTable.elem[addr]!=-1)
addr=(addr+1)%HASHSIZE; //线性探测
pHashTable.elem[addr]=key;
pHashTable.count++;
return 1;
}
//在哈希表中查找关键字
int SearchHashTable(HashTable pHashTable,int key,int *address)
{
*address=Hash(key);
while(pHashTable.elem[*address]!=key)
{
*address=(*address+1)%HASHSIZE; //线性探测
if(pHashTable.elem[*address]==-1 || *address==Hash(key))
return 0;
}
return 1;
}
int main()
{
int i;
HashTable hashTable;
InitHashTable(hashTable);
int a[10]={4,5,6,4,8,14,10,23,12,16};
for(i=0;i<10;i++)
InsertHashTable(hashTable,a[i]); //插入这些值到hash表
printf("哈希表中数的顺序为:\n");
for(i=0;i<HASHSIZE;i++)
printf("%4d",hashTable.elem[i]);
printf("\n请输入要查找的元素值:\n");
int number;
scanf("%d",&number);
int addr;
if(!SearchHashTable(hashTable,number,&addr))
{
printf("这些数中没有你要查找的数!\n");
}
else
printf("这些数中有你要查的数,元素的位置为:%d\n",addr);
return 1;
}
运行结果: