【发布时间】:2016-09-02 15:34:40
【问题描述】:
我正在尝试创建一个插入方法,其中参数是指向前一个节点的指针。但是我的植入有缺陷。
只有当我像test.insert(n2->_next, 4); 这样插入时它才有效,但这不是前一个指针?如果像test.insert(n2, 4);这样调用,节点没有插入?
谁能告诉我哪里弄错了?
方法(LLToolkit 类的一部分):
void insert(Node<t>* &prevPtr, t data)
{
if (prevPtr == nullptr) return;
prevPtr->_next = new Node<t>(data, prevPtr->_next);
}
void headInsert(Node<t>* &headPtr, t data)
{
headPtr = new Node<t>(data, headPtr);
}
节点
template<typename t>
class Node
{
public:
Node()
{
_next = nullptr;
_data = data();
}
Node(t data = t(), Node<t>* next = nullptr) : _next(next), _data(data) {}
~Node(){ cout << "delete " << _data << _next << endl; }
Node<t> *_next;
t _data;
};
我的测试:
int main()
{
LLToolkit<int> test;
Node<int>* n1 = new Node<int>(1, nullptr);
Node<int>* n2 = new Node<int>(2, n1);
Node<int>* n3 = new Node<int>(3, n2);
test.headInsert(n1, 1);
test.headInsert(n2, 2);
test.headInsert(n3, 3);
// Order is now 3 - 2 - 1
// Should insert new node after n2
// Like this 3 - 2 - 4 - 1
test.insert(n2, 4);
return true;
}
如下行为
应该在灰色标记处插入新节点。
应该像下面这样工作
【问题讨论】:
-
你应该尽量隐藏界面的实现,不要创建新节点和
headInsert它们,让函数根据需要创建新节点,你应该只需要推送数据到你的LLToolkit -
是的,我知道,但这是一个学校作业,并且为班级提供了原型。所以我必须这样实现它并以这种方式进行测试。 @LogicStuff 我在节点之后的坏事。
-
@Mat0 但是这是一个学校作业 -- 而且老师没有使用成员初始化列表。对于课程的其余部分来说,这并不是一个好兆头。另外,为什么要动态分配两个节点以在列表中创建单个节点?你的
main函数使用了new,然后你正在调用的函数,你再次使用new。一个好的链表不应该让链表的用户知道任何关于“节点”的事情。测试程序应该只要求链表插入数据——让链表类自己创建它需要在内部创建的任何节点。 -
所以当
test.headInsert(n1, 1);被执行时,它会创建一个新节点,其中1作为_data和_next作为节点n1(有_data = 1, _next = nullptr),我很惊讶你的打印方法甚至可以正确打印列表,因为它看起来不像headInsert正在正确构建它。
标签: c++ pointers linked-list singly-linked-list