使用哈希表删除功能时,会少删除一个数据



我使用一个具有单独链接的哈希表创建了一个项目。现在,对于我的删除功能,有一个小问题,有时当一个尝试删除一个节点时,它总是比它应该删除的少1个节点;人;哥伦比亚的对象,然后我预计有56个数据被删除,但只有55个被删除。当我再次尝试删除时,它意识到还剩1个,并删除了它。所以每次它删除的数据都比它应该删除的少一个。如果我的实现有问题,请告诉我。

void HashMap::deleteByString(string toDelete)
{
bool haveDeleted = false;
int totalDeleted = 0;
auto start = chrono::steady_clock::now();
for (int i = 0; i < buckets; i++) {
Node* current = hashTable[i];
Node* previous = NULL;
while (current && current->data.getCountry() != toDelete) {
previous = current;
current = current->next;
}
if (current) {
if (previous) {
previous->next = current->next;
haveDeleted = true;
delete current;
++totalDeleted;
}
else {
hashTable[i] = current->next;
haveDeleted = true;
delete current;
++totalDeleted;
}
}
}
}

由于deleteByString在其参数上不使用哈希函数的情况下迭代所有内容,因此我们可以假设国家不是哈希键,因此在一个bucket中可以有任意多个具有相同国家的项目。在这种情况下,当你找到其中一个时,你不能就这样退出你的内环。

以下内容应该是您想要的:

void deleteByString(std::string toDelete)
{
for (int i = 0; i < buckets; i++) {
Node* current = hashTable[i];
Node* previous = NULL;
while (current) {
if ( current->data.getCountry() != toDelete) {
previous = current;
current = current->next;
} else {
if (previous) {
previous->next = current->next;
auto temp = current;
current = previous->next;
delete temp;
} else {
hashTable[i] = current->next;
auto temp = current;
current = hashTable[i];
delete temp;
}
}
}
}
}

基本上,由于迭代在删除后仍在继续,您现在需要确保previouscurrent在删除过程中得到正确维护。

最新更新