我想创建一个带有类的链表。我有两个类,一个LinkedList和另一个LinkedNode。我的问题是,我的函数InsertAtEnd总是删除当前节点。所以当我想打印链表的时候,我什么都看不到。我知道多亏了调试器,在InsertAtEnd函数中,我们没有进入while循环,这就是问题所在。但经过几次尝试后,我无法解决我的问题。
这是我的代码:
void LinkedList::InsertAtend(int data)
{
LinkedNode* node = new LinkedNode();
node->setData(data); node->setNext(nullptr);
LinkedNode* tmp = _header;
if (tmp != NULL)
{
while (tmp->getNext() != nullptr)
{
tmp = tmp->getNext();
}
tmp->setData(data);
tmp->setNext(nullptr);
}
else
{
_header = node;
}
}
My class LinkedNode:
class LinkedNode
{
public:
LinkedNode();
~LinkedNode();
void setData(int data);
void setNext(LinkedNode* next);
int getData() const;
LinkedNode* getNext() const;
private:
int _data;
LinkedNode* _next;
};
我的类LinkedList:# pragma一旦# include# include"LinkedNode.h"使用命名空间std;
class LinkedList
{
public:
LinkedList();
~LinkedList();
void PrintList();
void InsertAtend(int data);
void PrintList() const;
private:
LinkedNode* _header;
};
感谢您的帮助
tmp->setData(data);
您的tmp不是要添加的节点,而是列表中的最后一个。
tmp
是最后一个节点,所以如果不想删除它,就不应该在其中写入值data
。您应该将它链接到新节点,您将其命名为node
。
tmp->setData(data);
tmp->setNext(nullptr);
你应该写
tmp->setNext(node)
在循环结束时,tmp
是当前列表中的最后一个节点。由于希望在最后一个节点之后添加新的node
,因此需要执行
tmp->setNext(node);
来附加它(并且不设置数据,因为数据已经设置为新的node
)。
还需要注意的是,如果在列表的当前末端保留另一个成员变量(_tail
),则实际上根本不需要遍历整个列表。然后,您可以直接访问它,只需添加和更新。