投稿する

参考書の問題 [5060]

 ピーター一ノ瀬さん(No.1) 
次の単方向リストの要素削除するプログラムの問題についてです。

大域変数: listelement:listhead
listelement: prev,curr
curr=listhead
while(curr.val!=qval)
if(curr.next miteigi)
return 
else
prev=curr
1⃣
endif
endwhile
if(curr==listhead)
listhead=listhead.next
else
2⃣
endif
答え  1,curr=curr.next 2,prev.next=curr.next
だったのですが、1の答えは  curr=prev.next ではだめなのでしょうか?
よろしくお願いいたします。
2023.09.07 16:12
 ピーター一ノ瀬さん(No.2) 
「1⃣」、「2⃣」
↑環境依存文字で変になってしまいましたが、ここに入る文字列を考える問題だと思ってください。よろしくお願いいたします。
2023.09.07 16:14
 ピーター一ノ瀬さん(No.3) 
追記  このプログラムには  引数があり  引数の内容は  文字型  qVal です。
よろしくお願いいたします。
2023.09.07 16:16
 ピーター一ノ瀬さん(No.4) 
追記  プログラム5行目
if(curr.next miteigi)
はif(curr.next が未定義)と読み替えてください。
よろしくお願いいたします。
2023.09.07 16:17
 ピーター一ノ瀬さん(No.5) 
追記、クラスlistelementのメンバ変数の説明
val(文字型)・・・リストに格納する文字。
next(listelement型)・・・リストの次の文字を保持するインスタンスの参照。初期状態は未定義。
よろしくお願いいたします。
2023.09.07 16:24
まーぼさん(No.6) 
FE シルバーマイスター
https://www.fe-siken.com/s/bbs/4930.html

こちらのスレッドと同じ内容ですかね。
2023.09.07 16:26
電タックさん(No.7) 
FE ブロンズマイスター
試験の話からズレてしまい実務レベルでありそうな話題になってしまいますが

例えば上の例が
listhead = a
prev = b
curr = c
qval = d
のように、意味をなさない変数名であった場合は
c = c.nextとc = b.nextが同義で合った時にどっちでも良いよねとは思います
※実務でこんなコード書いてきたらabcdとかやめろと多分怒りますが(笑

prev(previous)とcurr(current)という意味を連想出来る名前が付いている時に
curr = curr.next:現在の場所に現在の次を代入という意味に取れます。
curr = prev.next:現在の場所に前要素の次を代入という意味に取れます。
前者は要素を進めていると直感的に取れますが
後者は前要素の次(つまり現在の要素)を指している様に捉えられているが、処理的には要素を進めていると認識にズレが生じてしまうと思います。

技術的に一緒だと確認するための質問だと思うのでどちらでも一緒ですが、処理を見た上で手放しでどっちでも良いですとは余り言えないなーという老害ぽい独り言でした・・・
2023.09.07 18:47
 ピーター一ノ瀬さん(No.8) 
ありがとうございます。
2023.09.07 20:29
 ピーター一ノ瀬さん(No.9) 
電タックさんもありがとうございます。
自分も英語の意味的には、curr=curr.nextのほうがしっくりくるなぁと感じましたが、
選択肢にcurr=prev.nextもあり、リスト構造にまだ慣れていない部分があるので、
質問させていただきました。
お二方ともありがとうございます。
2023.09.07 20:34
 ピーター一ノ瀬さん(No.10) 
電タックさんすみません。
https://www.fe-siken.com/s/bbs/4930.html
以前こちらで答えられたときは、問題文のプログラムを見ずに回答されていたと思うのですが、上に書いたプログラムですと、答えのcurr=curr.nextではなく、curr=curr.nextをいれても、プログラムとしては同じように動作しますでしょうか?
よろしくお願いいたします。
2023.09.07 20:41
 ピーター一ノ瀬さん(No.11) 
この投稿は投稿者により削除されました。(2023.09.07 20:45)
2023.09.07 20:45
 ピーター一ノ瀬さん(No.12) 
訂正
「答えのcurr=curr.nextではなく、curr=curr.nextをいれても、」
→「答えのcurr=curr.nextではなく、curr=pre.nextをいれても、」
2023.09.07 20:43
まーぼさん(No.13) 
FE シルバーマイスター
かんたん合格なら公式サイトに以下の記述がありました。

262ページ 「解答群」の選択肢「オ」、「b」の内容
[誤]
prev.next ← curr.next
[正]
prev.next ← prev
備考:
 選択肢「イ」と同じ処理内容を表していたため、訂正させていただきます。
【 第2刷にて修正 】

おそらく同じ部分なので疑問が解消されるかも知れません。
2023.09.07 21:00
まーぼさん(No.14) 
FE シルバーマイスター
イのaがcurr=curr.next bがprev.next=curr.next
オのaがcurr=prev.next bがprev.next=curr.next

になっていた。ということでいいんですかね。
2023.09.07 21:10
 ピーター一ノ瀬さん(No.15) 
はい、そのようになっております。
2023.09.07 21:22
 ピーター一ノ瀬さん(No.16) 
あ、やっぱり、オも答えだったんですね。お調べいただいて、ありがとうございます。
2023.09.07 21:24
電タックさん(No.17) 
FE ブロンズマイスター
まーぼさん正誤表ありがとうございます。

ピーター一ノ瀬さん

No.10,12に関しましては正誤表にもありますがどちらでも一緒になると思います。
過去の私の投稿にあった
>直前    prev = curr
>その後  curr = curr.next
の部分が各ループ中で結果1回ずつ行われる為、どちらでも同じ結果になります。
2023.09.07 21:30
 ピーター一ノ瀬さん(No.18) 
お二方ともありがとうございました。
2023.09.07 21:34
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop