哈希查找(散列表查找)
步驟:1.確定散列函數及解決衝突的方法
2.根據散列函數建造哈希表
3.進行哈希查找
解決衝突方法:1.開放地址->(1.線性探測 2.線性補償探測 3.隨機探測 4.線性再散列)
2.鏈表法
---C語言實現
---本次實現散列函數採用除整取餘法
---本次實現解決衝突採用鏈表法
---實現了哈希表的創建 查找
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct hashsraechnode
{
int value;
struct hashsraechnode*pNext;
}HashSraechNode;
//哈希查找(散列表查找)
//散列函數:除整取餘
//解決地址衝突:鏈表法
void HashSearch(int arr[],int length,int SearchNum)
{
int StandardNum;//用數組長度當作標準建造散列函數
HashSraechNode **Head = NULL;
HashSraechNode *Temp = NULL;
HashSraechNode *Del = NULL;
int count;
int IsSearchSucceed;//0:fail 1:success
if(arr == NULL || length <= 0)return ;
IsSearchSucceed = 0;
StandardNum = length;
//建造哈希表
Head = (HashSraechNode **)malloc(sizeof(HashSraechNode *)*StandardNum);
memset(Head,0,sizeof(HashSraechNode*)*StandardNum);
for(count = 0;count<length;count++)
{
Temp = (HashSraechNode *)malloc(sizeof(HashSraechNode ));
Temp->value = arr[count];
Temp->pNext = NULL;
if( !Head[ arr[count]%StandardNum ] )
{
//頭添加避免遍歷鏈表
Temp->pNext = Head[ arr[count]%StandardNum ];
Head[ arr[count]%StandardNum ] = Temp;
}
else
{
Head[ arr[count]%StandardNum ] = Temp;
}
}
//哈希查找
if( Head[ SearchNum%StandardNum ] )
{
Temp = Head[ SearchNum%StandardNum ];
while(Temp)
{
if(Temp->value == SearchNum)
{
IsSearchSucceed = 1;
break;
}
Temp = Temp->pNext;
}
}
//釋放空間
for(count = 0;count<length;count++)
{
if(Head[count])
{
Temp = Del = Head[count];
while(Temp)
{
Del = Temp;
Temp = Temp->pNext;
free(Del);
Del = NULL;
}
}
}
free(Head);
Head = NULL;
if(IsSearchSucceed)
printf("Search Succeed\n");
else
printf("Search Failed\n");
return ;
}
int main()
{
int arr[] = {2,6,9,12,23,55,67,99,123};
HashSearch(arr,sizeof(arr)/sizeof(arr[0]),6);
system("pause");
return 0;
}