C++ Can';t指定给链表中的对象

C++ Can';t指定给链表中的对象,c++,c++11,C++,C++11,Head和tail正在填充,并打印出值,但是nodePtr由于某种原因保持为空。当我在VS2015中调试时,头尾号被填充,而该字段保持为空 这是链接列表 #ifndef _LINKED_LIST_ #define _LINKED_LIST_ #include <iostream> class LinkedList { public: struct Node { int number; Node * next; No

Head和tail正在填充,并打印出值,但是nodePtr由于某种原因保持为空。当我在VS2015中调试时,头尾号被填充,而该字段保持为空

这是链接列表

#ifndef _LINKED_LIST_
#define _LINKED_LIST_

#include <iostream>

class LinkedList
{
public:

    struct Node
    {
        int number;
        Node * next;
        Node() : number(NULL), next(NULL) {};
        Node(int number_, Node * next_ = NULL)
        {
            number = number_;
            next = next_;
        }
    }*head, *tail, *nodePtr;


LinkedList();
~LinkedList();

void add(int num);

friend std::ostream& operator<<(std::ostream& out, LinkedList& list);

private:
    int size;
};

#endif // _LINKED_LIST_
\ifndef\u链接列表_
#定义链接列表_
#包括
类链接列表
{
公众:
结构体类型
{
整数;
节点*下一步;
Node():number(NULL),next(NULL){};
节点(整数,节点*下一个=NULL)
{
数字=数字;
下一个=下一个;
}
}*头,*尾,*头;
LinkedList();
~LinkedList();
无效添加(int num);
friend std::ostream&operatornumber=num;
库特数;
if(head==NULL)
{
头=新节点;
tail=newNode;
大小++;
}
其他的
{
tail->next=newNode;
newNode->next=NULL;
tail=newNode;
大小++;
}
//cout number;//为空,或某个随机数
//只是一些测试
库特数;
如果(头部->下一步!=NULL)
{
cout next->number;
}
库特数;

你只能在构造函数中使用nodePtr,你永远不会更改它的值。

你只能在构造函数中使用nodePtr,你永远不会更改它的值。

你在这里缺少了一个基本概念。
nodePtr
不是一个神奇的节点,它知道所有其他节点,或者知道链接列表,或者可以用来打印所有t继承人号码

执行此操作时:

out << list.nodePtr->number << endl;
这调用了
节点
的默认构造函数,该构造函数将
nodePtr->number
设置为零(旁注,您将其初始化为
NULL
,而不是
0
——您不应该将整数类型与指针类型混合,因此将其更改为将值初始化为0)

它的值保持为0,因为您从未修改过它。
nodePtr
始终指向该节点,因为您从未修改过
nodePtr

您实际上想要做的是打印出您的列表。让我建议一种正常的方法,从
头开始,然后按照节点链接进行操作:

std::ostream & operator<<(std::ostream & out, const LinkedList & list)
{
    for( Node *node = list.head; node != nullptr; node = node->next )
    {
        out << node->number << std::endl;
    }
    return out;
}

std::ostream&operator这里缺少一个基本概念。
nodePtr
不是一个神奇的节点,它知道所有其他节点,或者知道链表,或者可以用来打印它们的所有数字

执行此操作时:

out << list.nodePtr->number << endl;
这调用了
节点
的默认构造函数,该构造函数将
nodePtr->number
设置为零(旁注,您将其初始化为
NULL
,而不是
0
——您不应该将整数类型与指针类型混合,因此将其更改为将值初始化为0)

它的值保持为0,因为您从未修改过它。
nodePtr
始终指向该节点,因为您从未修改过
nodePtr

您实际上想要做的是打印出您的列表。让我建议一种正常的方法,从
头开始,然后按照节点链接进行操作:

std::ostream & operator<<(std::ostream & out, const LinkedList & list)
{
    for( Node *node = list.head; node != nullptr; node = node->next )
    {
        out << node->number << std::endl;
    }
    return out;
}


std::ostream&operator@OmidCompSCI只是一个意外,这不是主要的问题。不过我编辑了它,所以谢谢!)你想让它做什么?你唯一更改它的值的时候是在
链接列表中,在那里你分配了一个新的节点。
nodePtr
的含义是什么?只有你知道。如果你期望它的值表示某个东西,那么你必须在某个地方修改它。@paddy我正在尝试一个int的链表:1->2->3等。我觉得我遗漏了一些非常明显的东西,但看不到它。nodePtr应该是包含主题值的链表:
size
未被
LinkedList
u初始化ctor,它看起来是稍后才使用的。这可能是坏的Juju。好吧,让我更明确一点。你的问题让人困惑:“但是nodePtr因为某种原因保持为空”。原因是您从未修改过它。因此,我的问题是问您预期会发生什么,因为在构建
LinkedList
之后,您从未修改
nodePtr
的值。@OmidCompSCI只是一个意外,但这不是主要问题。不过,我编辑了它,所以谢谢!)您希望它做什么?更改其值的唯一时间是在
LinkedList
构造函数中,分配一个新节点。
nodePtr
的含义是什么?只有你知道。如果你希望它的值代表某个东西,那么你必须在某个地方修改它。@paddy我正在尝试一个int的链接列表:1->2->3等等。我觉得我遗漏了一些非常明显的东西,但是c我看不到它。nodePtr应该是包含主题值的链表:
size
未被
LinkedList
构造函数初始化,它看起来以后才使用。这可能是错误的jujuju。好吧,让我更明确一点。你的问题让人困惑:“但是nodePtr由于某种原因保持为空”。原因是你从来没有修改过它。所以我的问题问你会发生什么,因为在构建
LinkedList
之后你从来没有修改过
nodePtr
的值。add函数没有修改它吗?add函数从来没有以任何方式引用过它。你认为哪一行会修改
nodePtr
?不,它是在那个有趣的地方使用的Action。该函数只修改head、tail和size,但根本不使用nodePtr。修改nodePtr的唯一方法是创建LinkedList类的新实例,而不是创建新节点。@TrentP您是建议我在添加的末尾添加
nodePtr=newNode
?不,这会导致内存泄漏。不添加funct吗ion修改它?add函数从不以任何方式引用它。您认为哪一行修改了
nodePtr
?不,它在该函数中使用。该函数只修改头、尾和大小,但nodePtr根本不使用。nodePtr可以修改的唯一方法是创建LinkedList类的新实例,而不是创建新节点@TrentP你是说我应该
std::ostream & operator<<(std::ostream & out, const LinkedList & list)
{
    for( Node *node = list.head; node != nullptr; node = node->next )
    {
        out << node->number << std::endl;
    }
    return out;
}