函数调用后指针自动更改简单链表C ++

时间:2018-05-22 15:15:52

标签: c++ linked-list

我是C ++的初学者,我在C ++中实现了简单的链表。当我尝试添加第二个元素到列表时,头部中下一个元素的指针正在改变

int main()
{
    LinkedList ll;
    string test;
    test="we";
    ll.add("we");
    ll.add("are");
    cout << "ok working" << endl;
    return 0;
}

class LinkedList
{
    public:
        LinkedList();
        void add(string data);
    protected:
    private:
        class node{
        private:
            string data;
        public:
            node *next;
            node(string data,node *next);
            node(string data);
            node();
        };

        node *head;
};

LinkedList::LinkedList()
{
    head=NULL;
    cout<<"ok";
}


void LinkedList::add(string data){
    if(!head){
        node tmphead(data,NULL);
        this->head=&tmphead;
    }else{
        node *temp;
        temp=head;
        while(temp->next){
            temp=temp->next;
        }
        node newnode(data);
        temp->next=&newnode;
    }
}
LinkedList::node::node(string data,node *next){
    LinkedList::node::data=data;
    LinkedList::node::next=next;
cout<<"New node created with : "+data<< endl;

}
LinkedList::node::node(){
    LinkedList::node::data="";
    LinkedList::node::next=NULL;
    //LinkedList::node::
//this->data="";
//this->next=NULL;
}
LinkedList::node::node(string data){
LinkedList::node::data=data;
LinkedList::node::next=NULL;
}

添加“we”时,head-&gt;接下来是0x0。一旦控件再次为“是”进入添加功能,则head-&gt;接下来是0x3。它会自动更改。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

问题是你在不使用动态内存的情况下构建动态结构。变量tmphead和newnode的生命周期仅限于add()调用,因此它们的地址在退出时变为无效。请查看某些教程中的新部分和删除部分

答案 1 :(得分:1)

您要将指向本地变量的指针指向head。那真是太糟糕了。

if(!head){
    node tmphead(data,NULL);
    this->head=&tmphead;
} // After this bracket, tmphead was dealocated

当你做这种事情时,任何事情都可能发生,因为你正在访问未分配给你的内存。

同样在这里:

    node newnode(data);
    temp->next=&newnode;
    // after function exits, `temp->next` points to deallocated memory

相反,在两种情况下都使用new

void LinkedList::add(string data){
    if(!head){
        this->head = new node(data, nullptr);
    }else{
        node* temp;
        temp=head;
        while(temp->next){
            temp = temp->next;
        }
        temp->next = new node(data);
    }
}

此外,请记住使用deletenew创建的所有内容创建一些方法。

例如:

LinkedList::~LinkedList() {
    delete head;
}
node::~node() {
    // WARNING: this is recursive
    // that's not bad but it's important to be aware of it
    if(next != nullptr)
        delete next;
}

您无需删除string data - 删除node时会自动调用析构函数。