我是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。它会自动更改。
非常感谢任何帮助。
答案 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);
}
}
此外,请记住使用delete
为new
创建的所有内容创建一些方法。
例如:
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
时会自动调用析构函数。