我基于第一原则在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;
}
我可以正确打印列表的标题为&#39; 90&#39;,但是下一行(即getNext() - &gt; getData())会被打印为一个大的随机数(281314120) 。这是什么原因?
答案 0 :(得分:1)
void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}
永远不要使用automatic storage duration存储对象的地址。当temp
方法完成时,该对象(在这种情况下,appendToHead
)将不复存在。
您这样做并调用了未定义的行为。你可能想这样做:
void appendToHead(int data)
{
Node* temp = new Node(data);
temp->setNext(m_head);
m_head = temp;
}
您还应该考虑满足The Rule Of Five
而不是原始指针,另外探讨std::unique_ptr
的使用。