一、學習要點:
1.哈希表是一個很神奇的東西,即解決了數組的增刪的繁瑣,也解決了鏈表的查找問題;
2.哈希表的哈希函數;
3.哈希表的衝突問題解決;什麼叫做閉散列,什麼叫做開散列;閉,嚴重遵守哈希內涵。開,有點開放的意味,解決衝突靠鏈表,有點變味的哈希;
二、相關數據結構解讀:
1.構造一種存儲結構,通過某種函數使元素的存儲位置與它的關鍵碼之間建立一種一一映射的關係,那麼在查找時通過該函數可以很快找到該元素;
2.哈希函數是用來得到給定key值在哈希表中的存儲位置的;
3.哈希函數也並不是固定的,可以自己根據情況來定,一般常用常見的有直接定製法,除留餘數法,平方取中法,摺疊法,隨機數法,數學分析法。
4.當向該結構插入元素時,存在根據關鍵碼和哈希函數來計算出位置,當搜索時,也是根據給定的碼值,用哈希函數進行轉化得到存儲位置進行查找,將得到位置的值和要查找的關鍵碼進行比對,若關鍵碼相同,則搜索成功,否則根據解決衝突的方法,繼續查找;
三、代碼分析:
#include<stdio.h>
#include<stdlib.h>
#define HASHSIZE 12
#define NULLKEY -32768
typedef struct{
int *elem;
int count;
}HashTable;
int m=0;
//初始化散列表
int InitHashTable(HashTable *H)
{
int i;
m=HASHSIZE;
H->count=m;
H->elem=(int*)malloc(m*sizeof(int));
for(i=0;i<m;i++)
{
H->elem[i]=NULLKEY;
}
return 1;
}
//散列函數
int Hash(int key)
{
return key%m
}
//插入關鍵字進散列表
void InsertHash(HashTable *H,int key)
{
int addr=Hash(key);
while(H->elem[addr]!=NULLKEY)
{
addr=(addr+1)%m;
}
H->elem[addr]=key;
}
//查找指定元素
int SearchHash(HashTable H,int key,int *addr)
{
*addr=Hash(key);
while(H.elem[*addr]!!=key)
{
*addr=(*addr+1)%m;
if(H.elem[*addr]==NULLKEY||*addr==Hash(key))
{
return -1;
}
}
return *addr;
}
int main()
{
int a=[12]={12,67,56,16,25,37,22,29,15,47,48,34};
HashTable H;
int i;
InitHashTable(&H)
for(i=0;i<m;i++)
{
InsertHashTable(&H);
}
printf("插入之後的哈希表爲:")
for(i=0;i<m;i++)
{
printf("%d,",H.elem[i]);
}
int addr,j;
j=SearchHash(H,a[5],&addr);
printf("搜索到a[5]的地址是:%d",j);
}
四、運行的結果如圖所示:
https://download.csdn.net/download/fyf18845165207/11244561
源碼以下爲主:
資料來之不易,土豪請隨意: