次のプログラム中の 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に示す。

リストは次ポインタの未定義で終端を判定して進む

頻出基本情報技術者試験2026年度 公開問題 科目B4/アルゴリズムとプログラミング / データ構造

図1: dataList(要素番号1〜5)は 10, 30, 20, 40, (網掛け=未定義)。pointerList(要素番号1〜5)は 3, 4, 2, (網掛け=未定義), (網掛け=未定義)。網掛けはその要素が未定義であることを示す。図2: 関数orderListが返す配列(要素番号1〜4)は 10, 20, 30, 40。
図1: dataList(要素番号1〜5)は 10, 30, 20, 40, (網掛け=未定義)。pointerList(要素番号1〜5)は 3, 4, 2, (網掛け=未定義), (網掛け=未定義)。網掛けはその要素が未定義であることを示す。図2: 関数orderListが返す配列(要素番号1〜4)は 10, 20, 30, 40。
``` 〔プログラム〕 大域: 整数型の配列: 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 ```

選択肢

正解と解説

正解: a: pointerList[p]、b: pointerList[p]

単方向リストをたどる処理では、現在位置 p の値を取り出した後、次の要素番号を pointerList[p] から得ます。末尾に達したかどうかは「次を指すポインタが未定義かどうか」で判定するので、空欄 a は pointerList[p] です。判定を通過したら空欄 b で p ← pointerList[p] として次へ進みます。dataList[p] を判定に使うと、値が未定義でなくてもリンクが切れている場合を捉えられず、i を代入すると連結順ではなく要素番号順にたどってしまいます。

選択肢ごとの解説

出典:令和8年度 公開問題 基本情報技術者試験 科目B 問4(IPA)

同じ分野の他の問題

最終更新:2026-08-25/解説・選択肢ごとの解説は資格暗記が独自に作成しています。問題文と選択肢の出典は上記のとおりです。