c++ - 为什么在 C++ 中使用链表来完成?(像堆栈一样处理它们)
问题描述
我有以下代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Nodo{
int valor;
Nodo *siguiente;
};
// Lista enlazada "simple", manipulandola con el metodo LIFO (pila).
void agregar_nodo(Nodo *&cima, int n); // ¿Puntero por referencia?
int main(){
Nodo *cima = NULL;
agregar_nodo(cima, 2);
agregar_nodo(cima, 4);
return 0;
}
void agregar_nodo(Nodo *&cima, int n){
Nodo *nuevo_nodo = new Nodo(); // (struct Nodo) | Nodo() Se puede usar cualquier sintaxis
nuevo_nodo->valor = n;
nuevo_nodo->siguiente = cima;
cima = nuevo_nodo;
}
经过数小时的研究,我设法理解了代码的逻辑(这不是我的,它来自我遵循的课程)。但是,在上述调查过程中,我无法清除三个疑问,它们是:
为什么要用新的?我的意思是,我认为没有必要使用它,为什么在这种情况下使用它?没有新的代码可以完成以前的代码吗?那样的话,会怎么样?
删除是怎么回事?我理解在c++中,每次我们使用new操作符时,我们都必须再把它各自的delete。为什么在这种情况下没有?
为什么要通过引用传递指针?(函数“agregar_nodo”的第一个参数)
这是最令人好奇的,因为我知道在 C 中,引用是使用指针进行的,但在 C++ 中,我们可以使用指针和一元运算符来完成。
清楚地知道,我没有看到将指针与一元运算符一起传递的意义,因为我知道这不是必需的。假设仅将 this 与指针一起使用将作为引用传递(尽管函数像往常一样制作副本,作为指针,我们将拥有原始内存地址,即函数外部的地址。 )
那么为什么要同时使用这两者呢?
非常感谢。
解决方案
问题解答:
如果你不使用
new
,那么你的Nodo
对象会住在哪里?他们必须是堆栈上的本地人或全局人。如果他们是本地人,那么一旦声明他们的函数退出,他们就会消失。如果它们是全局变量,那么您将只能使用一定数量的它们,无论您声明了多少。如果您想在每次有人调用时扩展链表,那么您必须每次都在堆上agregar_nodo
分配一个新的。Nodo
new
该程序是一个示例,向您展示如何将元素添加到链表。没有代码可以从链接列表中删除
delete
任何内容,这是将使用的地方。该代码将新元素添加到链表的前面。每次它向前面添加一个新元素时,它都必须更新“列表的开头”或“头”指针以指向新的第一个元素。头指针(显然)是一个指针,并且
agregar_nodo
必须更新它,因此它作为对指针的引用传入。有时程序使用指向指针的指针来代替(所以它会是Nodo **cima
)。
最后一个有点棘手。如果函数以这种方式声明,没有引用:
void agregar_nodo(Nodo *cima, int n)
那么它仍然会编译,但是,当你运行它时,最后一行cima = nuevo_nodo
会更新局部变量cima
,而不是main
函数中的那个。所以在你第一次调用函数之后,cima
inmain
仍然是NULL
. 因此,该函数改为通过引用接受它,因此该函数可以cima
在main
.
推荐阅读
- kubernetes - 如何在没有 helm init 的情况下在我的 CI 上创建 helm 包?或访问集群
- c# - Wpf DataGrid:如何检测可见单元格集?
- excel - 如何使用 vba 代码复制所有可见单元格?
- php - Vue js模板标签未呈现(它在屏幕上显示为空白)
- android - TextView 中的 XML 代码制作学习应用程序
- javascript - 为什么我的基于视口的脚本不添加类
- vba - 如何重命名附件并将其保存在 Outlook 中?
- javascript - 在依赖项的导入语句上开玩笑错误 (Lodash)
- algorithm - 公交路线算法
- reactjs - React:如何将固定 URL 设置为 pdf 文件?