今回は以下の問題を解いてみたいと思います。個人的には初見では疑問点が多すぎて時間がかかりそうだったので解説を見るも腹落ちできなかった問題です(苦笑)理解できると意外と簡単だったという問題ですが、どうして初見でそれがわかるの?という疑問も残っていたりします。


リストの要素を削除するというプログラムを完成させなさいという問題ですね。リストがよくわからないという方は「リストとは」をまずご参照ください。
プログラム解説
上記のプログラムに解説を加えていきます。なお今回は仮リストとして以下を当てはめながら考えてみます。

1行目はグローバル変数としてlistHeadという変数をListElementの型で宣言しています。問題文にもあるようにlistHeadの初期値はピザになります。
2行目は関数の宣言です。delNode(pos)という関数を宣言しています。引数のposという変数で削除する要素の位置を指定しています。今回はposを3として考えてみます。
※この時の3は最初から数えて3番目という意味です。たまたまアドレスも3になってしまってわかりにくくなってしまったので補足しておきます。
3行目ですがprevという変数がListElementという型で宣言されています。これはprevious(前の) という意味の略で現在の要素の前の要素が格納されるという意味だと思います。
4行目は後で使用するfor文(繰り返し文)用の変数です。
5行目で削除する場所が1(今回でいえばピザ)かどうかを確認しています。今回はposが3なので7行目まで飛びます。
6行目は削除する場所が1だった場合、listHeadにやき肉を上書きします。今回はposが3なので飛ばします。
7行目以下は5行目の判定で削除する場合が1以外だった場合の処理です。今回は3なので以下処理をしていきます。
8行目でprevにピザが代入されました。
9行目はコメントでfor文の解説です。
10行目でfor文を実行します。最初のiの値は2です。そして3-1 = 2なので1回のみ実行します。
11行目でピザの次の要素やき肉をprevに代入します。
12行目で今回の条件が満たされたのでfor文が終了です。
13行目今回のposが3ということは以下のようにしたいわけですね。

なので回答の中を確認するとカのprev.next.nextが良さそうです。
ではprev.next.nextを確認してみましょう。現在prevには11行目で代入されたやき肉が入っています。するとprev.next.nextはからあげになります。そしてprev.next(つまりやき肉の後ろ)に代入すると上記の図のように削除が実行されます。削除の動作についてはリストの記事をご参照ください。
所感
こちら余程リストやポインタに慣れていないと図を書くまで理解するのが難しいのではないでしょうか?私も図を書いて実際にトレースすることで理解することができましたので、さらに理解を深めたい方は自分なりのリストを作成してみるのも良いと思います。
コメントを残す