応用情報技術者試験 令和5年秋 午前問5 解説付き過去問
問題
双方向リストを三つの一次元配列 elem[i]、next[i]、prev[i] の組で実現する。
双方向リストが図の状態のとき、要素Dの次に要素Cを挿入した後の next[6]、prev[6] の値の組合せはどれか。
ここで、双方向リストは次のように表現する。
- 双方向リストの要素は、elem[i]に値、next[i]に次の要素の要素番号、prev[i]に前の要素の要素番号を設定
- 双方向リストの先頭、末尾の要素番号は、それぞれ変数Head、Tailに設定
- next[i]、prev[i]の値が0である要素は、それぞれ双方向リストの末尾、先頭を表す。
- 双方向リストへの要素の追加は、一次元配列の末尾に追加

正解
解説
この問題は、双方向リストに新しい要素を挿入したとき、参照情報(next配列とprev配列)がどのように変化するかを問うものです。以下に丁寧に解説します。
- 双方向リストの構造
双方向リストとは、各要素が前後の要素を参照(ポインタやインデックス)で持つリスト構造です。要素を先頭からも末尾からもたどれる特徴があります。この問題では、以下の3つの一次元配列で双方向リストを実現しています。
- elem[i]:i番目の要素の値
- next[i]:i番目の次の要素のインデックス
- prev[i]:i番目の前の要素のインデックス
また、next[i] = 0 ならその要素はリストの末尾、prev[i] = 0 ならその要素はリストの先頭であることを意味します。
- 初期状態のリスト
図を見ると、リストの構造は次のようになっています。Head → A(1)→ B(4)→ D(3)→ E(5)→ F(2)→ Tail
括弧内は配列の添字です。
- 要素Cの追加位置とインデックス
要素CはDの次、Eの前に挿入されます。
また、一次元配列の末尾に追加されるため、要素Cは elem[6] に格納されます。 - 配列値の更新
要素CをDとEの間に挿入するためには、以下のように値を設定します。- prev[6] = 3(要素Dのインデックス)
- next[6] = 5(要素Eのインデックス)
- next[3] = 6(DからCへ)
- prev[5] = 6(EからCへ)
この更新によって、D ↔ C ↔ E のリンクが正しく接続されます。
- prev[6] = 3(要素Dのインデックス)
- 答えの確認
問題で問われているのは、要素C(添字6)の next[6] と prev[6] の組合せです。したがって、
next[6] = 5
prev[6] = 3
以上より、要素Dの次に要素Cを挿入したあとの next[6] = 5、prev[6] = 3 が正解となります。