0

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

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.

4

1 回答 1

2

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

情况1

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

案例二

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,如果 Node 包含的不仅仅是value键,那么调用者可能想要访问它并返回指向数据的指针会比是否找到节点的布尔指示符更有用。

于 2012-06-06T04:48:23.020 回答