哈希查找


哈希查找(散列表查找)

步驟: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;
}

發佈了49 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章