科目B
令和8年度 基本情報技術者試験 科目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 である。
〔図〕図1 dataList 及び pointerList の内容
注記 網掛けはその要素が未定義であることを示す。
関数 orderList は,図 1 の dataList 及び pointerList で表現した単方向リストの値を,単方向リストの先頭からたどって順番に格納した配列を返す。関数 orderList が返す配列を図 2 に示す。
〔図〕図2 関数 orderList が返す配列
〔プログラム〕
| 要素番号 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| dataList | 10 | 30 | 20 | 40 | (網掛け) |
| 要素番号 | 1 | 2 | 3 | 4 | 5 |
| pointerList | 3 | 4 | 2 | (網掛け) | (網掛け) |
| 要素番号 | 1 | 2 | 3 | 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
答えを選ぶ
出典:令和8年度 基本情報技術者試験 科目B 公開問題 問4(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:エ
覚える知識
線形リストの構造(データ部とポインタ部)
単方向リストは、値(データ部)と次の要素の位置(ポインタ部)の組で表す。末尾はポインタ部が未定義(またはnull)で見分ける。
この問題で必要なこと
p=1 から始めて、値を追加 → 次の要素番号 pointerList[p] が未定義なら終わる → p ← pointerList[p]、を繰り返す。トレースすると p は 1→3→2→4 と進み、10,20,30,40 を追加する。pointerList[4] が未定義のところで止まる。よって a・b ともに pointerList[p] で、正解はエ。
ひっかけ
a を dataList[p] にすると、末尾の 40 は定義済みなので止まれない。そのまま未定義の pointerList[4] へ進んでしまう。b を i にすると、リストのつながりを無視して配列の並び順(10,30,20,40)に読んでしまう。