C++語言實現(xiàn)hash表詳解及實例代碼
C++語言實現(xiàn)hash表詳解
概要:
hash表,有時候也被稱為散列表。個人認為,hash表是介于鏈表和二叉樹之間的一種中間結(jié)構(gòu)。鏈表使用十分方便,但是數(shù)據(jù)查找十分麻煩;二叉樹中的數(shù)據(jù)嚴格有序,但是這是以多一個指針作為代價的結(jié)果。hash表既滿足了數(shù)據(jù)的查找方便,同時不占用太多的內(nèi)容空間,使用也十分方便。
打個比方來說,所有的數(shù)據(jù)就好像許許多多的書本。如果這些書本是一本一本堆起來的,就好像鏈表或者線性表一樣,整個數(shù)據(jù)會顯得非常的無序和凌亂,在你找到自己需要的書之前,你要經(jīng)歷許多的查詢過程;而如果你對所有的書本進行編號,并且把這些書本按次序進行排列的話,那么如果你要尋找的書本編號是n,那么經(jīng)過二分查找,你很快就會找到自己需要的書本;但是如果你每一個種類的書本都不是很多,那么你就可以對這些書本進行歸類,哪些是文學(xué)類,哪些是藝術(shù)類,哪些是工科的,哪些是理科的,你只要對這些書本進行簡單的歸類,那么尋找一本書也會變得非常簡單,比如說如果你要找的書是計算機方面的書,那么你就會到工科一類當中去尋找,這樣查找起來也會顯得麻煩。
不知道這樣舉例你清楚了沒有,上面提到的歸類方法其實就是hash表的本質(zhì)。下面我們可以寫一個簡單的hash操作代碼。
a)定義hash表和基本數(shù)據(jù)節(jié)點
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表當中尋找數(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表當中插入數(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ù)雜,我們在開發(fā)中也經(jīng)常使用,建議朋友們好好掌握;
2、hash表可以和二叉樹形成復(fù)合結(jié)構(gòu),至于為什么,建議朋友們好好思考一下?
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
OpenMP?Parallel?Construct的實現(xiàn)原理詳解
在本篇文章當中我們將主要分析?OpenMP?當中的?parallel?construct?具體時如何實現(xiàn)的,以及這個?construct?調(diào)用了哪些運行時庫函數(shù),并且詳細分析這期間的參數(shù)傳遞,需要的可以參考一下2023-01-01關(guān)于虛函數(shù)實現(xiàn)多態(tài)的原理及分析
這篇文章主要介紹了C++中如何實現(xiàn)多態(tài)問題,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02C++學(xué)習(xí)之虛函數(shù)表與多態(tài)詳解
這篇文章主要為大家詳細介紹了C++中虛函數(shù)表與多態(tài)的相關(guān)知識,文中的示例代碼講解詳細,對我們學(xué)習(xí)C++有一定的幫助,感興趣的小伙伴可以了解一下2023-03-03C++中CString string char* char 之間的字符轉(zhuǎn)換(多種方法)
在寫程序的時候,我們經(jīng)常遇到各種各樣的類型轉(zhuǎn)換,比如 char* CString string 之間的互相轉(zhuǎn)換,這里簡單為大家介紹一下,需要的朋友可以參考下2017-09-09用C語言模仿Python函數(shù)的一種簡單實現(xiàn)方法
這篇文章主要介紹了用C語言模仿Python函數(shù)的一種簡單實現(xiàn)方法,需要的朋友可以參考下2017-05-05