Me encuentro con un error extraño en algunas tareas que me tiene haciendo una pila con una lista vinculada. Todas las funciones de mi programa funcionan perfectamente, incluso al principio cuando no tengo nodos, o después de eliminar algunos. Pero cuando hago nodos y los borro todos, así que regreso a cero, entonces cada función causa un bloqueo. Intenté investigar el problema, pero las soluciones que he encontrado parecen casi idénticas a las que ya tengo, así que obviamente hay algo crítico que no veo.Mi función de eliminación de nodos de lista enlazada hace que otras partes de mi programa se cuelguen
Ésta es la función de eliminación de nodo (el que yo sospecho que es el culpable de todo esto)
void remove(node** root)
{
node* temp = *root;
node* previous = 0;
if(*root)
{
while((*root)->next)
{
previous = *root;
*root = (*root)->next;
}
delete *root;
*root = temp;
if(previous)
{
previous->next = 0;
}
}
else
{
std::cout<<"cannot delete items from empty list\n";
}
}
Aquí está la función de nodo de inserción
void insert(node** root)
{
node* temp = *root;
if(*root)
{
while((*root)->next)
{
(*root) = (*root)->next;
}
(*root)->next = new node;
(*root)->next->data = getnum();
(*root)->next->next = 0;
*root = temp;
}
else
{
(*root) = new node;
(*root)->data = getnum();
(*root)->next = 0;
}
}
Estoy bastante seguro de que el problema es en algún lugar del código que he vinculado, pero por si acaso no es así, aquí hay un pastebin para la asignación completa http://pastebin.com/AWtG4qjD
No veo nada mal. ¿Qué hace cuando lo ejecutas bajo Valgrind? Problemas de estilo: no use '* root' como variable de iteración, es confuso. Especialmente no hagas eso cuando necesites restablecerlo al valor original después de tu iteración. Y ** especialmente ** no llame a ese valor original "temp" (no es algo temporal, ¡es la lista real que se está modificando!). Además: ¿por qué estás iterando hasta el final de la casilla para insertar o eliminar al final? ¿Por qué no almacenar la lista en el orden opuesto y operar directamente en la cabeza en tiempo constante? –
es parte de una tarea. Lo que sugirió suena como una mejor manera de hacer las cosas, pero ya que esta es mi primera asignación de listas enlazadas, sospecho que me piden que lo haga de una manera deliberadamente complicada para ayudarme a aprenderlo mejor. En realidad, soy un programador bastante nuevo, así que no he descubierto realmente cómo hacer un código limpio y prolijo, por lo que el consejo de estilo es muy apreciado. En la misma nota, en realidad no sé lo que es Valgrind, pero estoy buscando en Google y parece interesante – kamstack