删除功能删除哈希表中的所有节点

时间:2015-08-01 20:38:15

标签: c++ hashtable

我在下面有一些代码来从哈希表中删除一个条目。当我运行代码时,程序不会崩溃,而是我需要删除元素的特定存储桶中的所有节点都被删除。 插入和删除元素的数量应该是应该的。

样品

删除之前。 节点数= 11

Bucket[0]
Node01, Node02, Node03

Bucket[1]
Node11, Node12, Node13, Node14

Bucket[2]
Node21, Node22

Bucket[3]
EMPTY

Bucket[4]
Node41, Node42

删除Node12

哈希表成为。 节点数= 10

Bucket[0]
Node01, Node02, Node03

Bucket[1]
EMPTY //This should be Node11, Node13, Node14

Bucket[2]
Node21, Node22

Bucket[3]
EMPTY

Bucket[4]
Node41, Node42

删除方法

 void HashT::Remove(string key)
    {
        size_t index = HashFunc(key);
        if (table[index] != NULL)
        {
            node* prev = NULL;
            node* curr = table[index];
            while (curr->next != NULL && entry->item.GetKey() != key)
            {
                prev = curr;
                curr = curr->next;
            }
            if (curr->item.GetKey() == key)
            {
                node* nextEntry = curr->next;
                table[index] = nextEntry;
                delete entry;
                size--;
                cout << "Removed\n";
            }
        }
    }

我使用此函数插入​​哈希表

void HashT::Ins(Data& data)
{
    size_t index = HashFunc(data.GetKey());
    node * newData = new node(data);
    if(table[index] != NULL && table[index]->item.GetKey() == data.GetKey())
        cout << "Do nothing\n";
    else
        newData->next = table[index];
        table[index] = newData;
        size++;
}

在main()中调用Remove看起来像这样

HashT ht(cout);
ht.Ins(Data(node1));
ht.Ins(Data(node2));
ht.Ins(Data(node3));
ht.Ins(Data(node4));

ht.Remove("string3"); //This does not work

ht.Ins(Data(node5));
ht.Ins(Data(node6));
ht.Ins(Data(node7));
ht.Ins(Data(node8));

ht.Remove("string2"); //This Works
ht.Remove("string5"); //This doesnt work

1 个答案:

答案 0 :(得分:1)

我建议进行以下更改:

void HashT::Remove(string key)
    {
        size_t index = HashFunc(key);
        if (table[index] != NULL)
        {
            node* prev = NULL;
            node* curr = table[index];
            while (curr->next != NULL && entry->item.GetKey() != key)
            {
                prev = curr;
                curr = curr->next;
            }
            if (curr->item.GetKey() == key) // change (1) !!!!
            {
                node* nextEntry = curr->next;
                if (prev)                      // change 2 !!!!
                   prev->next = nextEntry;     // change 2 !!!!
                else table[index] = nextEntry; // change 2 !!!
                delete entry;
                size--;
                cout << "Removed\n";
            }
            else if (curr->next!=NULL)            // change 1 !!!
                cout << "Not found in bucket\n";  // change 1 !!!
        }
    }

更改2:仅当找到的元素是存储桶中的第一个元素时,才应更新表[index]。在所有其他情况下,它是经典的元素删除,您将前一个元素的下一个指针更改为下一个元素(经典链表更新)。

编辑: 我之前的更改1被初始entry误导,对不起。我已对其进行了更新,以明确说明在存储桶中找不到商品的情况。