2016-05-04 11 views
1

二重リンクされたリストのp(データ値14)が指すノードを適切に削除するコードフラグメントを記述します。二重リンクリスト:リストの途中で何かを追加することを適切に削除しますか?

(1)左

上のノードに右側のprevious要素点にノードを作成します。私はこれを行う方法のアイデアを持っていると思います

enter image description here

(2)左側のノードnextが右側のノードを指すようにする

(3)ノードの要素をpがNULLを指していて削除しています。

しかし、私はコードでこれを書く方法を忘れていました(これはしばらくありました)。私はそれがこのようなものになるだろう考えていた(次の* Iは、ノードを仮定しているint型のデータを保持している構造体であり、ノード、およびノー​​ド*以前):

node* x = p->next; 
node* y = p->previous; 
x->previous = y; 
y->next = x; 
p->previous = nullptr; 
p->next = nullptr; 
delete p; 
x->previous = y; 

は、挿入するために、コードの断片を書きます14〜16のノード(同じピクチャ):

node *x = p->next; 
node y; 
y->previous = x->previous; 
y->next = p->next; 
x->previous = y; 
p->next = y; 

これは問題ありませんか?

答えて

1

削除コードは大丈夫です。お知らせ、しかし、いくつかのこと:あなたが一貫性のないネーミングを使用している

  1. leftpreviousをする必要があります)。
  2. pのフィールドをnullptrに設定する必要はありません。あなたはそれを削除するつもりです。
  3. 最後のx->previous = yは、あなたが望むものではないこの "循環"を作ります!

これは、より良い近似のようになります。

node *x = p->next; 
node *y = p->previous; 
x->previous = y; 
y->next = x; 
delete p; 

ただし、これは警告があります:リストはシングルトンである場合はどうなりますか?つまり、p?のみです。 p->nextp->previousの両方がNULLになるため、xyへの割り当てはエラーになります。 (最初または最後の要素であることが、同じ問題を引き起こすことに気づくでしょう。

コードの2番目の部分は少し問題がある:最初に、あなたのコードがコンパイルされませんそのすべての

  1. お知らせ:yが可変である、とあなたはy->を通してそれをデリファレンスしています。これは、ポインタ[1]に対してのみ実行できる操作です。この問題は実際にはyがスタックに置かれているという意味でより深刻です。つまり、&yを使用してポインタを取得すると、リンクされたリスト内で未定義の動作が発生します。
  2. y->previous = x->previous;y->previous = p
  3. y->next = p->next;に簡略化することができ、それらの修正でy->next = x

に簡略化することができ、これはに変わるだろう:

node *y = new node(); 
y->previous = p; 
y->next = p->next; 
p->next->previous = y; 
p->next = y; 

お知らせ、しかし、その再びこれはしていませんpがリストの最後を指しているケースを処理してください! (p->next->previous = yの場合はどうなりますか?)、それを修正する必要があります。また、pが最後ではなくリストの先頭を指しているかどうかは重要ですか?それはどうしたらいいですか?

唯一の実際の問題はダイナミックメモリの問題であり、残りの修正は単なる読みやすさの補正です。 「読みやすさ」は個人的な好みですが、できるだけコードを明確にするようにしてください。

[1]実際にoperator->()オーバーロードを使用している場合を除き、あなたはそうではないと思います。

+1

詳細な対応をありがとうございます。あなたの説明は非常に良く分かりやすいです。申し訳ありませんが(私は過去の代わりに 'left'を使用しています)、私は過去2週間のバイナリ検索ツリーを勉強していましたので、そこにうんざりしているはずです:P – StacksAndParsing

+0

ハハ、問題ありません! :)。あなたが理解しやすいことを知って良かったです。 –

関連する問題