我正在尝试创建一个链表,我有一个Node类和一个list类。列表构造函数将Head和Tail(类型为Node*(设置为nullptr。这两个类都是模板化的。我的列表插入方法不会让头指针指向开头,我真的不知道为什么。它只在head==nullptr时分配一次。
这是插入方法。
void insert(T item)
{
//insert item at end
//allocate new node
Node<T> tempNode = Node<T>(item);
Node<T> *temp = &tempNode;
//put in data
temp->setData(item);
//end of list set to null
temp->setNext(nullptr);
//if first node
if (head == nullptr)
{
//head and tail are set to temp
head = temp;
cout << "head1: " << head->getData() << endl;
tail = temp;
} else //not first node in list
{ cout << "head: " << head->getData() << endl;
tail->setNext(temp);
tail = temp;
}
cout << "tail: " << tail->getData() << endl;
cout << "head: " << head->getData() << endl;
cout << "head: " << head << endl;
}
cout只是让我看看发生了什么。每个head->getData()
都会产生当前保存在temp中的值,但当我打印头时,每次都是相同的地址。
为了清楚起见,我有一个单独的测试文件,它循环0-9,试图用每个值插入。结果是。。。
head1: 0
tail: 0
head: 0
head: 0x7fffc574dc40
head: 1
tail: 1
head: 1
head: 0x7fffc574dc40
head: 2
tail: 2
head: 2
head: 0x7fffc574dc40
head: 3
tail: 3
head: 3
head: 0x7fffc574dc40
head: 4
tail: 4
head: 4
head: 0x7fffc574dc40
head: 5
tail: 5
head: 5
head: 0x7fffc574dc40
head: 6
tail: 6
head: 6
head: 0x7fffc574dc40
head: 7
tail: 7
head: 7
head: 0x7fffc574dc40
head: 8
tail: 8
head: 8
head: 0x7fffc574dc40
head: 9
tail: 9
head: 9
head: 0x7fffc574dc40
一个主要问题是这两行:
Node<T> tempNode = Node<T>(item);
Node<T> *temp = &tempNode;
在这里,使temp
指向局部变量tempNode
。当函数insert
返回时,tempNode
的寿命结束,并且它被销毁。指针temp
(以及该指针的所有副本(将变为无效。之后尝试使用此指针将导致未定义的行为。
创建新节点的通常解决方案是动态分配它们:
Node<T>* temp = new Node<T>(item);
当然,您必须记住delete
所有以这种方式创建的节点,以避免内存泄漏。