基本情報技術者試験過去問 令和8年度(2026年)科目B問4
次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
単方向リストを,配列dataListと配列pointerListの二つの配列で表現する。
dataListにリストの要素の値を格納し,pointerListにリストの次の要素に対応するdataListの要素番号を格納する。単方向リストの先頭は,dataList[1]及びpointerList[1]の組みである。単方向リストの末尾に対応するpointerListの要素は未定義である。dataListのうち単方向リストの要素の値を格納していない要素と,対応するpointerListの要素は未定義である。
プログラムが扱うdataList及びpointerListの内容を図1に示す。先頭の次の要素の要素番号は,pointerList[1]に格納された3であり,値はdataList[3]に格納された20である。その次の要素の要素番号はpointerList[3]に格納された2であり,値はdataList[2]に格納された30である。

関数orderListは,図1のdataList及びpointerListで表現した単方向リストの値を,単方向リストの先頭からたどって順番に格納した配列を返す。関数orderListが返す配列を図2に示す。

-----------
〔プログラム〕
大域: 整数型の配列: dataList ← {10, 30, 20, 40, 未定義の値}
大域: 整数型の配列: pointerList ← {3, 4, 2, 未定義の値, 未定義の値}
○整数型の配列: orderList()
整数型: i, p ← 1
整数型の配列: linearList ← {} // 要素数0の配列
for (iを1からdataListの要素数まで1ずつ増やす)
linearListの末尾にdataList[p]の値を追加する
if (aが未定義)
繰返し処理を終了する
endif
p ← b
endfor
return linearList
-----------

選択肢
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
この単方向リストでは、値はdataList[p]にあり、次の要素番号はpointerList[p]にあります。末尾ではpointerList[p]が未定義になるため、aをpointerList[p]にして未定義かどうかで終了判定を行い、次に進むためにpをpointerList[p]で更新する必要があります。したがって、a = pointerList[p]、b = pointerList[p]となります。
Point
配列dataListとpointerListで表現した単方向リストを、先頭から順にたどる処理を理解することが目的です。具体的には、現在の要素番号pから値を取り出す方法、次の要素番号への進み方、末尾を未定義で判定する方法を確認します。
解くために必要な知識
この問題を解くには、配列で表現した単方向リストの走査と、末尾の判定方法の理解が必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| 単方向リスト | 各要素が「値」と「次の要素を示す情報」を持ち、先頭から順にたどれるデータ構造です。 |
| dataList | 各要素の値を格納する配列です。 |
| pointerList | 各要素の次の要素番号を格納する配列です。 |
| 要素番号p | 現在参照している要素の位置(番号)です。 |
| 未定義 | 値が設定されていない状態です。この問題では末尾の判定に使います。 |
配列で表す単方向リストの読み方
現在の要素の値
- 現在の要素番号をpとすると、値はdataList[p]です。
次の要素番号
- 次の要素番号はpointerList[p]です。
末尾の判定
-
末尾の要素ではpointerList[p]が未定義です。
-
そのため、pointerList[p]が未定義かどうかで末尾を判定するのが原則です。
走査処理の基本形
以下の順で処理します。
-
linearListにdataList[p]を追加します。
-
pointerList[p]が未定義なら終了します。
-
p = pointerList[p]として次へ進みます。
問題の解法手順
解く手順
1. 配列で表現した単方向リストの定義を確認します
-
値はdataListに格納されます。
-
次の要素番号はpointerListに格納されます。
-
末尾のpointerListの要素は未定義です。
2. 変数pの役割を確認します
pは、現在参照している要素番号です。初期値はp = 1なので、先頭要素から開始します。
3. linearListに追加している値を確認します
毎回、dataList[p]をlinearListに追加しています。よって、次に進むためにはpを次の要素番号に更新する必要があります。
4. 次の要素番号の取得と更新式bを決めます
次の要素番号はpointerList[p]なので、更新は次の形になります。
- p ← pointerList[p]
したがって、bはpointerList[p]です。
5. 終了判定aを決めます
末尾ではpointerList[p]が未定義なので、次の要素番号が未定義なら終了するのが適切です。
- if (pointerList[p]が未定義) 繰返し処理を終了
したがって、aはpointerList[p]です。
6. aとbの組合せを確定します
-
a = pointerList[p]
-
b = pointerList[p]
よって正解は「エ」です。
選択肢ごとの解説
- ア:不正解
aがdataList[p]だと、末尾判定を「値が未定義かどうか」で行うことになります。しかし、この問題では末尾の判定条件はpointerList[p]が未定義であることです。また、bがiだと配列の要素番号を1,2,3...の順に進めてしまい、pointerListによるつながり(1→3→2→4)をたどれません。
- イ:不正解
bがpointerList[p]なので次へ進む更新は適切です。しかし、aがdataList[p]だと末尾を「値が未定義かどうか」で判定してしまいます。末尾かどうかはpointerList[p]が未定義かで決まるため、不適切です。
- ウ:不正解
aがpointerList[p]なので末尾判定は適切です。しかし、bがiだと配列の要素番号を順番に進めてしまい、pointerListによるリストの順序(1→3→2→4)をたどれません。
- エ:正解
aをpointerList[p]にすると、次の要素番号が未定義のときに末尾として終了できます。bをpointerList[p]にすると、p = pointerList[p]で次の要素へ進めます。したがって、先頭から順に10,20,30,40を得られます。
まとめ
この単方向リストでは、値はdataList[p]にあり、次の要素番号はpointerList[p]にあります。末尾ではpointerList[p]が未定義になるため、aをpointerList[p]にして未定義かどうかで終了判定を行い、次に進むためにpをpointerList[p]で更新する必要があります。したがって、a = pointerList[p]、b = pointerList[p]となります。
aがdataList[p]だと、末尾判定を「値が未定義かどうか」で行うことになります。しかし、この問題では末尾の判定条件はpointerList[p]が未定義であることです。また、bがiだと配列の要素番号を1,2,3...の順に進めてしまい、pointerListによるつながり(1→3→2→4)をたどれません。
bがpointerList[p]なので次へ進む更新は適切です。しかし、aがdataList[p]だと末尾を「値が未定義かどうか」で判定してしまいます。末尾かどうかはpointerList[p]が未定義かで決まるため、不適切です。
aがpointerList[p]なので末尾判定は適切です。しかし、bがiだと配列の要素番号を順番に進めてしまい、pointerListによるリストの順序(1→3→2→4)をたどれません。
aをpointerList[p]にすると、次の要素番号が未定義のときに末尾として終了できます。bをpointerList[p]にすると、p = pointerList[p]で次の要素へ進めます。したがって、先頭から順に10,20,30,40を得られます。