本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成24年度 技術士第一次試験問題【専門科目】

W−3

C言語で双方向リストを実現するために、次の構造体を定義した。
 struct cell { int data;
  struct cell *prev;
  struct cell *next; };
双方向リストが存在して、p がその中のセル (リストの要素) を指しているとする。p が指しているセルと p->next が指しているセルの間に新しいセル (変数 newcell が指しているものとする) を追加したい。[ア]〜[カ]のうち実行すべき文と、その実行順序として最も適切なものはどれか。
 [ア] newcell->next = p->next;
 [イ] newcell->prev = p;
 [ウ] p->next = newcell;
 [エ] p->prev = newcell;
 [オ] p->next->next = newcell;
 [カ] p->next->prev = newcell;

@ ア − イ − ウ − カ

A イ − ア − カ − ウ

B イ − ウ − オ − カ

C オ − ウ − イ − エ

D カ − ウ − ア − イ


類題

H18 W-4


正解

A


解説

例えば以下の数値が入っているとする。
pの前のセルの場所 000
 prev のポインタ NULL
 データ 0
 next のポインタ 100

pが指しているセルの場所 100
 pの前のセルへのポインタ(prev) 000
 データ 1
 pの次のセルへのポインタ(next) 200

pの次のセルの場所 200
 pへのポインタ(prev) 100
 データ 3
 pの次の次のセルへのポインタ(next) 300

このとき、

p.data = 1
p->prev = 000 (p の 前のセルへのポインタ)
p->next = 200 (p の 次のセルへのポインタ)
p = 100 (pへのポインタ)

となる。この状態で、
newcell.data = 2 を追加することを考える。
なお、newcell の場所は150とする。

まず、新しいセルの「前のセルへのポインタ(prev)」に p(100) を入れる。
 newcell->prev = p; ・・・イ
さらに、新しいセルの「次のセルへのポインタ(next)」を
元々 p のnextが指し示していた値(200) とする。
 newcell->next = p->next; ・・・ア

次に p の次のセルであったセルの「前のセルへのポインタ(prev)」を
newcell (150)とする。
 p->next->prev = newcell ・・・カ
最後に、p の「次のセルへのポインタ(next)」をnewcell (150) とする。
 p->next = newcell ・・・ウ


結果は以下のとおりである。
pが指しているセルの場所 100
 pの前のセルへのポインタ(prev) 000
 データ 1
 pの次のセルへのポインタ(next) 150

新しいセルの場所 150
 新しいセルの前のセルへのポインタ(prev) 100
 データ 2
 新しいセルの次のセルへのポインタ(next) 200

p->next が指していたセル場所 200
 前のセルへのポインタ(prev) 150
 データ 3

イとアの順序は変わってもよいが、ウの順序は最後にしなければ、おかしくなってしまう。

W−2 目次 W−4