科目B
基本情報技術者試験 科目B サンプル問題(2022年4月公表) 問3
次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。
手続 append は,引数で与えられた文字を単方向リストに追加する手続である。単方向リストの各要素は,クラス ListElement を用いて表現する。クラス ListElement の説明を図に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead は,単方向リストの先頭の要素の参照を格納する。リストが空のときは,listHead は未定義である。
〔図〕 クラス ListElement の説明
〔プログラム〕
| メンバ変数 | 型 | 説明 |
|---|---|---|
| val | 文字型 | リストに格納する文字。 |
| next | ListElement | リストの次の文字を保持するインスタンスの参照。初期状態は未定義である。 |
| コンストラクタ | 説明 |
|---|---|
| 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 の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:ア
覚える知識
単方向リストの末尾への要素追加
単方向リストに末尾から追加するときは、空なら先頭ポインタに新しい要素を入れ、空でなければ next をたどって末尾の要素まで進み、その next に新しい要素の参照を入れる。
この問題で必要なこと
リストが空のとき listHead は未定義なので、a は「未定義」で、新しい要素 curr を先頭にする。空でなければ prev を next が未定義になる要素(末尾)まで進め、その next に新しい要素 curr をつなぐので b は curr。正解はア。
ひっかけ
a を「未定義でない」にすると空でないリストの先頭を上書きしてしまい、条件が逆転する。b の curr.next は新しい要素の next(まだ未定義)なのでつながらない。listHead を入れると循環リストになる。