2
typedef struct _Tree{
    int val;
    struct _Tree *left;
    struct _Tree *right;
}Tree;

Treeここにポインターはありますか?valのアドレスを指していますか?

と定義したらどうTree *nodeですか?nodeのアドレスを指しているポインタですかTree?

を挿入したい場合、またはvalを使用する必要がありますinsert(&node)insert(node)?

void insert_Tree(Tree **root, int key){
if((*root) == NULL){
    (*root) = (Tree *)malloc(sizeof(Tree));
    (*root)->val = key;
    (*root)->left = NULL;
    (*root)->right = NULL;
    cout<<"insert data "<<key<<endl;
}else if(key< (*root)->val){
    insert_Tree(&(*root)->left, key);
    cout<<"go left"<<endl;
}else{
    insert_Tree(&(*root)->right, key);
    cout<<"go right"<<endl;
}
}
int main(){

Tree *root = NULL;
insert_Tree(&root, 10);
insert_Tree(&root, 20);
insert_Tree(&root, 5);
insert_Tree(&root, 100);
}
4

4 に答える 4

5

Treeポインタではありません。ユーザー定義型のエイリアスstruct _Treeです。したがって、新しい変数を宣言するときは、入力する代わりに

struct _Tree foo;

あなたは単に入力することができます

Tree foo;

2つは同等です。

宣言すれば

Tree *node;

Cの単項*演算子は逆参照/間接演算子であるため、あなたが言っているのは: *node、またはの逆参照された値nodeは aTreeです。言い換えると、nodeは a へのポインタTree、つまり a へのポインタstruct _Treeです。

このポインタは、メモリを割り当てるまで初期化されません。

node = malloc (sizeof (Tree));

このメモリが割り当てられるまで、ポインターは未定義の場所を指しています。メモリが割り当てられたら、次valのようにノードに挿入できます。

node->val = val;

これ自体を二分木にどのように挿入するかがnode興味深い問題です。何を試しましたか?

于 2013-08-31T23:19:16.180 に答える
3

いいえ、Treeはポインタでも変数でもまったくありません。これは のtypedefエイリアスでありstruct _Tree、それと同じ意味で使用できます。

を宣言すると、構造体Tree *nodeへのポインターが宣言されますTreeが、実際の構造体自体は宣言されません。

関数がどのようにinsert機能するかは、コードを追加しないとわかりません。

于 2013-08-31T22:56:36.963 に答える
0

Tree独自のコードで定義されたデータ型です。コード内でそれを呼び出す方法に注意してください。それはintorと同じ場所にdoubleあります。

これはデータ型であるため、ポインターとして定義することもできます。

  Tree *root;

root構造体/データ型「Tree」へのポインタです。 rootはわずか 4 バイトであり、ツリー構造を割り当て ません。

または、ツリーは、構造化/フォーマットされた一連の保存場所にすることができます。

 Tree  node;

node構造 Tree であり、実際の格納場所が割り当てられます。ノードのアドレスを渡す必要がある場合は、次のように指定します。&nodeこれにより、「ノード」のストレージの場所へのポインターが作成されます。

あなたの他の質問は、Treeデータ型を理解することにかかっていると思います。

一般に、プログラミングを開始するときは、 のような二重ポインタを定義する必要はないTree **rootため、コードを再検討して単純化します。

お役に立てれば。

于 2013-09-01T01:58:09.467 に答える
0

この単純な構造を定義するより一般的な方法を次に示します。

typedef struct{
    int val;
    Tree *left;
    Tree *right;
}Tree;

この構造を使用すると、通常は次のようになります。

Tree top;
Tree left;
Tree right;

top.val = 0;
top.left = &left;
top.right = &right;        

ご覧のとおり、ここでは Tree はポインターではなく、型構造の定義です。これは型のように機能します。つまり、Tree 型で変数をインスタンス化できます。また、参照記号 (&) を使用して左右のツリー ポインターを割り当てる必要があります。これは、構造体のメンバー (左右) が Tree へのポインターであるためです。

于 2013-08-31T23:18:06.053 に答える