2017-10-18 17 views
0

私はプログラムを書いて、それは動作しますが、私はそれをすべきではないと思います。誰かがそれがなぜ機能するのか説明できますか?私の再帰的リンクリスト削除機能がなぜ機能するのかよくわからないのですか?説明が大好きです

私は単独でリンクされたリストを持っています。私は直接コードが、病気の変化ビット

問題は私のリンクリストを貸し付けを投稿傾けるように、このプロジェクトのために、数字1、2のリストである3、4、4、5

私がする必要がありますリストをスキャンして重複を削除するには、4つのうちの1つを削除する必要があります。そして私は再帰を介してそれを行う必要があります。

私が書いている関数は、リストの先頭へのポインタとして引数/パラメータがあり、私は

//Base cases up here 
if (pointer->value == pointer->next->value){ 
    *toDelete = pointer; 
    pointer = pointer->next; 
    delete toDelete; 
    recur the function 
} else recur(pointer->next); 

このポインタを呼ぶ今、このコードは動作し、私はそれが理由だと思いますいけません私は、ノードiを削除した後に前のノードを接続しません。まだ結果を見ると、すべての適切なノードが接続され、削除されるはずのものはすべて削除されます。私はここで何か誤解していますか? ポインタ=ポインタ - >次のは、次のノードのアドレスにポインタを指すだけではありませんか?

ありがとうございます!

+0

こんにちは、完全なコードを投稿できますか?私たちは、あなたが何かを省いている場合、あなたがしていること、あるいはしていないことを話すことはできません。 – Stefan

+0

あなたが(*本当に*)単一リンクリストデータ構造を望んでいるなら、$ DEITYが好きな人は 'std :: forward_list'を使い、それを使ってください。お願いします。ホイールをひどく改造しないでください。さらに良いことに、 'std :: vector'を使うだけです。アルゴリズムの複雑さや他の理論的な事柄にかかわらず、いつもより実生活の状況において、より良いことが起こりそうです。 –

+1

@JesperJuhl残念ながら、私は割り当てが指示するようにそれをしなければならない。私の選択ではありません。 – Duxa

答えて

0

このコードは機能します。ノードが削除された後に以前のノードを接続しないため、このコードを実行する必要はありません。

これは正しいです。あなたの関数は動作するように見えるかもしれませんが、実際には未定義の動作の兆候を示しています。あなたは以下を使用する必要があります:

if (pointer->next != nullptr && pointer->value == pointer->next->value){ 
    auto toDelete = pointer->next; 
    pointer->next = pointer->next->next; 
    delete toDelete; 

    // Recurse with the same pointer since you might have 4 4 4 
    // in the original list. 
    recur(pointer); 
} 
else {  
    recur(pointer->next); 
} 
+0

ありがとうございます。それは私が書いていることについて考えていたことです(リストの最初と最後から取り除きます)。しかし、なぜ私の実装がうまくいったのかわかりませんでした:/ – Duxa

+0

@Duxa、あなたは大歓迎です。 –

関連する問題