Ver Mensaje Individual
  #13 (permalink)  
Antiguo 21/04/2013, 13:43
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Error con clase de listas enlazadas.

Código:
ptr->siguiente = p;
Esto hace que el ultimo nodo apunte a su anterior (no hay nada de malo solo que no lo habia visto nunca) y que necesites el contador numnodos para recorrer la lista sin llegar a un bucle infinito.

Código:
p=ptr;
Haciendo esto la lista siempre te queda inicializada al ultimo nodo creado, que segun lo de antes lleva un puntero a su nodo anterior:

Código:
Lista p = nulo;

Creas nuevo_nodo, indice 0, valor 0, siguiente = p = nulo
Asignas nuevo_nodo a p

Creas nuevo_nodo, indice 1, valor 0, siguiente = p = nodo_anterior
Asignas nuevo_nodo a p

Creas nuevo_nodo, indice 2, valor 0, siguiente = p = nodo_anterior
Asignas nuevo_nodo a p

Ahora 'p' apunta al ultimo nodo de indice 2

Nodo2 -> Nodo1 -> Nodo0 -> nulo
Ten en cuenta que estas creando la lista del revés, es decir que los punteros 'siguiente' no apuntan al nodo siguiente sino al anterior.

La reserva de memoria que colgué asigna a la lista el primer nodo, y para cada nodo un puntero a los siguientes excepto el ultimo que apunta a nulo, con lo que puedes recorrer la lista sin el contador externo.

Cuando en el destructor haces 'delete p' lo unico que haces es liberar el nodo al que apunta 'p', que tal como tienes el constructor es el ultimo, pero los demas nodos no se liberan. Por eso tienes que recorrer la lista y liberar cada nodo.

"...Es que cuando tenia el destructor delete p, me funcionaba, pero puse el tuyo y ahora me da error..."

El destructor que colgué funciona cuando el primer nodo de la lista es realmente el primero, tal como lo deja la funcion de reserva pero que no es tal como lo deja tu constructor. Ese bucle de liberado de memoria se basa en recorrer la lista hasta que finaliza sin tener en cuenta el contador externo.

Saludos
vosk