令和8年度試験問題 科目B 問4
問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 と配列 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である。




正解 エ問題へ
分野:アルゴリズムとプログラミング
細目:データ構造及びアルゴリズム
細目:データ構造及びアルゴリズム
広告
解説
単方向リストは、各要素が次の要素への参照(ポインタ)をもつリスト型のデータ構造です。
設問では、単方向リストを次の2つの配列で表しています。
〔aについて〕
空欄aに入る式の値が未定義であることが、繰返し処理の終了条件になっています。
繰返し処理を終了すべきタイミングは、単方向リストのすべての要素をたどり終えたとき、すなわち末尾の要素に到達したときです。設問には「単方向リストの末尾に対応する pointerList の要素は未定義である」とありますから、現在参照している要素 dataList[p] に対応する pointerList[p] の値が"未定義"であれば、その要素がリストの末尾だと判断できます。
設問のデータを例にすると、末尾の要素は要素番号4です。dataList[4] の40を linearList へ追加した後、pointerList[4] を確認すると未定義です。そのため、ここで繰返し処理は終了します。
よって、空欄aには pointerList[p] が当てはまります。
〔bについて〕
現在の要素がリストの末尾でなければ、次の要素へ移動して処理を続けます。
現在の要素である dataList[p] の次の要素番号は、pointerList[p] に格納されています。そのため、次の要素へ移動するには、pointerList[p]の値を変数pに代入します。
よって、空欄bにも pointerList[p] が当てはまります。
iをpに代入した場合、リストの並び順とは別に、単純に要素番号「1 → 2 → 3 → 4」の順に参照していくことになり、正しい順序とはなりません。
以上より、空欄aと空欄bの両方に pointerList[p] が入る「エ」の組合せが適切です。

- dataList:各要素の値を格納する配列
- pointerList:次の要素が格納されている dataList の要素番号を示す配列
- 要素番号:1 → 3 → 2 → 4
- 値:10 → 20 → 30 → 40
〔aについて〕
空欄aに入る式の値が未定義であることが、繰返し処理の終了条件になっています。
繰返し処理を終了すべきタイミングは、単方向リストのすべての要素をたどり終えたとき、すなわち末尾の要素に到達したときです。設問には「単方向リストの末尾に対応する pointerList の要素は未定義である」とありますから、現在参照している要素 dataList[p] に対応する pointerList[p] の値が"未定義"であれば、その要素がリストの末尾だと判断できます。
設問のデータを例にすると、末尾の要素は要素番号4です。dataList[4] の40を linearList へ追加した後、pointerList[4] を確認すると未定義です。そのため、ここで繰返し処理は終了します。
よって、空欄aには pointerList[p] が当てはまります。
〔bについて〕
現在の要素がリストの末尾でなければ、次の要素へ移動して処理を続けます。
現在の要素である dataList[p] の次の要素番号は、pointerList[p] に格納されています。そのため、次の要素へ移動するには、pointerList[p]の値を変数pに代入します。
よって、空欄bにも pointerList[p] が当てはまります。
iをpに代入した場合、リストの並び順とは別に、単純に要素番号「1 → 2 → 3 → 4」の順に参照していくことになり、正しい順序とはなりません。
以上より、空欄aと空欄bの両方に pointerList[p] が入る「エ」の組合せが適切です。
広告