サンプル問題 [科目B]問10
問10
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
手続 delNode は,単方向リストから,引数 pos で指定された位置の要素を削除する手続である。引数 pos は,リストの要素数以下の正の整数とする。リストの先頭の位置を1とする。
クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead には,リストの先頭要素の参照があらかじめ格納されている。〔プログラム〕
手続 delNode は,単方向リストから,引数 pos で指定された位置の要素を削除する手続である。引数 pos は,リストの要素数以下の正の整数とする。リストの先頭の位置を1とする。
クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead には,リストの先頭要素の参照があらかじめ格納されている。〔プログラム〕
- listHead
- listHead.next
- listHead.next.next
- prev
- prev.next
- prev.next.next
分類
アルゴリズムとプログラミング » データ構造及びアルゴリズム
正解
カ
解説
リスト構造は、隣接するデータ同士を参照(ポインタ)で連結して表現するデータ構造です。本問の単方向リストとは、下図のように最初の要素から最後の要素までが1方向に連結されたものです。リスト構造では、要素を削除すると要素同士のつながりが途中で途切れてしまうため、要素を削除する際には、削除する要素の1つ前の参照を付け替える操作が必要となります。プログラムを見て見てみるとposが1と等しいという条件式で処理を分岐させています。pos = 1、すなわち1番目の要素を削除するときに行っている処理は、listHead に listHead.next を代入するというものです。これは先頭要素の次の要素、つまり2番目の要素を先頭要素に置き換える操作です。これにより1番目の要素はリストから離脱することになり、削除されます。else文では1番目以外の要素を削除するときの処理を行います。
- posが2のとき
- 変数 prev の初期値である先頭要素をそのまま prev として使う
- posが3以上のとき
- 3番目の要素を削除する場合、prev に2番目の要素を格納したいので1回、4番目の要素を削除する場合、prev に3番目の要素を格納したいので2回、というように pos - 2 回分だけポインタを移動して、prev に削除対象の要素のひとつ前の要素を設定する