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]エントリが 1 つしかないリストを削除する場合は、 に変更する必要がありますNULL。しかし、このリストが一重リンクか二重リンクかはわかりません。ノードにも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

return 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-06-06T04:48:23.020 に答える