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)正在做的圖,但它仍然在我的頭有點模糊:
是的,我不明白的是執行「雙向鏈表」 –
@PalaceChan:那麼,每個節點都包含一個指向下一個節點的指針(「下一個指針」),還有一個指向前一個節點的下一個指針。 –
下一個指針是好的,但後者是一個指向前一個節點的雙指針,而不是我可以說的下一個指針。我很困惑這方面,爲什麼一個雙指針,以及如何鏈接/取消鏈接邏輯的作品。 –