为什么我不能将新元素推回到列表中
Why can't I pushback a new element to a list
我在尝试将新元素推回列表时遇到问题。
本题是根据PushBack()在主体中的调用编写函数实现。所以我的问题只是关于函数 PushBack()
.
#include <iostream>
class Node{
public:
static Node* MakeNode() { return new Node(100); }
Node* prev;
Node* next;
int value;
private:
Node(int num) : value(num), prev(NULL), next(NULL) {}
};
void PushBack(Node* simple, Node* newNode){
if (simple == NULL){
//still a empty list
simple = newNode;
}
else{
//need to loop to the end of list because there is no "tail" in the class
Node* itr = simple;
while (itr->next != NULL){
itr = itr->next;
}
newNode->prev = itr;
itr->next = newNode;
}
return;
}
int main()
{
Node* simple = NULL;
PushBack(simple, Node::MakeNode());
std::cout << (simple == NULL);
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
while (simple != NULL){
std::cout << simple->value << std::endl;
simple = simple->next;
}
return 0;
}
我有两个关于函数参数类型的问题PushBack()
:
MakeNode()
的 return 类型是 static Node*
,但为什么我们需要将 PushBack()
中的第二个参数类型设置为 Node*
?为什么不 static Node *
?
一开始,我尝试了void PushBack(Node* simple, Node* newNode)
,但是当程序完成并从PushBack()
退出时,simple
又变成了NULL
。
所以不能将新元素添加到列表中。我必须使用 void PushBack(Node*& simple, Node* newNode)
.
为什么我需要在这里添加一个&
符号?我想如果我将指针值传递给函数,指针简单可以直接改变。但似乎并非如此。
我的问题和这个段有什么区别:?
void changeVal(int* data){
for (int i = 0; i < 9; i++)
*(data + i) = 99;
}
void main()
{
int *data;
data = new int[10];
changeVal(data);
for (int i = 0; i < 9; i++)
std::cout << data[i] << std::endl;
}
我把指针data
传给了changeVal()
,函数内部可以改变内容。不太明白两者的区别
我在网上找不到有用的解释,所以我在这里问。
不是,MakeNode()
的return类型是Node*
。您可以将 class 方法声明为 static
,这样您就可以在不需要 class 实例的情况下调用该方法,您可以在 class 类型本身上调用该方法。本例中的 static
不是 return 值的一部分,它是 class 方法本身的一部分。至于PushBack()
,没有static
函数参数之类的东西。该函数作用于 Node
class 的特定实例,因此它只是一个常规指针。
当您将 simple
参数声明为 Node*
时,您正在按值 传递 Node*
变量 。该参数接收 Node*
变量的 当前值 的本地副本。函数为读取或更改参数值所做的任何操作都是使用 copy 而不是 original 变量完成的。这就是为什么当 PushBack()
退出时 main()
中的 simple
变量没有改变。
另一方面,当您将 simple
参数声明为 Node*&
时,您将通过引用 传递 Node*
变量 。参数接收原Node*
变量的内存地址。函数读取或更改参数值的任何操作都是直接使用 original 变量完成的,而不是 copy。这就是为什么 main()
中的 simple
变量在 PushBack()
退出时发生变化。
A reference 本质上是一个编译器管理的指针。不允许将其设置为 NULL,并且只要您 read/write 一个值 from/to 它就会自动解除引用。因此,如果您将引用视为隐式指针,则 PushBack(Node*&)
的功能等同于 PushBack(Node**)
(具有额外的编译器验证),类似于以下内容:
void PushBack(Node** simple, Node* newNode){
if (*simple == NULL){
//still a empty list
*simple = newNode;
}
else{
//need to loop to the end of list because there is no "tail" in the class
Node* itr = *simple;
while (itr->next != NULL){
itr = itr->next;
}
newNode->prev = itr;
itr->next = newNode;
}
return;
}
PushBack(&simple, ...);
您需要传递一个指针引用而不仅仅是一个指针,这样
simple 指向的地址可以在 PushBack 函数中更改。
这是来自 MSDN 的定义。
References to pointers can be declared in much the same way as
references to objects. Declaring a reference to a pointer yields a
modifiable value that is used like a normal pointer.
让我创建一个简单的插图:
地址 |值
[0001]->
[0002]->
[0003]->
[0004]->
......
[nnnn]->
当你开始你的程序时,你有指向 NULL 的简单变量:
[0001]->NULL
[0002]
[0003]
[0004]
......
[nnnn]
当您第一次调用 PushBack 时,您只是传递指向的值
通过简单的变量,它只是 NULL。
[0001]->NULL
当您在 PushBack 函数中更改它的值时,您只是
更改该函数的本地副本而不是实际的指针简单变量。
完成对 PushBack 的调用后,您的简单变量仍指向
为 NULL。
现在,当您传递引用指针时,您传递的是用作指针的简单变量的可修改值。当你改变指针的值时,你也在改变实际简单变量指向的值。
使用指针引用调用 PushBack 后,简单变量将
现在指向 MakeNode 返回的新实例的地址。
[0001]->newNode
[0002]
[0003]
[0004]
......
[nnnn]
我在尝试将新元素推回列表时遇到问题。
本题是根据PushBack()在主体中的调用编写函数实现。所以我的问题只是关于函数 PushBack()
.
#include <iostream>
class Node{
public:
static Node* MakeNode() { return new Node(100); }
Node* prev;
Node* next;
int value;
private:
Node(int num) : value(num), prev(NULL), next(NULL) {}
};
void PushBack(Node* simple, Node* newNode){
if (simple == NULL){
//still a empty list
simple = newNode;
}
else{
//need to loop to the end of list because there is no "tail" in the class
Node* itr = simple;
while (itr->next != NULL){
itr = itr->next;
}
newNode->prev = itr;
itr->next = newNode;
}
return;
}
int main()
{
Node* simple = NULL;
PushBack(simple, Node::MakeNode());
std::cout << (simple == NULL);
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
while (simple != NULL){
std::cout << simple->value << std::endl;
simple = simple->next;
}
return 0;
}
我有两个关于函数参数类型的问题PushBack()
:
MakeNode()
的 return 类型是static Node*
,但为什么我们需要将PushBack()
中的第二个参数类型设置为Node*
?为什么不static Node *
?一开始,我尝试了
void PushBack(Node* simple, Node* newNode)
,但是当程序完成并从PushBack()
退出时,simple
又变成了NULL
。 所以不能将新元素添加到列表中。我必须使用void PushBack(Node*& simple, Node* newNode)
.
为什么我需要在这里添加一个&
符号?我想如果我将指针值传递给函数,指针简单可以直接改变。但似乎并非如此。
我的问题和这个段有什么区别:?
void changeVal(int* data){
for (int i = 0; i < 9; i++)
*(data + i) = 99;
}
void main()
{
int *data;
data = new int[10];
changeVal(data);
for (int i = 0; i < 9; i++)
std::cout << data[i] << std::endl;
}
我把指针data
传给了changeVal()
,函数内部可以改变内容。不太明白两者的区别
我在网上找不到有用的解释,所以我在这里问。
不是,
MakeNode()
的return类型是Node*
。您可以将 class 方法声明为static
,这样您就可以在不需要 class 实例的情况下调用该方法,您可以在 class 类型本身上调用该方法。本例中的static
不是 return 值的一部分,它是 class 方法本身的一部分。至于PushBack()
,没有static
函数参数之类的东西。该函数作用于Node
class 的特定实例,因此它只是一个常规指针。当您将
simple
参数声明为Node*
时,您正在按值 传递Node*
变量 。该参数接收Node*
变量的 当前值 的本地副本。函数为读取或更改参数值所做的任何操作都是使用 copy 而不是 original 变量完成的。这就是为什么当PushBack()
退出时main()
中的simple
变量没有改变。另一方面,当您将
simple
参数声明为Node*&
时,您将通过引用 传递Node*
变量 。参数接收原Node*
变量的内存地址。函数读取或更改参数值的任何操作都是直接使用 original 变量完成的,而不是 copy。这就是为什么main()
中的simple
变量在PushBack()
退出时发生变化。
A reference 本质上是一个编译器管理的指针。不允许将其设置为 NULL,并且只要您 read/write 一个值 from/to 它就会自动解除引用。因此,如果您将引用视为隐式指针,则 PushBack(Node*&)
的功能等同于 PushBack(Node**)
(具有额外的编译器验证),类似于以下内容:
void PushBack(Node** simple, Node* newNode){
if (*simple == NULL){
//still a empty list
*simple = newNode;
}
else{
//need to loop to the end of list because there is no "tail" in the class
Node* itr = *simple;
while (itr->next != NULL){
itr = itr->next;
}
newNode->prev = itr;
itr->next = newNode;
}
return;
}
PushBack(&simple, ...);
您需要传递一个指针引用而不仅仅是一个指针,这样 simple 指向的地址可以在 PushBack 函数中更改。
这是来自 MSDN 的定义。
References to pointers can be declared in much the same way as references to objects. Declaring a reference to a pointer yields a modifiable value that is used like a normal pointer.
让我创建一个简单的插图:
地址 |值
[0001]->
[0002]->
[0003]->
[0004]->
......
[nnnn]->
当你开始你的程序时,你有指向 NULL 的简单变量:
[0001]->NULL
[0002]
[0003]
[0004]
......
[nnnn]
当您第一次调用 PushBack 时,您只是传递指向的值 通过简单的变量,它只是 NULL。
[0001]->NULL
当您在 PushBack 函数中更改它的值时,您只是 更改该函数的本地副本而不是实际的指针简单变量。 完成对 PushBack 的调用后,您的简单变量仍指向 为 NULL。
现在,当您传递引用指针时,您传递的是用作指针的简单变量的可修改值。当你改变指针的值时,你也在改变实际简单变量指向的值。 使用指针引用调用 PushBack 后,简单变量将 现在指向 MakeNode 返回的新实例的地址。
[0001]->newNode
[0002]
[0003]
[0004]
......
[nnnn]