C ++指针,引用和AVL树

时间:2016-01-15 03:21:11

标签: c++ pointers data-structures reference tree

我是一名大学生,作为我的最后一项任务,我必须创建AVL Tree字典。我试图自己写,我设法写了很多,但我有一个问题。当我使用我的所有getter和setter用于随机节点甚至它们的向量时,它都有效。但是当我在Tree方法中尝试setRoot时,它会失败。我的意思是,它只运行一次,但是一旦我尝试使用root用avl.getRoot调用它或在我的实现中以root身份调用它就失败了。我的程序崩溃了。这是我曾经做过的最艰难的计划。你能解决我的问题并给我一些关于重要内容的提示吗?先感谢您。

Main.cpp - 测试

  Node n1("clown",1);
    Node n2("cat",1);
    Node n3("kid",1);
    Node n4("wasp",1);
    n1.setLSon(&n2);
    std::cout<<"ENG: "<<n1.getLSon().getWord().getEng()<<std::endl;
    n1.setRSon(&n3);
    std::cout<<"ENG: "<<n1.getRSon().getWord().getEng()<<std::endl;
    n1.setParent(&n4);
    std::cout<<"ENG: "<<n1.getParent().getWord().getEng()<<std::endl;
    if(n2.hasLSon)
    n2.getLSon();
    else
    std::cout<<"n2 does not have a left son"<<std::endl;
    AVL_Tree avl;
    avl.addNode("cirrus",1);
    avl.addNode("monkey",1);
    std::cout<<"ENG: "<<avl.branches[0].getWord().getEng()<<std::endl;
    std::cout<<"ENG: "<<avl.branches[1].getWord().getEng()<<std::endl;
    avl.branches[0].setLSon(&avl.branches[1]);
    std::cout<<"ENG: "<<avl.branches[0].getLSon().getWord().getEng()<<std::endl;
    avl.branches[1].setParent(&avl.branches[0]);
    std::cout<<"ENG: "<<avl.branches[1].getParent().getWord().getEng()<<std::endl;
/*Error is being called here*/
    **std::cout<<"ROOT: "<<avl.getRoot().getWord().getEng()<<std::endl;** 
}

树类:有问题的功能

AVL_Tree::AVL_Tree()
{
    root=NULL;
}

void AVL_Tree::sort()
{

}

Node AVL_Tree::getRoot()
{
    return *root;
}

void AVL_Tree::addNode(std::string eng,int count)
{
    int i=0;
    branches.push_back(Node(eng,count));
    for(i;i<branches.size();i++)
    {
        if(branches[i].getWord().getEng()==eng)
        break;
    }
    if(branches.size()==1)
    {
    root=&(branches[i]);
    std::cout<<"ROOT DODANY"<<endl;
    std::cout<<root->getWord().getEng()<<std::endl;
    }
    else
    std::cout<<"ROOTEM JEST: "<<root->getWord().getEng()<<std::endl;
    if(!isBinary());
    sort();
}

树类

class AVL_Tree
{
    public:
                                AVL_Tree();
            void                sort();
            void                addNode(std::string eng,int count);
            void                deleteNode(std::string eng);
            Node                findNode(std::string eng);
            Node                getRoot();
            bool                isBinary();
            bool                isNode(std::string eng);
            std::vector<Node>   branches;

    private:
            Node                *root;
            int                 leftFactor;
            int                 rightFactor;

};

Node.cpp

Node::Node(std::string eng,int count):word(eng,count)
{
    parent=NULL;
    l_son=NULL;
    r_son=NULL;
    hasLSon=false;
    hasRSon=false;
}

Node::~Node()
{
    parent=NULL;
    l_son=NULL;
    r_son=NULL;
}

Word Node::getWord()
{
    return word;
}

Node Node::getLSon()
{
    return *l_son;
}

Node Node::getRSon()
{
    return *r_son;
}

Node Node::getParent()
{
    return *parent;
}

void Node::setLSon(Node *n)
{
    l_son=n;
    hasLSon=true;
}

void Node::setRSon(Node *n)
{
    r_son=n;
    hasRSon=true;
}

void Node::setParent(Node *n)
{
    parent=n;
}

Node.h

class Node
{
    public:
                            Node(std::string eng,int count);
                            ~Node();
            Word            getWord();
            Node            getLSon();
            Node            getRSon();
            Node            getParent();
            void            setLSon(Node *node);
            void            setRSon(Node *node);
            void            setParent(Node *node);
            bool            hasLSon;
            bool            hasRSon;
    private:
            Node            *parent;
            Node            *l_son;
            Node            *r_son;
            Word            word;
};

1 个答案:

答案 0 :(得分:0)

var repList = $("#reportingList").jqGrid ('getDataIDs'); var appFin = 0; $.each(repList, function(i,v){ var repListData = $("#reportingList").jqGrid('getRowData', v); var repApp = repListData.type; if (repApp == "Approval"){ appFin++; }; }); if (appFin >= 5) { $("#btnApprovalCon").button("option", "disabled", true); var shouldDel = $("#reportingList").jqGrid('getDataIDs'); var newShould = []; for (var ii=(shouldDel.length-1); ii>4; ii--){ var dd = shouldDel[ii]; newShould = [dd]; $("#reportingList").jqGrid('delRowData', newShould); }; }; 中,您指定了addNodebranches元素的指针。稍后调用root将添加一个新分支,重新分配向量的内存,并使addNode指针无效。当您尝试使用此无效指针时,这会导致以后崩溃。

在addNode末尾的if语句之后你还有一个分号,我不认为你想要在那里。编译所有打开的警告,以便收到有关此类事件的通知。