0

ここで、二分木に数字を挿入するコードを書きました。しかし、セグメンテーション違反エラーが発生します。また、8行目に「注:期待される「構造ツリー*」ですが、引数のタイプは「構造ノード*」です」と書かれています。コードは次のとおりです:-

#include<stdio.h>
#include<stdlib.h>
struct tree{
  int data;
  struct tree *left;
  struct tree *right;
};

struct tree* insert(struct tree* node, int data)
{
  if(!node){
    node=malloc(sizeof(struct tree));
    node->data=data;
    node->left=node->right=NULL;
    return node;
  }
  else {
    if(data>node->data){
     node->right= insert(node->right,data);
     return node;
    }
    else{
     node->left= insert(node->left,data);
    }  
 return node;
  }
}
printtree(struct tree* node)
{
  if(node){
      printf("%d",node->data);
  }
      printtree(node->left);
      printtree(node->right);

} 
main()
{
 int i,n;
 struct tree *NODE;
 NODE= insert(NODE,5);
 NODE= insert(NODE,3);
 NODE= insert(NODE,8);
 printtree(NODE);
}
4

3 に答える 3

4

あなたは使うif( node )が、使うほうがよいif( node != NULL )

あなたは使うif( !node )が、使うほうがよいif( node == NULL )

コードが読みやすくなります。

あなたは非常に多くの間違いを犯しています - だから... 私は自分のやり方でそれを作ります(私のコードのフォーマットなど)。

printtree(node->left); printtree(node->right);if( node != NULL ){}だったので取得しようNULL->leftNULL->right

テスト済み - コードは機能します。

#include<stdio.h>
#include<stdlib.h>

struct tree{
  int data;
  struct tree *left;
  struct tree *right;
};

struct tree* insert(struct tree* node, int data)
{
    if( node == NULL ) {
        node = malloc( sizeof(struct tree) );
        node->data = data;
        node->left = node->right = NULL;
    } else {
        if( data > node->data ){
            node->right = insert(node->right, data);
        } else {
            node->left = insert(node->left, data);
        }  
    }

    return node;
}

void printtree(struct tree* node)
{
    if( node != NULL ){
        printf("%d\n", node->data);
        printtree(node->left);
        printtree(node->right);
    }   
} 

int main()
{
    struct tree *NODE = NULL;

    NODE = insert(NODE, 5);
    NODE = insert(NODE, 3);
    NODE = insert(NODE, 8);

    printtree(NODE);

    return 0;
}
于 2013-07-08T11:50:14.967 に答える
2

ローカル変数:struct tree* node;は初期化されていないため、if (!node)テストの動作は未定義です。何かを割り当てるか、malloc されたノードを保持するために使用しない限り、elseブロック内の式は初期化されていないポインターを逆参照しようとします。


また、ツリーは「再帰的」構造と見なすことができるため、どのノードもツリーであり、最上位ツリーは単なるノードであるという考えに慣れる必要があります。ここで 2 つの別々の型を使用する正当な理由はありません。

于 2013-07-08T11:15:33.207 に答える
1

NODE を値で渡すというエラーがまだ発生しています。変更する場合は、そのポインターへのポインターを使用する必要があります。

#include<stdio.h>
#include<stdlib.h>
typedef struct t
{
    int data;
    struct t *left;
    struct t *right;
}tree;

tree* insert(tree **node, int data)
{
    if(!(*node))
    {
        *node=malloc(sizeof(tree));
        (*node)->data=data;
        (*node)->left=(*node)->right=NULL;
        return *node;
    }
    else
    {
        if(data>(*node)->data)
        {
            (*node)->right = insert(&((*node)->right),data);
            return *node;
        }
        else
        {
            (*node)->left = insert(&((*node)->left),data);
            return *node;
        }
    }
}

void printtree(tree *node)
{
    if(node)
    {
        printf("%d",node->data);
        printtree(node->left);
        printtree(node->right);
    }
}

void freeMemory(tree *node)
{
    if(node)
    {
        freeMemory(node->left);
        freeMemory(node->right);
        free(node);
    }
}

int main()
{
    tree *NODE = NULL;
    NODE= insert(&NODE,5);
    NODE= insert(&NODE,3);
    NODE= insert(&NODE,8);
    printtree(NODE);
    freeMemory(NODE);
    return 0;
}

リンク: http://ideone.com/OpZWiC

于 2013-07-08T11:53:20.183 に答える