2

Tengo el siguiente algoritmo:

#include <iostream>
using namespace std;


class node{
    public:
        int info;
        node *next;
};

node *p, *q;
int *e, i, **f;

int main(){
    p = new node;
    e = new int;

    *e = 0;
    f = &e;

    (*p).next = new node;
    q = &(*p);

    p = (*p).next;

    return 0; }

No entiendo que sucede al realizar (*p).next = new node, no se si ahora lo apuntado por p, ahora apunta a un nuevo nodo. Y cuando hace p = (*p).next en realidad le asigna a la variable new node.

Víctor Álvarez
  • 2,593
  • 4
  • 18
  • 41

1 Answers1

3

Las siguientes dos líneas son equivalentes:

(*p).next = new node;
p->next = new node;

y lo único que hacen es crear un nuevo nodo y apuntar su dirección de memoria en p->next. Es decir, esta línea no modifica p, que sigue apuntando al mismo nodo que antes de ejecutar esta instrucción.

En cambio, esta otra línea:

p = (*p).next;

Sí que modifica p. En este caso hace que p apunte al nodo apuntado por p->next. Dicho en cristiano, el puntero avanza una posición en la lista.

Antes de ejecutar esa línea:

nodo0 -> nodo1 -> nodo2 -> nodo3
^        ^
p        p->next

Después de ejecutar esa instrucción:

nodo0 -> nodo1 -> nodo2 -> nodo3
         ^        ^
         p        p->next

Date cuenta que al avanzar en la lista es irrelevante si el nodo ha sido creado con new o no. Lo único importante en este punto es cómo te mueves a lo largo de una lista enlazada.

DevMind
  • 5,025
  • 11
  • 29
  • 60
eferion
  • 49,291
  • 5
  • 30
  • 72