国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++語言實現hash表詳解及實例代碼

2020-05-23 13:54:05
字體:
來源:轉載
供稿:網友

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表可以和二叉樹形成復合結構,至于為什么,建議朋友們好好思考一下?

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西平县| 苍南县| 璧山县| 祁阳县| 富蕴县| 浏阳市| 武宣县| 澄江县| 洛阳市| 赣榆县| 德令哈市| 盐城市| 怀集县| 剑阁县| 顺义区| 封开县| 宁德市| 万源市| 小金县| 台北县| 锡林浩特市| 视频| 雅安市| 巴彦县| 耿马| 广昌县| 体育| 鄢陵县| 通山县| 大厂| 兰溪市| 阳朔县| 岢岚县| 临武县| 理塘县| 安庆市| 石嘴山市| 鹤庆县| 慈溪市| 伽师县| 时尚|