【问题标题】:Deleting a value in a hash table using chaining使用链接删除哈希表中的值
【发布时间】:2012-11-05 06:19:00
【问题描述】:

我有一个在哈希表中搜索值的函数:

bool search(int n, Node* hashtable[]) {
    int x = n % 10;
    Node * temp;
    for (temp = hashtable[x]; temp != NULL; temp = temp->next) {
        if (temp->value == n) {
            return true;
        }
    }
    return false;
}

如何创建一个删除hashtable 中的值的函数?
我猜我必须将return true; 部分更改为以下内容: “好的,删除那个值,但是那个链表中的其他值呢?”

例如,我有112 -> 1112 -> 111112,我想删除1112

【问题讨论】:

    标签: c++ arrays hash


    【解决方案1】:

    要删除单链表中的某些内容,您必须让指向它的链接指向下一个元素或NULL(如果删除最后一个元素)。删除只有一个条目的列表时,需要将hashtable[n] 更改为NULL。但是,我们无法判断此列表是单链接还是双链接。如果 Node 也有 prev 指针,您还需要以类似的方式更正它。我的建议是把你需要处理的案例写在纸上,思考一下指针的移动方式。

    案例 1

    hashtable[n] -> Node-to-delete -> NULL
    

    案例 2

    hashtable[n] -> Node -> Node-to-delete -> NULL
    

    案例 3

    hashtable[n] -> Node-to-delete -> Node -> NULL
    

    案例 4

    hashtable[n] -> Node -> Node-to-delete -> Node -> NULL
    

    我猜我必须更改返回 true;部分内容是:“好的,删除那个值,但是那个链表中的其他值呢?”

    如果调用代码要求删除列表中的值,它可能想要也可能不想验证是否找到了该元素。如果您想为调用者提供洞察力,那么您仍然可以返回 true 或 false。最好使用枚举来明确返回值的导入:

    enum Result { Element_Found_And_Deleted, Element_Not_Found };
    
    Result delete(int n, Node* hashtable[]);
    
    // client usage:
    if (delete(4, my_hashtable) != Element_Found_And_Deleted)
        FATAL("element not found - code must be broken");
    ...if applicable, or perhaps...
    if (delete(4, my_hashtable) != Element_Found_And_Deleted)
        std::cout << "hey, you haven't added that value yet\n";
    

    对于search,如果节点包含的内容不只是value 键,那么调用者可能想要访问它并返回一个指向数据的指针会比一个布尔指示符更有用找到了。

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2021-04-06
      • 2013-09-17
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      相关资源
      最近更新 更多