【问题标题】:Why is my output not showing the node containing 14 when I print?为什么我的输出在打印时没有显示包含 14 的节点?
【发布时间】:2021-05-08 19:05:16
【问题描述】:

为什么我的输出在打印时没有显示包含14 的节点?

我想我在实现链表时遗漏了一些关键原则:

#include<iostream>
using namespace std;
struct ListNode
{
    int value;
    ListNode *next;
    ListNode(int d,ListNode* p=NULL) //constructor
    {
        value=d;
        next=p;
    }
};

int main()
{
    ListNode* header=NULL;
    header=new ListNode(5);
    ListNode* ptr=header; //pointer to find the correct position

    ListNode* sptr=new ListNode(13);
    header->next=sptr;
    ListNode* tptr=new ListNode(19);
    sptr->next=tptr;
    ListNode* t=new ListNode(14);
    while((ptr->value) < (t->value))
    {
        ptr=ptr->next;
    }

    ListNode* g=ptr;
    ptr=t;
    t->next=g;

    while(header!=NULL)
    {
        cout<<header->value<<" ";
        header=header->next;
    }

    return 0;
}

【问题讨论】:

  • 从您的代码中不清楚您想要实现什么。您已经很好地实现了 ListNode 项,尽管您可能会将其设为模板,因此您不必将整数用作值。无论如何,“t”变量永远不会添加到您的原始列表中,因此您永远无法打印它。将 cmets 添加到代码中以明确您的意图。通常这也有助于自己找出问题所在。另见橡皮鸭调试:en.wikipedia.org/wiki/Rubber_duck_debugging
  • 您将ptr 指向ListNode(14),但您没有将ListNode(13)-&gt;next 指向ListNode(14)。您需要现有节点之一的 next 指针指向您的新节点。
  • @Welbog 为什么有必要?不是 ptr==sptr->next 即已经将节点 13 的地址指向 14 节点

标签: c++ data-structures linked-list insert singly-linked-list


【解决方案1】:

您没有将值为 14 的节点添加到列表中。即列表中的两个节点都没有指向在此声明中创建的节点

 ListNode* t=new ListNode(14);

您所做的唯一事情是将节点的数据成员 next 设置为值为 19 的节点的地址。

ListNode* g=ptr;
ptr=t;
t->next=g;

这里声明

ptr=t;

没有效果。

如果在这个循环之后

while(header!=NULL)
{
    cout<<header->value<<" ";
    header=header->next;
}

你将把这段代码sn-p放到你的程序中

cout << '\n';

while ( ptr != NULL )
{
    cout<<ptr->value<<" ";
    ptr=ptr->next;
}

你会得到程序输出

5 13 19 
14 19 

为了清楚,然后注意这个循环之后

  while((ptr->value) < (t->value))
  {
    ptr=ptr->next;
  }

指针ptr指向值为19的节点。你不能用指针在这个节点之前插入值为14的新节点,因为你有一个单链表和值为14的节点19 只有一个对下一个节点的引用。

因此,您可以使用while循环后获得的指针ptr,仅在值为19的节点之后插入值为14的新节点。

如果要在值为 19 的节点之前插入值为 14 的新节点,则不要使用此代码 sn-p

  while((ptr->value) < (t->value))
  {
    ptr=ptr->next;
  }
  
ListNode* g=ptr;
ptr=t;
t->next=g;

你应该像下面这样写

  ListNode *prev = nullptr;   
  while( ptr != nullptr && ptr->value < t->value )
  {
    prev = ptr;
    ptr=ptr->next;
  }
  
  t->next = ptr;
  prev == nullptr ? header = t : prev->next = t;

【讨论】:

  • " 并且您不能使用指针在该节点之前插入值为 14 的新节点,因为您有一个单链表,而值为 19 的节点只有一个对下一个的引用节点。”感谢您提供如此详细的答案,但我无法理解引用的句子。为什么 (ptr=t;) 没有任何影响?
  • @WaqarAhmed 您将 t 的值分配给 ptr。现在这两个变量 t 和 ptr 具有相同的值,即它们都指向同一个节点,值为 14。然后呢?这个任务的结果是什么?对榜单有何影响?
  • 没错!在我看来,一旦我分配了这个,我可以使用 (t->next) 指向包含 19 的节点的地址,即 g 指针..从而链接整个列表。 (我不明白这是怎么回事)
  • @WaqarAhmed 您为指针 t 指向的节点的数据成员 next 分配了包含值 19 的节点的地址。但是列表中的任何一个节点都没有指向新节点值 14。
  • "但是列表中没有一个节点指向值为 14 的新节点" 为什么?
猜你喜欢
  • 2021-02-20
  • 2021-12-24
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多