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
いた場合、呼び出し元はそれにアクセスしたいと考えた可能性があり、データへのポインターを返すことは、ノードが見つかったかどうかのブール値のインジケーターよりも有用でした。