程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++言語完成hash表詳解及實例代碼

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

編輯:關於C++

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表可以和二叉樹構成復合構造,至於為什麼,建議冤家們好好考慮一下?

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved