基本情報技術者試験の科目Bのサンプル問題を題材に,単方向リストへの要素の追加について学習します。この問題では,参照をたどってリストの末尾を探し,新しい要素を追加する処理を確認します。
(令和4年度4月公開) 基本情報技術者試験 サンプル問題 科目B 問3
問 次のプログラム中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。
手続 append は,引数で与えられた文字を単方向リストに追加する手続である。単方向リストの各要素は,クラス ListElement を用いて表現する。クラス ListElement の説明を図に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead は,単方向リストの先頭の要素の参照を格納する。リストが空のときは,listHead は未定義である。
〔プログラム〕
大域: 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
解答群
a | b | |
| ア | 未定義 | curr |
| イ | 未定義 | curr.next |
| ウ | 未定義 | listHead |
| エ | 未定義でない | curr |
| オ | 未定義でない | curr.next |
| カ | 未定義でない | listHead |
【解答】ア
【解説】
ListElement は,データ(val)と次の要素への参照(next)を持つクラスである。手続 append は,引数で与えられた文字を単方向リストの末尾に追加する。
リストが空の場合は,listHead が未定義である。そのため,listHead ← curr として,新しく作成した要素を先頭にする。よって,a は未定義である。
リストが空でない場合は,prev ← listHead から始め,prev.next を順番にたどって末尾の要素を探す。末尾の要素では next が未定義なので,そこで探索を終了する。その後,末尾の要素の next に,新しく作成した要素 curr への参照を設定する。したがって,b は curr である。
【参考】
この問題のポイント
この問題から学べることは,
- 単方向リストの基本的な構造
- val と next を使ってリストの要素を表現する方法
- 参照をたどってリストの末尾を探す方法
- リストの末尾に新しい要素を追加する方法
- トレース表を使って,リストの要素や参照の変化を追跡する方法
です。特に,prev.next を順番にたどって末尾の要素を探し,その next に新しい要素への参照を設定する処理を理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


