为什么在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;
}

经过几个小时的研究,我设法理解了代码的逻辑(它不是我的,它来自我遵循的课程(。但是,在上述调查中,我无法澄清三个疑问,它们是:

  1. 为什么使用new? 我的意思是,我认为没有必要使用它,为什么要在这种情况下使用它? 以前的代码可以在没有新代码的情况下完成吗?在这种情况下,会怎么样?

  2. 删除操作发生了什么变化? 我知道在 c ++ 中,每次我们使用 new 运算符时,我们都必须将其各自的删除。为什么在这种情况下没有?

  3. 为什么要通过引用传递指针?(函数"agregar_nodo"的第一个参数(

这是最奇怪的,因为我知道在 C 中, 引用是用指针进行的,但C++我们可以做到 使用指针和一元运算符

清楚这一点,我看不出将指针与一元运算符一起传递的意义,因为我知道这是没有必要的。假设仅将其与指针一起使用将作为引用传递(尽管该函数一如既往地复制,作为指针,我们将拥有原始内存地址,即函数外部的内存地址。

那么为什么要同时使用两者呢?

谢谢。

问题的答案:

  1. 如果您不使用new那么您的Nodo对象将存放在哪里?他们必须是堆栈上的本地人或全局变量。如果他们是本地人,那么一旦声明他们的函数退出,他们就会消失。如果它们是全局变量,则无论您声明了多少,您都只能使用一定数量的全局变量。如果你想在每次有人调用agregar_nodo时扩展链表,那么你必须在堆上分配一个新的Nodo,每次都有new

  2. 该程序是一个示例,向您展示如何将元素添加到链表。没有代码可以从链表中删除任何内容,这是使用delete的地方。

  3. 该代码正在将新元素添加到链表的前面。每次它向前面添加新元素时,它都必须更新"列表的开头"或"head"指针以指向新的第一个元素。头部指针(显然(是一个指针,agregar_nodo必须更新它,因此它作为对指针的引用传入。有时程序使用指针到指针代替(因此会Nodo **cima(。

最后一个有点棘手。如果函数以这种方式声明,则没有引用:

void agregar_nodo(Nodo *cima, int n)

然后它仍然会编译,但是,当你运行它时,最后一行cima = nuevo_nodo会更新局部变量cima,而不是main函数中的那个。因此,在您第一次调用该函数后,main中的cima仍然会NULL。因此,该函数改为通过引用接受它,以便该函数可以在main中更新cima

最新更新