【问题标题】:C++ Single Linked List Insertion?C ++单链表插入?
【发布时间】: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


【解决方案1】:

按照您的代码,您似乎正在执行以下操作。

  1. 创建一个值为 1 和空下一个指针的新节点。

    Node<int>* n1 = new Node<int>(1, nullptr);
    

    结果:

    n1(=1) -- nullptr
    
  2. 创建一个值为 2 的新节点和一个指向 n1 的 next 指针。

    Node<int>* n2 = new Node<int>(2, n1);
    

    结果:

    n2(=2) -- n1(=1) -- nullptr
    
  3. 创建一个值为 3 的新节点和一个指向 n2 的 next 指针。

    Node<int>* n3 = new Node<int>(3, n2);
    

    结果:

    n3(=3) -- n2(=2) -- n1(=1) -- nullptr
    
  4. 创建一个值为 3 的新节点,下一个指向 n1 的指针,并将 n1 更改为指向新节点。

    test.headInsert(n1, 1);
    

    结果:

                       n1(=1)
                         |
                         |
    n3(=3) -- n2(=2) -- nn1(=1) -- nullptr
    
  5. n2n3 做同样的事情:

    结果:

    n3(=3)     n2(=2)     n1(=1)
      |           |         |
      |           |         |
    nn3(=3) -- nn2(=2) -- nn1(=1) -- nullptr
    
  6. n2 之后插入 4。

    结果:

    n3(=3)     n2(=2)     n1(=1)
      |           |         |
      |         nn4(=4)     |
      |           |         |
    nn3(=3) -- nn2(=2) -- nn1(=1) -- nullptr
    

所以问题是,这真的是你想要的吗?对不起,如果我误解了你的代码,如果我不能在这里编译它有点困难。

【讨论】:

  • 我添加了 headInsert 以便您了解它是如何工作的。如果您查看控制台输出,它会打印为:[adress of node] [data] [adress of next node]。所以指针是连接的
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 2015-10-20
  • 2020-12-11
  • 1970-01-01
  • 2019-04-26
  • 2018-10-08
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多