大滝本 4.14 リストを自己再編成探索する

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
wadaさん  
(No.1)
表題の件について質問です。
以下のプログラムの回答aは、なぜ temp ではなく temp.next になるのでしょうか?
この設問は、回答bと回答cの組み合わせが1つため、最終的な回答は導けるのですが、回答aの理由が気になっています。

[プログラム]
〇整数型:organizingSearch(C)
Node:current, temp 
current ← first
while(currentが未定義でない)
 if(keyがcurrent.keyと等しい)
  if (currentがfirstと等しくない)
   回答a(temp.next) ← current. next
   current. next ← 回答b(first)
   first ← 回答c(current)
  endif
  return current. value
 else
  temp ← current 
  current ← current. next
 end if
endwhile
return -1
2025.06.29 10:20
わんわんさん 
(No.2)
「探索値であるkey」と「現在の参照値であるcurrent.key」が一致しなかった場合の処理が、最後のelse以下の処理です。
else
temp ← current
current ← current. next
ここでは、次の要素に進む前に、現在の参照をtempに格納
そして、現在の参照のnextをcurrentに格納することで、次の要素に移動しています。
このことから、tempはひとつ前の要素である要素であることが分かります。
2025.06.29 10:56
わんわんさん 
(No.3)
そして、探索値keyが見付かったら、その要素を外し、先頭に移動させる訳ですが、
その要素を外すということは、
「現在の前の要素」と「現在の後の要素」を繋ぐ必要があるので、
現在の要素のnext「current.next」を
前の要素のnext「temp.next」に格納するという仕組みです。
2025.06.29 11:03
電タックさん 
FE ブロンズマイスター
(No.4)
その書籍を持っていないので確認出来ませんがこれが穴埋めの問題なのであれば問題の上部に何をするプログラムなのか仕様(動き)の記載があると思います。
まずはその仕様(動き)を紙などで図式化して動きを理解してみてください。
※慣れてきたらぱぱっと頭で読んでもいいです

今回の仕様は対象の値を先頭にしたリストで再構成したいというものだと思います。
以下の適当なリストを勝手に考えて名古屋を指定した場合
・東京(first)→横浜→名古屋→大阪→京都
これが
・名古屋(first)→東京→横浜→大阪→京都
こうなる

この動きの理解が出来てから初めてプログラムを読み始める必要があります。
・firstはどういう変数?
・ループで何がどのように変化していっているのか?
・tempはどういう変数となっている?
・currentはどういう変数となっている?
などです。

仕様(動き)の理解→擬似言語の理解
と順を追って理解してみてください。tempが横浜だとして変えたかったのは何でしたっけ?がわかった状態であれば何故temp.nextでないとダメなのかが分かってくるのではないかと思います。
2025.06.29 12:33
wadaさん  
(No.5)
> わんわんさん
> 電タックさん
アドバイスありがとうございます。
アドバイスを踏まえて見直したところ、理解することができました。

もし temp だった場合、変数が変わるだけで、ポインタの指す先は変わらず、処理が進んでしまうことに気づきました。
ポインタの指す先を変更するには、temp.next で処理する必要があると理解しました。
2025.06.29 13:13

返信投稿用フォーム

スパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop