回答編集履歴
1
加筆修正
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
|
```
|