令和5年度 秋期 応用情報技術者試験 午前 問5

テクノロジアルゴリズム

この問題は2023(R5)秋 応用情報技術者 午前に出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。

本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。

双方向リストを三つの一次元配列 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 である要素は,それぞれ双方向リストの末尾,先頭を表す。
  • 双方向リストへの要素の追加は,一次元配列の末尾に追加
配列と変数の状態を示す図
図の説明テキスト

配列と変数の状態を示す図。図の上部には「一次元配列の末尾」という記述があり、要素番号6の列を点線の枠で囲んでいる。

  • elem配列:
    要素番号: 1, 2, 3, 4, 5, 6
    値: A, F, D, B, E, (空欄)
  • next配列:
    要素番号: 1, 2, 3, 4, 5, 6
    値: 4, 0, 5, 3, 2, (空欄)
  • prev配列:
    要素番号: 1, 2, 3, 4, 5, 6
    値: 0, 5, 4, 1, 3, (空欄)
  • Head変数: 1
  • Tail変数: 2

解答・解説を読む

正解: 選択肢

正解の根拠

双方向リストを配列の組 elem[i], next[i], prev[i] で表現する仕組みに関する問題です。
問題文の条件より、双方向リストへの要素の追加は一次元配列の末尾に行われるため、新しく追加される「要素C」の要素番号は 6 となります。

「要素Dの次に要素Cを挿入する」という操作は、既存の要素Dと、その次の要素の間に要素Cを連結することを意味します。
正解の選択肢から逆算すると、挿入前の状態で要素Dの要素番号は 3、要素Dの次の要素番号は 5 であったことが分かります。

要素C(要素番号 6)を要素D(要素番号 3)の次に挿入する際のポインタ(インデックス)の付け替え処理は以下のようになります。

  1. 新しい要素Cの前の要素は要素Dになるため、prev[6]3 を設定する。
  2. 新しい要素Cの次の要素は元々要素Dの次だった要素になるため、next[6]5 を設定する。
  3. 要素Dの次の要素を要素Cにするため、next[3]6 に更新する。
  4. 元々要素Dの次だった要素(番号5)の前の要素を要素Cにするため、prev[5]6 に更新する。

上記 1. と 2. の結果から、挿入後の値は next[6]: 5, prev[6]: 3 となります。

各選択肢の解説

  • (next[6]: 2, prev[6]: 3): 要素Dの次の要素番号が 2 であった場合の組み合わせですが、本来の双方向リストの状態(要素Dの次が 5)と異なるため誤りです。
  • (next[6]: 3, prev[6]: 4): nextprev の設定値が誤っています。これでは要素Cの前が要素番号4、次が要素番号3の間に挿入されてしまいます。
  • (next[6]: 5, prev[6]: 3): 正解です。要素Cが、要素D(番号3)とその次の要素(番号5)の間に正しく挿入されています。
  • (next[6]: 5, prev[6]: 4): prev[6] の値が誤っています。これでは要素Cの前が要素番号4になってしまい、「要素Dの次に挿入する」という条件を満たしません。