C++ 链表中节点的功能是什么?

C++ 链表中节点的功能是什么?,c++,linked-list,C++,Linked List,我正在从头创建一个链表。这是代码。首先,我定义了node*root=NULL 这意味着根节点没有元素。但是当我附加第一个元素时,我必须创建root=newnode() 是不是node*root=NULL是否已创建根节点?那么为什么我必须使用root=newnode() 实际上我被node*root=NULL混淆了&根=新节点()&root==NULL'。你能让我明白吗 #include<bits/stdc++.h> using namespace std; struct node {

我正在从头创建一个链表。这是代码。首先,我定义了
node*root=NULL

这意味着根节点没有元素。但是当我附加第一个元素时,我必须创建
root=newnode()

是不是
node*root=NULL是否已创建根节点?那么为什么我必须使用
root=newnode()

实际上我被
node*root=NULL混淆了&
根=新节点()&
root==NULL
'。你能让我明白吗

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int roll;
    node *next;

};

node *root=NULL;

void append(int roll)
{
    if( root==NULL)
    {
        root=new node();
        root->roll=roll;
        root->next=NULL;

    }
    else
    {
        node *current_node=root;


        while(current_node->next!=NULL)

        {
            current_node=current_node->next;

        }
        node *newnode=NULL;
        newnode=new node();
        newnode->roll=roll;
        newnode->next=NULL;
        current_node->next=newnode;


    }
}
#包括
使用名称空间std;
结构节点
{
整流罩;
节点*下一步;
};
node*root=NULL;
无效附加(整数滚动)
{
if(root==NULL)
{
根=新节点();
根->滚动=滚动;
root->next=NULL;
}
其他的
{
节点*当前_节点=根;
while(当前节点->下一步!=NULL)
{
当前节点=当前节点->下一步;
}
node*newnode=NULL;
newnode=新节点();
新建节点->滚动=滚动;
newnode->next=NULL;
当前节点->下一步=新节点;
}
}

原因在于
其他方面

您正在查找当前列表的结尾,并附加了一个元素。要实现这一点,您可以更改当前最后一个节点的
next
指针(它是
NULL
,因为它是最后一个)以指向新节点

但是如果列表中根本没有节点,会发生什么呢?没有要修改的
next
指针,也不能追加:必须创建第一个节点,而不是任何其他节点的
next
。这种情况在
else
子句中没有处理,它是
root=new节点()

一句话。通常情况下,一个不会追加,因为您必须扫描整个列表

如果您真的想追加,最好跟踪指向最后一个元素的指针。那么您有两个指针:根指针和最后一个指针。仍然需要根目录才能扫描列表

如果您没有跟踪最后一个指针,最好是始终预先结束(如果您愿意,可以假装列表的最后一个元素是根节点)。这是通常对FIFO堆栈所做的


顺便说一句,在预结束时,您不必处理最初的
NULL
根:这个
NULL
将成为第一个节点的
下一个
指针,并且没有其他事情可做。

原因在于
其他

您正在查找当前列表的结尾,并附加了一个元素。要实现这一点,您可以更改当前最后一个节点的
next
指针(它是
NULL
,因为它是最后一个)以指向新节点

但是如果列表中根本没有节点,会发生什么呢?没有要修改的
next
指针,也不能追加:必须创建第一个节点,而不是任何其他节点的
next
。这种情况在
else
子句中没有处理,它是
root=new节点()

一句话。通常情况下,一个不会追加,因为您必须扫描整个列表

如果您真的想追加,最好跟踪指向最后一个元素的指针。那么您有两个指针:根指针和最后一个指针。仍然需要根目录才能扫描列表

如果您没有跟踪最后一个指针,最好是始终预先结束(如果您愿意,可以假装列表的最后一个元素是根节点)。这是通常对FIFO堆栈所做的


顺便说一句,当您进行预处理时,您不必处理最初的
NULL
根:这个
NULL
将成为第一个节点的
下一个
指针,无需其他操作。

您的链接列表将是一个由指针连接的
节点的列表

如果分配
节点*root=nullptr
,您将无法访问
根目录的任何成员。毕竟,root并不指向节点,而是指向
nullprt
root=new Node()
使用默认构造函数创建一个新的节点元素。您现在可以访问此元素的成员。这就是为什么
root->rool
root->next
现在可以工作的原因

node*root
:声明root是指向
节点的指针

root=NULL
:对我来说似乎过时了,但会指定

root=new node()
:将root分配给使用默认构造函数创建的
节点的实例


root==nullprt
:如果root是nullptr,则为True。

您的链接列表将是一个由指针连接的
节点列表

如果分配
节点*root=nullptr
,您将无法访问
根目录的任何成员。毕竟,root并不指向节点,而是指向
nullprt
root=new Node()
使用默认构造函数创建一个新的节点元素。您现在可以访问此元素的成员。这就是为什么
root->rool
root->next
现在可以工作的原因

node*root
:声明root是指向
节点的指针

root=NULL
:对我来说似乎过时了,但会指定

root=new node()
:将root分配给使用默认构造函数创建的
节点的实例


root==nullprt
:如果root是nullptr,则为True。

首先,您必须了解指针是什么。他们有记忆地址

不是节点
*root=NULL是否已创建根节点

否。
不是
节点
,而是指向
节点
的指针。它是用<代码> null <代码>初始化的(在C++ <代码> NulLPTR < /代码>中应该是首选的),所以我