C++言語完成hash表詳解及實例代碼。本站提示廣大學習愛好者:(C++言語完成hash表詳解及實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C++言語完成hash表詳解及實例代碼正文
C++言語完成hash表詳解
概要:
hash表,有時分也被稱為散列表。團體以為,hash表是介於鏈表和二叉樹之間的一種兩頭構造。鏈表運用非常方便,但是數據查找非常費事;二叉樹中的數據嚴厲有序,但是這是以多一個指針作為代價的後果。hash表既滿足了數據的查找方便,同時不占用太多的內容空間,運用也非常方便。
打個比如來說,一切的數據就仿佛許許多多的書本。假如這些書本是一本一本堆起來的,就仿佛鏈表或許線性表一樣,整個數據會顯得十分的無序和混亂,在你找到自己需求的書之前,你要閱歷許多的查詢進程;而假如你對一切的書本停止編號,並且把這些書本按次第停止陳列的話,那麼假如你要尋覓的書本編號是n,那麼經過二分查找,你很快就會找到自己需求的書本;但是假如你每一個品種的書本都不是很多,那麼你就可以對這些書本停止歸類,哪些是文學類,哪些是藝術類,哪些是工科的,哪些是文科的,你只需對這些書本停止復雜的歸類,那麼尋覓一本書也會變得十分復雜,比方說假如你要找的書是計算機方面的書,那麼你就會到工科一類當中去尋覓,這樣查找起來也會顯得費事。
不知道這樣舉例你清楚了沒有,下面提到的歸類辦法其實就是hash表的實質。上面我們可以寫一個復雜的hash操作代碼。
a)定義hash表和根本數據節點
typedef struct _NODE { int data; struct _NODE* next; }NODE; typedef struct _HASH_TABLE { NODE* value[10]; }HASH_TABLE;
b)創立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表當中尋覓數據
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表當中拔出數據
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表中刪除數據
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; }
總結:
1、hash表不復雜,我們在開發中也常常運用,建議冤家們好好掌握;
2、hash表可以和二叉樹構成復合構造,至於為什麼,建議冤家們好好考慮一下?
感激閱讀,希望能協助到大家,謝謝大家對本站的支持!