基本情報技術者

問4

基本情報技術者試験過去問 令和8年度(2026年)科目B問4

次のプログラム中のabに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は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]となります。

不正解

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を得られます。

Point

配列dataListとpointerListで表現した単方向リストを、先頭から順にたどる処理を理解することが目的です。具体的には、現在の要素番号pから値を取り出す方法、次の要素番号への進み方、末尾を未定義で判定する方法を確認します。

解くために必要な知識

この問題を解くには、配列で表現した単方向リストの走査と、末尾の判定方法の理解が必要です。

用語の整理

用語 意味
単方向リスト 各要素が「値」と「次の要素を示す情報」を持ち、先頭から順にたどれるデータ構造です。
dataList 各要素の値を格納する配列です。
pointerList 各要素の次の要素番号を格納する配列です。
要素番号p 現在参照している要素の位置(番号)です。
未定義 値が設定されていない状態です。この問題では末尾の判定に使います。

配列で表す単方向リストの読み方

現在の要素の値

  • 現在の要素番号をpとすると、値はdataList[p]です。

次の要素番号

  • 次の要素番号はpointerList[p]です。

末尾の判定

  • 末尾の要素ではpointerList[p]が未定義です。

  • そのため、pointerList[p]が未定義かどうかで末尾を判定するのが原則です。

走査処理の基本形

以下の順で処理します。

  1. linearListにdataList[p]を追加します。

  2. pointerList[p]が未定義なら終了します。

  3. 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]となります。

順次、単語を追加予定です。もうしばらくお待ちください。