//根据关键字和哈希函数,建立哈希表,基于线性探测再散列解决冲突方法。
void BuildHashTable(int cArryKey[], int cArryHashTable[], int nLen)
{
int *pKey = cArryKey;
int *pHashTable = cArryHashTable;
bool *pMark = new bool[nLen]; //标志是否位置已经被占
memset(pMark, false, nLen);
int nPos = 0;
while (pKey != (cArryKey + nLen))
{
//除留余数法: Hash函数
nPos = *pKey % nLen;
while (1)
{
if (false == pMark[nPos])
{
pHashTable[nPos] = *pKey;
pMark[nPos] = true;
break;
}
else
{
++ nPos;
nPos = nPos % nLen;
}
}
pKey ++;
}
if (pMark)
{
delete [] pMark;
pMark = NULL;
}
return;
}
//查找
bool HashSearch(int cArryHashTable[], int nKeyValue, int nLen)
{
int *pHashTable = cArryHashTable;
int nPos = nKeyValue % nLen;
for (int i=0; i<nLen; ++i)
{
if (pHashTable[nPos] == nKeyValue)
{
return true;
}
else
{
nPos ++;
nPos = nPos % nLen;
}
}
return false;
}
int main()
{
int a[5] = {3,5,1,7,2}; //待查数组
int b[5]; //存放哈希表
memset(b, 0, 5);
BuildHashTable(a, b, 5); //建立Hash Table
bool bFind = HashSearch(b, 6, 5);
if (bFind)
{
cout<<"Find"<<endl;
}
else
{
cout<<"Not Find"<<endl;
}
system("pause");
return 0;
}