科目A問2
双方向のポインタをもつリスト構造のデータを表に示す。この表において新たな社員 G を社員 A と社員 K の間に追加する。追加後の表のポインタ a ~ f の中で追加前と比べて値が変わるポインタだけを全て列記したものはどれか。

| a,b,e,f | |
| a,e,f | |
| a,f | |
| b,e |
『情報処理過去問.com』からiPhoneアプリがリリースされました!!
正解
- ウ
解説
この問題は,社員データを双方向リスト(両方向リンクリスト)で表現していて,新しい社員Gを「社員Aと社員Kの間」に挿入したとき,挿入前と比べて値が変化するポインタだけを見つける問題です。
双方向リストでは,各ノードが
・自分の「次のノード」を指す 次ポインタ(next)
・自分の「前のノード」を指す 前ポインタ(prev)
を1つずつ持っています。
元の表を見ると,リストのつながりは次のようになっています。
アドレス100(社員A): next=300, prev=0
アドレス300(社員K): next=200, prev=100
アドレス200(社員T): next=0, prev=300
したがって,リストの順番は
A(100) → K(300) → T(200)
という並びになっています。
ここに新ノード G(400) を「A と K の間」に挿入すると,論理的な並びは
A(100) → G(400) → K(300) → T(200)
になります。双方向リストでノードを間に挿入する場合,必ず次の4つのポインタを書き換える必要があります。
1) A の next を,これまでの K から G へ付け替える
(A.next: 300 → 400 に変化)
2) K の prev を,これまでの A から G へ付け替える
(K.prev: 100 → 400 に変化)
3) G の next を K に設定する
4) G の prev を A に設定する
このうち 3) と 4) は「新しく追加されたノードGのポインタを初期化するだけ」なので,
「挿入前の表と比較して値が変わるポインタ」には含めません。
元から存在していたノードの中で,値が変化するのは
・A の next ポインタ(300 → 400)
・K の prev ポインタ(100 → 400)
の2つだけです。
追加後の表では,これらのポインタ位置に a〜f のラベルが付けられています。
対応を見ると,
・A の next に対応しているのが a
・K の prev に対応しているのが f
となっているため,「値が変わるポインタ」は a と f の2つであり,選択肢ウ(a, f)が正解になります。
双方向リストでは,各ノードが
・自分の「次のノード」を指す 次ポインタ(next)
・自分の「前のノード」を指す 前ポインタ(prev)
を1つずつ持っています。
元の表を見ると,リストのつながりは次のようになっています。
アドレス100(社員A): next=300, prev=0
アドレス300(社員K): next=200, prev=100
アドレス200(社員T): next=0, prev=300
したがって,リストの順番は
A(100) → K(300) → T(200)
という並びになっています。
ここに新ノード G(400) を「A と K の間」に挿入すると,論理的な並びは
A(100) → G(400) → K(300) → T(200)
になります。双方向リストでノードを間に挿入する場合,必ず次の4つのポインタを書き換える必要があります。
1) A の next を,これまでの K から G へ付け替える
(A.next: 300 → 400 に変化)
2) K の prev を,これまでの A から G へ付け替える
(K.prev: 100 → 400 に変化)
3) G の next を K に設定する
4) G の prev を A に設定する
このうち 3) と 4) は「新しく追加されたノードGのポインタを初期化するだけ」なので,
「挿入前の表と比較して値が変わるポインタ」には含めません。
元から存在していたノードの中で,値が変化するのは
・A の next ポインタ(300 → 400)
・K の prev ポインタ(100 → 400)
の2つだけです。
追加後の表では,これらのポインタ位置に a〜f のラベルが付けられています。
対応を見ると,
・A の next に対応しているのが a
・K の prev に対応しているのが f
となっているため,「値が変わるポインタ」は a と f の2つであり,選択肢ウ(a, f)が正解になります。