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

選択肢
ア:a, b, e, f
イ:a, e, f
ウ:a, f(正解)
エ:b, e
🔒 解説は解答すると表示されます
双方向連結リストの挿入【午前解説】
正解の理由
元の表は A(100) ⇄ K(300) ⇄ T(200) の順にリンクしています。社員G(400) を A と K の間に挿入すると、A の次ポインタが K から G に向き、K の前ポインタが A から G に向きます。つまり、テーブル中で変更されるのは A の次ポインタ(表中の a)と K の前ポインタ(表中の f)だけです。したがって選択肢ウ(a, f)が正しい理由です。
解法ステップ
- 元のポインタを把握する
- A.next = 300(K)、A.prev = 0
- K.next = 200(T)、K.prev = 100(A)
- T.next = 0、T.prev = 300(K)
- 挿入後に新ノード G(400) に設定すべき値を決める
- G.prev = A のアドレス = 100
- G.next = K のアドレス = 300
- 既存ノードのポインタを更新する(必要なものだけ)
- A.next を G のアドレス(400)に変更 → a が変わる
- K.prev を G のアドレス(400)に変更 → f が変わる
- その他(影響のないポインタ)は変更しない
- A.prev(b)は 0 のまま、K.next(e)は 200 のまま、T の c,d も変わらない
ポイント表現(代入式):
選択肢別の誤答解説
- ア: a, b, e, f
- b(A.prev)は挿入位置が先頭ではないので 0 のまま変わりません。e(K.next)も K の次は T のままで変化しないため誤りです。
- イ: a, e, f
- e(K.next)は変化しません。K の前ポインタだけが更新されるため不正解です。
- ウ: a, f
- 正しい。A の next と K の prev のみが G を指すように更新されます。
- エ: b, e
- b, e ともに変化しないポインタなので誤りです。
よくある誤解
- 「挿入すると隣接するノード両方の next と prev が全部変わる」と考える:挿入では新ノードが挟まる側のポインタだけ(A の next、K の prev)が変わり、A.prev や K.next は通常変わりません。
- 「新ノードのポインタ値(x, y)を見るだけで答えられる」と思う:新ノードの値は決まりますが、設問は「追加前と比べて値が変わる既存ポインタ」を問うため、既存ノードの変化を検討する必要があります。
補足コラム
- 双方向連結リストの挿入操作は「新ノードの prev/next を設定」→「隣接ノードの該当ポインタを更新」の順で行うと安全です。順序を誤ると途中で参照が切れてしまうことがあります。
- 先頭や末尾に挿入する場合は、ヘッドやテイル(あるいはNULLを表す値)も更新対象になる点に注意してください。
FAQ
Q. 挿入時にすべてのポインタを一度に書き換えなければならない?
A. 必要なのは影響を受けるポインタだけです。順序としてはまず新ノードの prev/next を設定し、その後隣接ノードのポインタを更新するのが安全です。
A. 必要なのは影響を受けるポインタだけです。順序としてはまず新ノードの prev/next を設定し、その後隣接ノードのポインタを更新するのが安全です。
Q. 元の表で A.prev が 0 だと特別な扱いが必要?
A. 0 は先頭を示すため、今回の挿入位置は先頭ではなく A と K の間です。先頭への挿入なら A.prev(=0)を新ノードの prev に反映し、ヘッドポインタを更新する必要があります。
A. 0 は先頭を示すため、今回の挿入位置は先頭ではなく A と K の間です。先頭への挿入なら A.prev(=0)を新ノードの prev に反映し、ヘッドポインタを更新する必要があります。
Q. ノードのアドレスは固定か?
A. 問題ではアドレスは固定値(100,300,200,400)として与えられているので、それに従ってポインタを設定します。
A. 問題ではアドレスは固定値(100,300,200,400)として与えられているので、それに従ってポインタを設定します。
関連キーワード: 双方向連結リスト、挿入操作、ポインタ更新、ノードの前後参照、リンク構造、データ構造

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

