1

Tengo esta estructura y esta función, iniciando mi puntero de tipo Nodo en NULL:

struct Nodo{
   int dato;
   Nodo *siguiente;
};

Nodo *tope=NULL;

void agregarNodo(Nodo *tope, int dato){

   Nodo *nuevoNodo = new Nodo();
   nuevoNodo->dato= dato;
   nuevoNodo->siguiente=tope;
   tope=nuevoNodo;

}

Compila, pero no se amarran mis punteros, osea que cuando vuelvo a llamar la funcion para agregar otro nuevo nodo a la pila, el puntero *tope vuelve a valer null o cero en vez de sostener la direccion del nodo que se creo anteriormente.

No deberia pasar esto ya que *tope deberia mantener la direccion de memoria del nodo anterior gracias a este amarre:

nuevoNodo->siguiente=tope;
tope=nuevoNodo;
Trauma
  • 25,297
  • 4
  • 37
  • 60
junner13
  • 109
  • 9
  • 1
    Te sugiero consultar [¿ Cual es la diferencia entre `int *` e `int &` ?](https://es.stackoverflow.com/q/46909/19610). – Trauma May 02 '20 at 08:22

1 Answers1

1

Vamos a ver lo que pasa paso a paso:

Nodo *tope = NULL;

Creas una variable de tipo puntero a Nodo y la inicializas con NULL.

void agregarNodo( Nodo *tope, int dato ) {

Entramos en una función que recibe una copia de un puntero a Nodo y una copia de un int.

  Nodo *nuevoNodo = new Nodo( );
  nuevoNodo->dato = dato;
  nuevoNodo->siguiente=tope;

Haces cositas dentro de la función.

  tope = nuevoNodo;
}

Asignas un valor a la copia que recibiste como argumento en tu función.

La clave aquí es el concepto de copia. No recibes tope, recibes una copia de tope. Por lo que tu variable original se queda exactamente como estaba, == NULL.

Una posible solución es utilizando referencias. Vamos a verlo paso a paso también:

Nodo *tope = NULL;

Creas una variable de tipo puntero a Nodo y la inicializas con NULL.

void agregarNodo( Nodo *&tope, int dato ) {

Entramos en una función que recibe una referencia a un puntero a Nodo y una copia de un int.

  Nodo *nuevoNodo = new Nodo( );
  nuevoNodo->dato = dato;
  nuevoNodo->siguiente=tope;

Haces cositas dentro de la función.

  tope = nuevoNodo;
}

Asignas un valor a la referencia que recibiste como argumento en tu función.

La clave aquí es el concepto de referencia. Ahora, es como si recibieras directamente a tope, por lo que tu variable original si refleja los cambios.

Trauma
  • 25,297
  • 4
  • 37
  • 60