配列の数値のリストを調べ、バイナリ検索ツリーに挿入する小さなプログラムを作成しようとしています。ここで私が持っているものです。初期化されていない値を関数に解析する
#include <stdio.h>
#include <stdlib.h>
typedef struct node_t node_t;
struct node_t {
int data;
node_t *left;
node_t *right;
};
int insert(node_t *node, int n);
int main(void) {
int array[8] = {5, 8, 3, 6, 9, 2, 4, 7};
int i;
node_t *root;
for (i = 0; i < 8; i++) {
insert(root, array[i]);
}
return 0;
}
int insert(node_t *node, int n) {
if (node == NULL) {
node = malloc(sizeof node);
node->data = n;
return 1;
}
if (n > node->data) {
insert(node->left, n);
} else if (n < node->data) {
insert(node->right, n);
} else {
return -1;
}
return 0; // Suppress 'control reaches end of non-void function'
}
私はgccでコンパイルしたとき、私は言って警告を取得「『ルート』を、この関数で初期化されていない使用することができます」。それは(少なくとも、Windows上の)エラーになり実行されている、しかし、main()
でroot->data
をプリントアウトして得た入力ノードへのポインタは、それがNULL
だった場合、私が実装しようとしていたアイデアはinsert()
機能をチェックしていた0
それをmallocできます。また、再帰がどのように処理されるかによって、挿入される数はそのノードに挿入される必要があります。ノードがNULL
と等しくない場合は、番号を挿入するノードの側で再帰的にinsert()
を呼び出します。
これは、ポインタと何か関係がある理由を理解していますroot
どこにも指向されていないか、root->left
/root->right
、しかし、私はこれを修正するために何ができるかわかりません。どんな助けもありがとう、ありがとう!
再帰呼び出しの戻り値はどうなりますか? –
あなたの問題については、c *で参照によってエミュレートするパスを検索してください。 –
@Someprogrammerdude申し訳ありませんが、問題のトラブルシューティングを試みている間違った場所からコードを取得したため、いくつか編集しました。検索が行われる限り、私は何かが不足している可能性がありますが、Googleの上位3つの結果は役に立たなかったようです。初期化された変数のアドレスを関数に渡しているのに対し、ポインタを渡しているようです何を保管すべきかを知らされていない住所。 – Arkantos