科目B

基本情報技術者試験 科目B サンプル問題(2022年4月公表) 問3

次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。 手続 append は,引数で与えられた文字を単方向リストに追加する手続である。単方向リストの各要素は,クラス ListElement を用いて表現する。クラス ListElement の説明を図に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead は,単方向リストの先頭の要素の参照を格納する。リストが空のときは,listHead は未定義である。 〔図〕 クラス ListElement の説明
メンバ変数型説明
val文字型リストに格納する文字。
nextListElementリストの次の文字を保持するインスタンスの参照。初期状態は未定義である。
コンストラクタ説明
ListElement(文字型: qVal)引数 qVal でメンバ変数 val を初期化する。
〔プログラム〕
大域: ListElement: listHead ← 未定義の値

○append(文字型: qVal)
  ListElement: prev, curr
  curr ← ListElement(qVal)
  if (listHead が a)
    listHead ← curr
  else
    prev ← listHead
    while (prev.next が 未定義でない)
      prev ← prev.next
    endwhile
    prev.next ← b
  endif
答えを選ぶ

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

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

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

答えと解説を見る

正解:ア

覚える知識

単方向リストの末尾への要素追加

単方向リストに末尾から追加するときは、空なら先頭ポインタに新しい要素を入れ、空でなければ next をたどって末尾の要素まで進み、その next に新しい要素の参照を入れる。

この問題で必要なこと

リストが空のとき listHead は未定義なので、a は「未定義」で、新しい要素 curr を先頭にする。空でなければ prev を next が未定義になる要素(末尾)まで進め、その next に新しい要素 curr をつなぐので b は curr。正解はア。

ひっかけ

a を「未定義でない」にすると空でないリストの先頭を上書きしてしまい、条件が逆転する。b の curr.next は新しい要素の next(まだ未定義)なのでつながらない。listHead を入れると循環リストになる。