1

二分探索ツリーに追加する際に問題が発生しています。私のプログラムは代わりに一時的な構造に追加しているようです。それが正しく機能するためには、変数ノードを構造の一部に設定する前に、左右のノードに対して malloc を呼び出す必要があると思います。コードのどこで malloc を使用すればよいのかわからないため、残りの部分は引き続き機能します =/

 typedef struct BiTree_ {
   BiTreeNode *root;
   int size;
} BiTree;

    typedef struct BitTreeData_ {
   char *str;
   int diff;
   int start_count;
   int end_count;
   int hidden;
} BiTreeData;

 typedef struct BiTreeNode_ {
    BiTreeData *data;
    struct BiTreeNode_ *right;
    struct BiTreeNode_ *left;
} BiTreeNode;

    int
bitree_insert(BiTree *tree, BiTreeNode *node, char *str)
{
    if(tree->root == NULL){
        tree->root = (BiTreeNode*)malloc(sizeof(BiTreeNode*));
        tree->root->data = (BiTreeData*)malloc(sizeof(BiTreeData*));
        tree->root->right = NULL;
        tree->root->left = NULL;
        tree->root->data->str = str;
        tree->root->data->hidden = 0;
        tree->root->data->start_count = 0;
        tree->root->data->end_count = 0;
        tree->root->data->diff = 0;
        tree->size++;
        return 0;
    }    
    if(node == NULL){
        node = (BiTreeNode*)malloc(sizeof(BiTreeNode));
        node->right = (BiTreeNode*)malloc(sizeof(BiTreeNode*));
        node->right = NULL;
        node->left = (BiTreeNode*)malloc(sizeof(BiTreeNode*));
        node->left = NULL;
        node->data = (BiTreeData*)malloc(sizeof(BiTreeData*));
        node->data->str = str;
        node->data->hidden = 0;
        node->data->start_count = 0;
        node->data->end_count = 0;
        node->data->diff = 0;
        tree->size++;
        return 0;
    }
    if(strcmp(str, node->data->str)<0){
        if(node->left == NULL){

            return 0;
        }
                bitree_insert(tree, node->left, str);
    }
    if(strcmp(str, node->data->str)>0){
        if(node->right == NULL){
            return 0;
        }
        bitree_insert(tree, node->right, str);
    }    
    return 0;
} 
4

1 に答える 1

1

関数に渡す引数bitree_insertは、参照ではなく値によって渡されます。たとえば、は型変数nodeへのポインタです。BitTreeNode次に に代入するとnode、node という名前のローカル変数の値が設定されます。あなたがやりたかったことは、ノードへの参照を渡すことだったようですBitTreeNode **。そうすれば、*nodeその割り当てに割り当てるときは、ローカル変数ではなく、呼び出し元から渡されたポインターになります。

于 2012-10-27T17:20:26.930 に答える