2012-09-27 51 views
0

我一直在努力去理解gdb在一段時間內如何工作,但我很難理解它。基本上有一個數組(elements_),其中的東西被哈希,這些東西是指向包含用於鏈接的某些鉤子的結構的指針。這裏有一個簡單的結構:這個插入和刪除哈希表的工作是如何進行的?

struct foo 
{ 
    Data data; 
    foo* next; 
    foo** prevNext; 
}; 

那麼哈希表獲取與

HashTable<foo> hash; 

實例化,並且它的插入功能看起來像這樣(我忽略,則調整大小和所有爲簡單起見)

template <class T> 
void HashTable<T>::insert(T* x) 
{ 
    int bucket = hashFunc(x->data); 
    T** xPtr = &elements_[bucket]; 
    x->next  = *xPtr; 
    x->prevNext = xPtr; 

    if (x->next) 
     x->next->prevNext = &x->next; 

    *xPtr = x; 
} 

和刪除如下

template<class T> 
void HashTable<T>::remove(T* x) 
{ 
    if (x->next) 
     x->next->prevNext = x->prevNext; 

    *x->prevNext = x->next; 
} 

以供參考搜索它的方式是這樣的:

template<class T> 
T* HashTable<T>::find(Data& data) 
{ 
    int bucket = hashFunc(data); 

    T* ptr = elements_[bucket]; 
    while (ptr != 0) 
    { 
     if(ptr->data == data) 
      return ptr; 
     ptr = ptr->next; 
    } 
    return 0; 
} 

我一直在試圖按照2-3碰撞元素插入(通過設置表的大小要小到開始)和刪除看邏輯是什麼,但我不理解它。這裏是什麼,我想刪除操作(刪除節點2)正在做的圖,但它仍然在我的頭有點模糊:

enter image description here

回答

1

元素落入同一個桶中存儲爲一個雙鏈接列表(排序)。

查找遍歷該列表,直到找到與值匹配的元素data

+0

是的,我不明白的是執行「雙向鏈表」 –

+0

@PalaceChan:那麼,每個節點都包含一個指向下一個節點的指針(「下一個指針」),還有一個指向前一個節點的下一個指針。 –

+0

下一個指針是好的,但後者是一個指向前一個節點的雙指針,而不是我可以說的下一個指針。我很困惑這方面,爲什麼一個雙指針,以及如何鏈接/取消鏈接邏輯的作品。 –

相關問題