我正在基于第一性原理在 C++ 中实现一个无序列表。我的(到目前为止部分完成)实现是:
#include <iostream>
class Node {
int m_data;
Node *m_next;
public:
Node(int data)
{
m_data = data;
m_next = nullptr;
}
int getData() { return m_data; }
void setData(int data) { m_data = data; }
Node* getNext() { return m_next; }
void setNext(Node *next) { m_next = next; }
};
class UnorderedList {
public:
Node *m_head;
public:
UnorderedList()
{
m_head = nullptr;
}
bool isEmpty() { return m_head == nullptr; }
void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}
void remove(int data);
bool search(int data);
};
int main()
{
UnorderedList list1;
list1.appendToHead(32);
list1.appendToHead(47);
list1.appendToHead(90);
std::cout << list1.m_head->getData() << '\n';
std::cout << list1.m_head->getNext()->getData() << '\n';
return 0;
}
我能够正确地将列表的头部打印为“90”,但下一行(即 getNext()->getData())被打印为一个大的随机数 (281314120)。这是什么原因?
最佳答案
void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}
永远不要用 automatic storage duration 存储对象的地址.当 appendToHead
方法完成时,该对象(在本例中为 temp
)将不复存在。
您这样做并调用了未定义行为。你可能想做:
void appendToHead(int data)
{
Node* temp = new Node(data);
temp->setNext(m_head);
m_head = temp;
}
您还应该考虑满足 The Rule Of Five
而不是原始指针,另外探索 std::unique_ptr
的使用.
关于c++ - 在我的 C++ 链表实现中取消引用节点指针给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874161/