1

コンピュータのディレクトリを格納するために n 個の子のツリーを作成しています。現在、概念は単純にツリーを作成することであり (もちろん BT ではありません)、各ノードには子も含まれます。以下のコードを検討してから、問題を説明します。最初にこれを考慮してください:

C/users/DeadCoder/Movies/Batman.

これmain.cppで、すべての C、users、DeadCoder、Movies、Batman が 1 つのベクトルになり、2 つのペアが挿入 Func で送信されます。もしroot==NULL; Cを挿入するだけです。次回はCとユーザーが行きます。C が検索され、それに応じてユーザーが挿入されます。コードを見てみましょう。

template <class T>

struct Node;

template <class T>
class tree
{
    Node<T> *root;

public:

    tree();
    ~tree();
    int insert(T str, T str1);
    Node<T> *getRoot();
    Node<T> *search(T item, Node<T> *tempPtr);
};

template <class T>
struct Node{

    T n;
    Node<T> *sibling;
    tree<T> children; // SEE my each node has children.
    Node(T N){
        this->n = N;
        this->sibling = NULL;
    }

};

// .cpp ファイル内。// 初期化子

template <class T>
tree<T>::tree() // Constructor Initialization.
{
    root=NULL;
}

// 関数を挿入します。

template <class T>
int tree<T>::insert(T push, T find)
{

    Node<T> *rPtr = root;
    if (rPtr==NULL){
            //ROOT is NULL. C needs to be inserted which is in find.
        Node<T> *pusPtr = new Node<T>(find);              

        root = pushPtr;
        root->sibling=NULL;
        return 0;
    }
    else if(rPtr!=NULL){
        Node<T> *pushPtr = new Node<T>(push);
        Node<T> *temp2 =  search(find, root);   
        Node<T> *temp = temp2->children.getRoot(); // say it LINE_40.
        if (temp==NULL){ 
            temp = pushPtr;
            temp->sibling=NULL;
            return 1;

        }
        // children are already present.
        else if(temp!=NULL){

            // You don't need to know code for this part.
            }
    }//if.

}

// 検索機能。

template <class T>
Node<T> *tree<T>::search(T data, treeNode<T>* N)
{
    if (N->n==data){ // where n represent directory.
        return N; // data found. 
    }//if....
    else{

        Node<T> *child = N->children.getRoot(); 
// This is where i get Segmentation fault,
// because child is ==NULL; but you see in LINE_40 I did insert the child for C.


    if(child!=NULL){ // say it line 80.
        search(data, child);
    }//if...
    if(child->sibling!=NULL){
        search(data, child->sibling);
    }   
   }


}// search....

問題:C挿入されました。Users挿入されます。行 80 の検索機能では、C の子を検索するようになり、行 40 に挿入したようにユーザーである必要があります。しかし、代わりに、child==NULL と表示されます。私は何時間もデバッグしてきましたが、なぜそう言っているのかわかりません。誰もが問題を解決できることを願っています。ここで、C の子が NULL であると見なされる理由を本当に知る必要があります。それはユーザーでなければなりません。誰でも何が問題なのかわかりますか???? ヘルプ !!!!

4

2 に答える 2

1

42 行目は何もしませ(つまり、副作用がないということです)。一時変数に値を入れてから終了します。tempおそらく、ルートへの参照にしたいでしょう。何かのようなもの:Node<T> *&temp =

于 2013-02-25T16:42:17.040 に答える
0

insertメソッドが実際にこれらの要素を挿入しましたか?メソッドが実際にコントラクトを満たしていることを確認するために、事後条件を実装すると役立つ場合があります(コントラクトによる設計)。このようにして、問題を直接取得し、場合によってはデバッグが高速または不要になります。これは、「このメソッドはこれを実行するはずでしたが、失敗しました」というログメッセージが表示されるためです。それ以外の場合は、何時間も検索します。問題の原因はどこですか。

于 2013-02-25T17:58:30.473 に答える