

Cで木構造をつくるにあたって，

[code]

    //ノード
    struct tnode
    {
        struct tnode *left;
        char *value;
        struct tnode *right;
    };
    
    struct tnode *talloc(void)
    {
        return (struct tnode *)malloc(sizeof(struct tnode));
    }
    
    struct tnode *gentree(struct tnode *p, char *w)
    {
        if(p==NULL)
        {
            //端に来たら生成
            p=talloc();
            strcpy(p->value, w);
            p->left = p->right = NULL;
        }
        else
        {
            //端じゃないなら左右にNULLまで走査
            p->left  = gentree(p->left, w);
            p->right = gentree(p->right, w);
        }
        return p;
    }
    
    void main()
    {
        struct tnode *root;
        root = NULL;
    
        root=gentree(root, "aaa");
        printf("%s\n", root->value);
        putchar('\n');
    
        root=gentree(root, "bbb");
        printf("%s\n", root->value);
        printf("%s\n", root->left->value);
        printf("%s\n", root->right->value);
    }
    
[/code]

このようにして作成しようとしてます.  
木の構造としては，aaaが2つのbbbに分岐してほしいのですが，実行結果は

[code]

    aaa
    
    bbb //aaaであってほしい
    bbb
    bbb
    
[/code]

と，どこかでaaaがbbbに書き換えられてしまいます．試しに以下のように書き換えアドレスを確認したところ，2つのアドレスは同じでした．

[code]

    root=gentree(root, "aaa");
    printf("%d\n", root);
    
    root=gentree(root, "bbb");
    printf("%d\n", root);
    
[/code]

初歩的なことかもしれませんが，どうかご回答お願いいたします．


CC BY-SA 3.0
2017-11-22T15:08:32.963
39765
2017-11-23T01:14:07.633
2017-11-23T01:14:07.633
19110
23768
question
c
Cで木構造をつくろうとしたが、ノードの値を上手く保存できていない


えっと、ほんとに動きます？

[code]

    //ノード
    struct tnode
    {
        struct tnode *left;
        char *value;
        struct tnode *right;
    };
    
[/code]

valueがポインタで割当されてません。

手っ取り早い（効率等まるっと無視)のは、

[code]

    strcpy(p->value, w);
    
[/code]

の前に

[code]

    p->value = malloc((strlen(w) + 1) * sizeof(char));
    
[/code]

することですね。

メモリ割り当て複数回すると効率がーとか考え出すなら裏技として

[code]

    //ノード
    struct tnode
    {
        struct tnode *left;
        struct tnode *right;
        char value[0];
    };
    
    struct tnode *talloc(size_t val_size)
    {
        return (struct tnode *)malloc(sizeof(struct tnode) + sizeof(char) * val_size);
    }
    
[/code]

なんて方法もあります。


CC BY-SA 3.0
2017-11-22T16:01:57.277
39766
2017-11-22T16:10:31.267
2017-11-22T16:10:31.267
26230
26230
39765
answer