5
struct Ternary {

    char current;
    bool wordend;
    Ternary* left;
    Ternary* mid;
    Ternary* right;
    Ternary(char c='@',Ternary* l=NULL, Ternary* m=NULL, Ternary* r=NULL,bool end=false)
    {
        wordend=end;
        current=c;
        left=l;
        mid=m;
        right=r;
    }
};

void add(Ternary* t, string s, int i) {

    if (t == NULL) {
        Ternary* temp = new Ternary(s[i],NULL,NULL,NULL,false);
        t=temp;
    }

    if (s[i] < t->current) {
        add(t->left,s,i);
    }
    else if (s[i] > t->current) {
        add(t->right,s,i);
    }
    else
    {
        if ( i + 1 == s.length()) {
            t->wordend = true;
        }
        else
        {
            add(t->mid,s,i+1);
        }
    }
}

文字列を使用して単語のシーケンスを追加すると、セグメントadd()内に印刷され if(t==NULL)ますが、ツリーが形成されません。つまり、ノードがリンクされません。

4

2 に答える 2

4
t=temp;

この行は、add()関数の外では効果がありません。呼び出し元のポインターは更新されません。

関数を変更して a Ternary*(tこの場合は最後に戻ります) を返し、呼び出しサイトを次のように変更できます。

Ternary *tree = 0;
tree = add(tree, "hello", 1);
tree = add(tree, "bye", 1);
...
于 2011-11-01T11:25:12.687 に答える
0

ちょっとしたトリックで十分です:

交換:

void add(Ternary* t, string s, int i)

と:

void add(Ternary*& t, string s, int i)

これは、次のように出力を渡して読み取るよりもクリーンです。

tree = add(tree, "bye", 1);

C ++の場合は、それらの参照を利用します:) Cでは、関数のシグネチャを次のように変更します。

void add(Ternary** t, string s, int i)

tそして、関連する場所で修正することを忘れないでください。

まあ、C++は明らかにきれいです:)

于 2013-01-10T08:41:18.253 に答える