###前提・実現したいこと
関数int search_tree(int x, struct node *p)だけが空欄になっていて、これを埋めて2文木の中に入力した数字が含まれていればreturn 1、含まれていなければreturn 0となるようにしたいです。main関数でsearch_treeを実行していて、1が返ってこればFound、そうでなければNot Foundと表示されるようになっているみたいです。
###発生している問題・エラーメッセージ
含まれている数字を入力すると全部Not Found(つまりreturn 0になっている)、含まれない数字を入力するとSegmentation fault: 11と出てきます。原因が全く分かりません。どう直せば良いのでしょうか?
(追記)2分木の定義通り、最初の節を見て一致していればreturn 1、値が最初の節より大きければ右の枝に移動、小さければ左の枝に移動して再帰、これを最後に到達するまで続ける、という風にしたつもりでしたが、馬鹿なので30分考えても何がおかしいのか全くわかりませんでした。お願いします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 1: Not found 19 Segmentation fault: 11
上記は実行結果で、1〜18は木に含まれている数字、下4行は実際に1と19を探索した結果です。
###該当のソースコード
ごめんなさい、一部コピペ漏れがありました…
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *left; struct node *right; }; struct node *insert_data(int x, struct node *p); int search_tree(int x, struct node *p); void print_tree(struct node *p); int main(int argc, char *argv[]) { FILE *fp; int i, x; struct node *root; if (argc != 2) { printf("missing file argument\n"); return 1; } fp = fopen(argv[1], "r"); if (fp == NULL) { printf("can't open %s\n", argv[1]); return 1; } root = NULL; for (i = 0; i < 20; i++) { fscanf(fp, "%d", &x); root = insert_data(x, root); } print_tree(root); while (1) { scanf("%d", &x); if (x <= 0) break; if (search_tree(x, root) == 1) printf("%d: Found\n", x); else printf("%d: Not found\n", x); } fclose(fp); return 0; } struct node *insert_data(int x, struct node *p) { if (p == NULL) { p = (struct node *) malloc(sizeof(struct node)); if (p == NULL) { printf("Out of memory\n"); exit(1); } p->data = x; p->left = NULL; p->right = NULL; return p; } if (x == p->data) return p; if (x < p->data) p->left = insert_data(x, p->left); else p->right = insert_data(x, p->right); return p; } int search_tree(int x, struct node *p) { //自分で書いたのはここです if (x == p->data) return 1; else if (x < p->data) search_tree(x, p->left); else search_tree(x, p->right); return 0; } void print_tree(struct node *p) { if (p == NULL) return; print_tree(p->left); printf("%d\n", p->data); print_tree(p->right); }

回答4件
あなたの回答
tips
プレビュー