サンプル問題 [科目B]問10

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。

 手続 delNode は,単方向リストから,引数 pos で指定された位置の要素を削除する手続である。引数 pos は,リストの要素数以下の正の整数とする。リストの先頭の位置を1とする。
 クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead には,リストの先頭要素の参照があらかじめ格納されている。
b10_1.png
〔プログラム〕
b10_2.png

  • listHead
  • listHead.next
  • listHead.next.next
  • prev
  • prev.next
  • prev.next.next
正解 問題へ
分野:アルゴリズムとプログラミング
カテゴリ:データ構造及びアルゴリズム
解説
リスト構造は、隣接するデータ同士を参照(ポインタ)で連結して表現するデータ構造です。本問の単方向リストとは、下図のように最初の要素から最後の要素までが1方向に連結されたものです。
b10_3.png
リスト構造では、要素を削除すると要素同士のつながりが途中で途切れてしまうため、要素を削除する際には、削除する要素の1つ前の参照を付け替える操作が必要となります。
b10_4.png
プログラムを見て見てみるとposが1と等しいという条件式で処理を分岐させています。pos = 1、すなわち1番目の要素を削除するときに行っている処理は、listHead に listHead.next を代入するというものです。これは先頭要素の次の要素、つまり2番目の要素を先頭要素に置き換える操作です。これにより1番目の要素はリストから離脱することになり、削除されます。
b10_5.png
else文では1番目以外の要素を削除するときの処理を行います。
posが2のとき
変数 prev の初期値である先頭要素をそのまま prev として使う
posが3以上のとき
3番目の要素を削除する場合、prev に2番目の要素を格納したいので1回、4番目の要素を削除する場合、prev に3番目の要素を格納したいので2回、というように pos - 2 回分だけポインタを移動して、prev に削除対象の要素のひとつ前の要素を設定する
空欄を含む処理は、prev.next(削除対象の要素への参照)を付け替える操作です。前述のとおり、リスト要素の削除は、削除対象の要素をリストの連結から外すことによって行うので、削除対象の要素のひとつ後ろの要素への参照を設定することになります。削除対象の要素(prev.next)の次(next)ですからprev.next.nextが適切となります。

Pagetop