我一直在努力理解它在 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)正在执行的操作的图表,尽管在我的脑海中仍然有点模糊: