首页 > 解决方案 > 为什么在 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. 为什么要用新的?我的意思是,我认为没有必要使用它,为什么在这种情况下使用它?没有新的代码可以完成以前的代码吗?那样的话,会怎么样?

  2. 删除是怎么回事?我理解在c++中,每次我们使用new操作符时,我们都必须再把它各自的delete。为什么在这种情况下没有?

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

这是最令人好奇的,因为我知道在 C 中,引用是使用指针进行的,但在 C++ 中,我们可以使用指针和一元运算符来完成。

清楚地知道,我没有看到将指针与一元运算符一起传递的意义,因为我知道这不是必需的。假设仅将 this 与指针一起使用将作为引用传递(尽管函数像往常一样制作副本,作为指针,我们将拥有原始内存地址,即函数外部的地址。 )

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

非常感谢。

标签: c++

解决方案


问题解答:

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

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

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

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

void agregar_nodo(Nodo *cima, int n)

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


推荐阅读