質問するログイン新規登録

回答編集履歴

1

加筆修正

2016/11/16 00:31

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -8,11 +8,16 @@
8
8
  1つ目は、xがp->dataと異なるときの挙動です。再帰を使って探しに行く、これはokです。問題は探した後。枝の先で見つかろうが見つからまいが、0を返してします。見つかったら1を返す必要がありますよね。
9
9
  (枝の先のほうで見つけてreturnしても、一気にmain関数まで戻れません。1つ1つ戻る必要があります。)
10
10
 
11
- 2つ目は、枝の先がない場合の処理です。19を探したときにセグメンテーションフォルトというものが出たと思いますが、これは、アクセスしてはいけない場所をアクセスした、という情報です。例えば、メモリの0番地は、BIOSという別のプログラムがいて、勝手に触ってはいけないことになっています。今回、見つからずに枝の先を探していくと、枝の先がヌルポインタを指していることがあり、この中身を触ろうとすると、フォルトを起こして異常終了しますヌルポインタの場合はそれ以上探索せず、見つからなかったと報告すれば、問題は解決します。
11
+ 2つ目は、枝の先がない場合の処理です。19を探したときにセグメンテーションフォルトというものが出たと思いますが、これは、アクセスしてはいけない場所をアクセスした、という情報です。例えば、メモリの0番地は、BIOSという別のプログラムがいて、勝手に触ってはいけないことになっています(例外あり)
12
+ プログラムの他の部分で、ポインタにNULLを代入している場所がありますよね? このNULLはヌルポインタと呼ばれ、C言語では「触ってはいけない場所」を意味しています。この中身にアクセスしようとすると、フォルトが発生します。
13
+ 今回、枝の先を探していくと、枝の先がヌルポインタになっていることがあります。この中身を触ろうとしたため、フォルトが発生して異常終了したのです。
14
+ では、どうすればいいのか。簡単です。「中身に」触らなければいいのです。pがヌルポインタの場合はそれ以上探索せず、見つからなかったと報告するようにすればいいのです。
15
+
16
+ これらを踏まえると、次のコードのようになります。
12
17
  ```C
13
18
  int search_tree(int x, struct node *p) {
14
19
  if (p == NULL)
15
- return 0;
20
+ return 0; // 2番目の問題を修正
16
21
 
17
22
  if (x == p->data)
18
23
  return 1;
@@ -20,5 +25,6 @@
20
25
  return search_tree(x, p->left);
21
26
  else
22
27
  return search_tree(x, p->right);
28
+ // 1番目の問題を修正
23
29
  }
24
30
  ```