科目B

基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問10

次のプログラム中の に入れる正しい答えを,解答群の中から選べ。 手続 delNode は,単方向リストから,引数 pos で指定された位置の要素を削除する手続である。引数 pos は,リストの要素数以下の正の整数とする。リストの先頭の位置を 1 とする。 クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead には,リストの先頭要素の参照があらかじめ格納されている。 表 クラス ListElement のメンバ変数の説明
メンバ変数型説明
val文字型要素の値
nextListElement次の要素の参照 次の要素がないときの状態は未定義
〔プログラム〕
大域: ListElement: listHead  // リストの先頭要素が格納されている

○delNode(整数型: pos)  /* posは,リストの要素数以下の正の整数 */
  ListElement: prev
  整数型: i
  if (pos が 1 と等しい)
    listHead ← listHead.next
  else
    prev ← listHead
    /* posが2と等しいときは繰返し処理を実行しない */
    for (i を 2 から pos - 1 まで 1 ずつ増やす)
      prev ← prev.next
    endfor
    prev.next ←  
  endif
答えを選ぶ

出典:基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問10(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:カ

覚える知識

単方向リストの要素削除(ポインタの付け替え)

単方向リストから要素を削除するには、直前の要素の next を、削除する要素の次の要素に付け替える。

この問題で必要なこと

for の繰返しで prev は pos−1 番目の要素になる。削除する pos 番目は prev.next なので、その次の要素 prev.next.next を prev.next に入れて飛ばす。正解はカ。

ひっかけ

prev.next を自分自身に代入しても何も変わらない(オ)。listHead を基準にすると pos≥3 のときに位置がずれる(ア〜ウ)。