私は、ツリー内の要素を見つけると、ノードのパスを持つノードポインタの配列を返す関数path()
を作成しようとしています。私は再帰を試みたが、何が間違っているのかわからない。関数パスには、Node *a
、バイナリツリーint v
、見つかる値、そしてint *p
のような署名がある。ノードのmalloc配列を作成するsegmetationフォールト
はここに私のコードです:
typedef struct nodo {
int v;
struct nodo *left, *right;
} Nodo;
Nodo **path(Nodo *a, int v, int *p) {
(*p)++;
Nodo **r = NULL;
if (a == NULL) {
return NULL;
}
if (a->v == v) {
r = (Nodo**)malloc((*p)*sizeof(Nodo*));
r[(*p)-1] = a;
return r;
}
else if (a->v < v) {
Nodo **r = path(a->right, v, p);
r[(*p)-1] = a;
return r;
}
else if (a->v > v) {
Nodo **r = path(a->left, v, p);
r[(*p)-1] = a;
return r;
}
return r;
}
'a == NULL'かどうかをチェックする前に'(* p)++ 'をインクリメントしないでください。 –
どのラインがクラッシュしますか? 'ram()'が 'path()'であると仮定していますか? –
を見つけてください。あなたは実際に値を見つけたときにだけメモリを割り当てます。つまり、前のすべてのナビゲーションが 'path()'によって返された 'NULL'ポインタを参照します。私はあなたの最初のクラッシュだと思っています。 – zolid