HOME»基本情報技術者試験掲示板»リストの問題がわかりません
投稿する
まず
リストはなにかの値を保持しているものが数珠つなぎになっているものです。
電車の駅を連想してもらえるとわかりやすいと思います。
例えば
東京→next→品川→next→新横浜→next→「未定義」
のような感じです。
これを踏まえた上で、プログラムをptrの理解に着目した部分だけにします。
headは東京を指しています。
10行目
prtにheadを代入するので、prtも東京になります。
12行目
prtは未定義ではない(東京なので)ためループに入ります。
19行目(ループ1回目)
prtにptrの次を代入するので、prtは品川になります。
21行目
12行目へ飛ぶ
12行目
prtは未定義ではない(品川なので)ためループを継続します。
19行目(ループ2回目)
prtにptrの次を代入するので、prtは新横浜になります。
21行目
12行目へ飛ぶ
12行目
prtは未定義ではない(新横浜なので)ためループを継続します。
19行目(ループ3回目)
prtにptrの次を代入するが、prtの次はなかったため「未定義」になります。
21行目
12行目へ飛ぶ
12行目
prtは「未定義」なのでループをしません。
プログラム終了。
となります。
つまりループのたびにprtの要素は駅を順繰りに1つずつ進んでいることになります。
また理解のために省略しましたが「16: return //プログラムを終了する」が実行された場合は、たとえループの途中であろうとも文字通りプログラムが終わると考えもらって大丈夫です。
リストの問題がわかりません [5200]
ちょびんさん(No.1)
当方、文系です。
次のプログラム中の a と b に入れる正しい答えの組み合わせを解答群の中から選べ
ここで、文字の先頭の位置は1である。
次のプログラムは単方向リスト(以下、リスト)をクラスLinkedListを用いて実現する。
クラスLinkedListの説明を図に示す。手続addは引数で与えられた位置に、引数で与えられた文字を追加する。その位置以降にある値の位置は一つずつ後ろにずれる。大域変数headはリストの先頭の要素への参照を格納する。リストが空のときはheadは未定義である。この手続addではリストが空であることを想定しないものとする。
メンバ変数 型 説明
val 文字型 リストに格納する文字
next LinkedList リストの次の文字を保持するインスタンスへの参照。初期状態は未定義である。
コンストラクタ
説明
LinkedList(文字型:qVal,LinkedList:qNext 引数qValでメンバ変数valを引数qNextでメンバ変数nextを初期化する。
プログラム
1:大域:LinkedList:head //リストの先頭要素への参照が格納されている
2:〇add(整数型:idx,文字型:qVal)
3:整数型:i←1
4:LinkedList:curr←LinkedList(qVal,未定義の値)
5:if(idxが1と等しい)
6: curr.next←head
7: head← curr
8: return //プログラムを終了する
9:endif
10:LinkedList:ptr ← head
11:LinkedList:prev← ptr
12:while(ptrが未定義でない)
13: if(iがidxと等しい)
14: a
15: b
16: return //プログラムを終了する
17:endif
18:prev←ptr
19:ptr←ptr.next
20:i←i+1
21:endwhile
解答群
ア a curr.next←ptr.next b prev←curr
イ a curr.next←ptr.next b prev.next← curr
ウ a curr.next←ptr b prev←curr
エ a curr.next←ptr b prev.next←curr
ptrが何を指しているかわかりません。
解法を教えてください。
次のプログラム中の a と b に入れる正しい答えの組み合わせを解答群の中から選べ
ここで、文字の先頭の位置は1である。
次のプログラムは単方向リスト(以下、リスト)をクラスLinkedListを用いて実現する。
クラスLinkedListの説明を図に示す。手続addは引数で与えられた位置に、引数で与えられた文字を追加する。その位置以降にある値の位置は一つずつ後ろにずれる。大域変数headはリストの先頭の要素への参照を格納する。リストが空のときはheadは未定義である。この手続addではリストが空であることを想定しないものとする。
メンバ変数 型 説明
val 文字型 リストに格納する文字
next LinkedList リストの次の文字を保持するインスタンスへの参照。初期状態は未定義である。
コンストラクタ
説明
LinkedList(文字型:qVal,LinkedList:qNext 引数qValでメンバ変数valを引数qNextでメンバ変数nextを初期化する。
プログラム
1:大域:LinkedList:head //リストの先頭要素への参照が格納されている
2:〇add(整数型:idx,文字型:qVal)
3:整数型:i←1
4:LinkedList:curr←LinkedList(qVal,未定義の値)
5:if(idxが1と等しい)
6: curr.next←head
7: head← curr
8: return //プログラムを終了する
9:endif
10:LinkedList:ptr ← head
11:LinkedList:prev← ptr
12:while(ptrが未定義でない)
13: if(iがidxと等しい)
14: a
15: b
16: return //プログラムを終了する
17:endif
18:prev←ptr
19:ptr←ptr.next
20:i←i+1
21:endwhile
解答群
ア a curr.next←ptr.next b prev←curr
イ a curr.next←ptr.next b prev.next← curr
ウ a curr.next←ptr b prev←curr
エ a curr.next←ptr b prev.next←curr
ptrが何を指しているかわかりません。
解法を教えてください。
2023.12.06 21:16
電タックさん(No.2)
★FE ブロンズマイスター
>ptrが何を指しているかわかりません。
まず
リストはなにかの値を保持しているものが数珠つなぎになっているものです。
電車の駅を連想してもらえるとわかりやすいと思います。
例えば
東京→next→品川→next→新横浜→next→「未定義」
のような感じです。
これを踏まえた上で、プログラムをptrの理解に着目した部分だけにします。
>大域変数headはリストの先頭の要素への参照を格納する。
headは東京を指しています。
>1:大域:LinkedList:head //リストの先頭要素への参照が格納されている
>10:LinkedList:ptr ← head
>12:while(ptrが未定義でない)
>19:ptr←ptr.next
>21:endwhile
10行目
prtにheadを代入するので、prtも東京になります。
12行目
prtは未定義ではない(東京なので)ためループに入ります。
19行目(ループ1回目)
prtにptrの次を代入するので、prtは品川になります。
21行目
12行目へ飛ぶ
12行目
prtは未定義ではない(品川なので)ためループを継続します。
19行目(ループ2回目)
prtにptrの次を代入するので、prtは新横浜になります。
21行目
12行目へ飛ぶ
12行目
prtは未定義ではない(新横浜なので)ためループを継続します。
19行目(ループ3回目)
prtにptrの次を代入するが、prtの次はなかったため「未定義」になります。
21行目
12行目へ飛ぶ
12行目
prtは「未定義」なのでループをしません。
プログラム終了。
となります。
つまりループのたびにprtの要素は駅を順繰りに1つずつ進んでいることになります。
また理解のために省略しましたが「16: return //プログラムを終了する」が実行された場合は、たとえループの途中であろうとも文字通りプログラムが終わると考えもらって大丈夫です。
2023.12.06 22:43
1212さん(No.3)
情報処理教科書 出るとこだけ!基本情報技術者[科目B]を買った方がいいですよ~
2023.12.06 22:53
boyonboyonさん(No.4)
★FE シルバーマイスター
prevの次、ptrの前にcurrを入れるためにprevとptrという2つの変数を用意したと思います。iがidxになるまで、1つずつ場所を動かしています。
2023.12.07 01:22
ちょびんさん(No.5)
わかりました。ありがとうございました。
2023.12.07 12:06