0

このタイプの問題で助けが必要になる可能性のあるこの質問の将来の視聴者のために: 2つの関数 (InsertNode() と InTree()) を組み合わせて修正しました。これが悪い習慣であるかどうかはわかりません。それが実際に問題を解決するのか、それとも単にそれを隠すだけなのか、あなたたちは知っていますが、うまくいっているようです...

このWebサイト(および他のWebサイト)でさまざまな回答を調べましたが、役に立たなかった解決策が得られました(試してみて機能しなかった、またはプログラムと変わらなかった)。挿入関数 (私はそれを分離しましたが、これが問題のあるコードだと思います) には、プログラムがクラッシュする原因となるバグがどこかにあります。

NP InTree(NP Node,NP Root)
{
    if (Root == NULL)
    {
        Root=Node;
        return Root;
    }
    else
    {
        if (Node->Input < Root->Input)
        {
            return InTree(Node,Root->Left);
        }
        else if (Node->Input > Root->Input)
        {
            return InTree(Node,Root->Right);
        }
        else
        {
            puts("Duplicate");
            return NULL;
        }
    }
}

void InsertNode(int I, TP Tree)
{

    NP Node;
    Node=(NP)malloc(sizeof(struct AVLNode));
    InitializeNode(Node);
    Node->Input=I;
    Node->Height=0;
    Node->Left=NULL;
    Node->Right=NULL;
    InTree(Node,Tree->Root);
    Tree->Size++;
}

NP はノード ポインタ、TP はツリー ポインタです。

Node 変数は、InsertNode() を通じて送信される初期化されたノードです。

void InitializeTree(TP Tree)
{

    Tree->Root=NULL;
    Tree->Size=0;
}

void InitializeNode(NP Node)
{

    Node->Input=0;
    Node->Height=0;
}

上記は、必要な場合に備えて、私の Initialize 関数です。

ツリーのメモリは、関数が呼び出される前にメイン クラスに割り当てられます。

私がテストで確認した主な問題は、Root が Node と等しくなると、それが null のままになることです。

問題を乗り越える方法はありますか?

4

3 に答える 3

0

が と等しくなるInTree関数では、メモリをローカルで変更するだけです。RootNode

代わりに、試みていることを達成するためにポインターへのポインターを使用する必要がある場合があります。

于 2013-04-10T19:12:33.467 に答える
0

void InsertNode(int I, TP Tree)新しいノードに mem を割り当てますが、呼び出すときNP InTree(NP Node,NP Root)はローカル ポインター アドレスのみを変更します。ポインターへのポインター (つまりNP InTree(NP Node, NP *ppRoot)) または次の例を使用する必要があります。

if (Node->Input < Root->Input) {
    if(Root->Left == NULL) {
        Root->Left = Node;
    } else {
        return InTree(Node,Root->Left);
    }
} else if (Node->Input > Root->Input) {
    if(Root->Right== NULL) {
        Root->Right= Node;
    } else {
        return InTree(Node,Root->Right);
    }
} else {
    puts("Duplicate");
    return NULL;
}

Ps。struct AVLNode を割り当てていることに気付きました...NP は AVLNode ( typedef struct AVLNode* NP) の typedef ですか? 構造が分からないのでなんとも言えません。技術的には、AVL は自己バランスをとるという点で B ツリーとは異なります... http://en.wikipedia.org/wiki/AVL_tree

于 2013-04-10T19:10:27.213 に答える