为什么我不能将新元素推回列表
Why can't I pushback a new element to a list
当我尝试将新元素推回列表时,我遇到了一个问题。
这个问题是根据主体在主体中的呼叫来编写函数的实现。所以我的问题只是函数 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()
的返回类型是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()
的返回类型是Node*
。您可以将类方法声明为static
,以便可以在不需要类实例的情况下调用该方法,您可以在类类型本身上调用该方法。在这种情况下,static
不是返回值的一部分,它是类方法本身的一部分。至于PushBack()
,没有static
功能参数之类的东西。该功能在Node
类的特定实例上作用,因此它只是一个常规的指针。 -
当您将
simple
参数声明为Node*
时,您将通过Value 传递Node*
变量。该参数接收Node*
变量的当前值的本地副本。函数可以使用 copy 而不是 oinder 变量来读取或更改参数值的任何事情。这就是为什么main()
中的simple
变量在PushBack()
退出时没有更改。另一方面,当您将
simple
参数称为Node*&
时,您将通过参考传递Node*
变量。该参数接收原始Node*
变量的内存地址。函数可以使用 onsirent 变量直接完成参数的读取或更改参数的值,而不是 copy 。这就是为什么main()
中的simple
变量在PushBack()
退出时正在更改。
a 参考本质上是编译器管理的指针。不允许将其设置为null,并且每当您从/写入/写入一个值时,它会自动引入。因此,如果您将参考视为隐式指针,则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, ...);
您需要传递指针参考,而不仅仅是指针,以便可以在退回功能内更改简单指向的地址。
这是MSDN的定义。
引用指针的引用可以与 引用对象。宣布指向指针的引用会产生 像普通指针一样使用的可修改值。
让我创建一个简单的插图:
地址|值
[0001]->
[0002]->
[0003]->
[0004]->
......
[nnnn]->
启动程序时,您的可变简单指向null:
[0001]->NULL
[0002]
[0003]
[0004]
......
[nnnn]
当您致电首次拨打电压时,您只是传递了指向的值通过简单变量,仅为null。
[0001]->NULL
当您更改其在退缩功能中的值时,您只是更改该功能的本地副本,而不是实际的指针简单变量。打电话完成后,您的简单变量仍在指向到null。
现在,当您传递参考指针时,您将传递用作指针的简单变量的可修改值。当您更改指针的值时,您还会更改由实际简单变量指向的值。使用指针参考调用退回后,简单变量将现在指向Makenode返回的新实例的地址。
[0001]->newNode
[0002]
[0003]
[0004]
......
[nnnn]
- C++如何通过用户输入删除列表元素
- 访问类lintalizer列表中的结构元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从C++中的对列表中访问特定元素
- 访问动态分配列表中的元素
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 删除列表 c++ 中的最后 3 个元素
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 有什么方法可以将元素添加到列表中,如图所示?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 刷新元素列表视图 QML
- SQLite:通过100K元素列表选择IN
- 解析字符串以创建元素列表
- 向vector添加可变大小元素列表的语法糖
- 是否可以为通用元素列表创建排序