1

我正在制作一棵包含 n 个孩子的树来存储计算机目录。现在,概念只是制作一棵树(当然不是 BT),每个节点也会有子节点。考虑下面的代码,然后我将解释这个问题。首先考虑这个:

C/users/DeadCoder/Movies/Batman.

现在在我main.cpp的向量中,我有所有 C、用户、DeadCoder、电影、蝙蝠侠,然后我在插入函数中发送两对。如果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 child 设为 NULL,它必须是用户。任何人都可以看到什么问题????帮助 !!!!

4

2 回答 2

1

第 42 行什么都不做(我的意思是它没有副作用)。它只是将一个值放在一个临时变量中然后离开。您可能希望您temp成为对根目录的引用。就像是:Node<T> *&temp =

于 2013-02-25T16:42:17.040 回答
0

你确定insert方法实际上插入了这些元素吗?实现后置条件可能会有所帮助,以便验证您的方法实际履行其合同(按合同设计)。这样,您将直接发现问题所在,并且在某些情况下调试会很快或不必要,因为您会收到日志消息,说“此方法应该执行此操作但执行失败”,否则您将花费​​数小时问题从何而来。

于 2013-02-25T17:58:30.473 回答