令和8年度試験問題 科目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である。
b04_1.png
 関数orderList は,図1のdataList 及びpointerList で表現した単方向リストの値を,単方向リストの先頭からたどって順番に格納した配列を返す。関数orderListが返す配列を図2に示す。
b04_2.png
〔プログラム〕
b04_3.png

b04_4.png
正解 問題へ
分野:アルゴリズムとプログラミング
細目:データ構造及びアルゴリズム
解説
単方向リストは、各要素が次の要素への参照(ポインタ)をもつリスト型のデータ構造です。
b04_5.png
設問では、単方向リストを次の2つの配列で表しています。
  • dataList:各要素の値を格納する配列
  • pointerList:次の要素が格納されている dataList の要素番号を示す配列
設問のデータを例にすると、先頭は dataList[1] = 10です。次の要素番号は pointerList[1] に格納されている3なので、2番目は dataList[3] = 20 を参照するという流れです。同じように最後までたどると次のようになります。
  • 要素番号:1 → 3 → 2 → 4
  • 値:10 → 20 → 30 → 40
プログラム中の変数 p は、現在参照している dataList の要素番号を表しています。このため、p は「1 → 3 → 2 → 4」と変化していく必要があります。最初に p に1を代入しているのは、単方向リストの先頭(ヘッド)が dataList[1] であるためです。

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] が入る「エ」の組合せが適切です。

Pagetop