基本情報技術者 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)として与えられているので、それに従ってポインタを設定します。
関連キーワード: 双方向連結リスト、挿入操作、ポインタ更新、ノードの前後参照、リンク構造、データ構造

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

