C++語(yǔ)言實(shí)現(xiàn)hash表詳解及實(shí)例代碼
C++語(yǔ)言實(shí)現(xiàn)hash表詳解
概要:
hash表,有時(shí)候也被稱為散列表。個(gè)人認(rèn)為,hash表是介于鏈表和二叉樹之間的一種中間結(jié)構(gòu)。鏈表使用十分方便,但是數(shù)據(jù)查找十分麻煩;二叉樹中的數(shù)據(jù)嚴(yán)格有序,但是這是以多一個(gè)指針作為代價(jià)的結(jié)果。hash表既滿足了數(shù)據(jù)的查找方便,同時(shí)不占用太多的內(nèi)容空間,使用也十分方便。
打個(gè)比方來(lái)說(shuō),所有的數(shù)據(jù)就好像許許多多的書本。如果這些書本是一本一本堆起來(lái)的,就好像鏈表或者線性表一樣,整個(gè)數(shù)據(jù)會(huì)顯得非常的無(wú)序和凌亂,在你找到自己需要的書之前,你要經(jīng)歷許多的查詢過(guò)程;而如果你對(duì)所有的書本進(jìn)行編號(hào),并且把這些書本按次序進(jìn)行排列的話,那么如果你要尋找的書本編號(hào)是n,那么經(jīng)過(guò)二分查找,你很快就會(huì)找到自己需要的書本;但是如果你每一個(gè)種類的書本都不是很多,那么你就可以對(duì)這些書本進(jìn)行歸類,哪些是文學(xué)類,哪些是藝術(shù)類,哪些是工科的,哪些是理科的,你只要對(duì)這些書本進(jìn)行簡(jiǎn)單的歸類,那么尋找一本書也會(huì)變得非常簡(jiǎn)單,比如說(shuō)如果你要找的書是計(jì)算機(jī)方面的書,那么你就會(huì)到工科一類當(dāng)中去尋找,這樣查找起來(lái)也會(huì)顯得麻煩。
不知道這樣舉例你清楚了沒有,上面提到的歸類方法其實(shí)就是hash表的本質(zhì)。下面我們可以寫一個(gè)簡(jiǎn)單的hash操作代碼。
a)定義hash表和基本數(shù)據(jù)節(jié)點(diǎn)
typedef struct _NODE
{
int data;
struct _NODE* next;
}NODE;
typedef struct _HASH_TABLE
{
NODE* value[10];
}HASH_TABLE;
b)創(chuàng)建hash表
HASH_TABLE* create_hash_table()
{
HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
memset(pHashTbl, 0, sizeof(HASH_TABLE));
return pHashTbl;
}
c)在hash表當(dāng)中尋找數(shù)據(jù)
NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pNode;
if(NULL == pHashTbl)
return NULL;
if(NULL == (pNode = pHashTbl->value[data % 10]))
return NULL;
while(pNode){
if(data == pNode->data)
return pNode;
pNode = pNode->next;
}
return NULL;
}
d)在hash表當(dāng)中插入數(shù)據(jù)
STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pNode;
if(NULL == pHashTbl)
return FALSE;
if(NULL == pHashTbl->value[data % 10]){
pNode = (NODE*)malloc(sizeof(NODE));
memset(pNode, 0, sizeof(NODE));
pNode->data = data;
pHashTbl->value[data % 10] = pNode;
return TRUE;
}
if(NULL != find_data_in_hash(pHashTbl, data))
return FALSE;
pNode = pHashTbl->value[data % 10];
while(NULL != pNode->next)
pNode = pNode->next;
pNode->next = (NODE*)malloc(sizeof(NODE));
memset(pNode->next, 0, sizeof(NODE));
pNode->next->data = data;
return TRUE;
}
e)從hash表中刪除數(shù)據(jù)
STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pHead;
NODE* pNode;
if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
return FALSE;
if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
return FALSE;
if(pNode == pHashTbl->value[data % 10]){
pHashTbl->value[data % 10] = pNode->next;
goto final;
}
pHead = pHashTbl->value[data % 10];
while(pNode != pHead ->next)
pHead = pHead->next;
pHead->next = pNode->next;
final:
free(pNode);
return TRUE;
}
總結(jié):
1、hash表不復(fù)雜,我們?cè)陂_發(fā)中也經(jīng)常使用,建議朋友們好好掌握;
2、hash表可以和二叉樹形成復(fù)合結(jié)構(gòu),至于為什么,建議朋友們好好思考一下?
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法
這篇文章主要給大家介紹了關(guān)于QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法,軟件的界面為了更直觀或美觀,常常需要通過(guò)圖片來(lái)表達(dá),需要的朋友可以參考下2023-06-06
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
基于opencv實(shí)現(xiàn)視頻中的顏色識(shí)別功能
這篇文章主要介紹了基于opencv實(shí)現(xiàn)視頻中的顏色識(shí)別功能,文章詳細(xì)介紹了顏色識(shí)別的原理及opencv中的顏色模型,基于c++代碼實(shí)現(xiàn)顏色識(shí)別功能,需要的朋友可以參考下2022-07-07
C++獲取本機(jī)登陸過(guò)的QQ號(hào)碼示例程序
這篇文章主要介紹了使用C++獲取本機(jī)登陸過(guò)的QQ號(hào)碼列表的程序示例,大家可以參考使用2013-11-11
C語(yǔ)言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問(wèn)題
這篇文章主要介紹了在日常調(diào)試C語(yǔ)言中include的順序不同從而影響最后編譯結(jié)果不同的問(wèn)題,究其原因是寫代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來(lái)看看吧2022-04-04
C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法
這篇文章主要介紹了C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法,可實(shí)現(xiàn)一個(gè)簡(jiǎn)單的腳本解釋器,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10
C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

