2012-07-20 17 views
5

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

+1

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? –

+0

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

Respuesta

5

remove implementación no corre ct. Supongamos que la lista tiene un elemento. En este caso, la temperatura indicará "memoria no existente" después de ejecutar delete *root; Sin embargo, lo que está haciendo es *root = temp; , de esta manera hará que la raíz apunte al nodo no válido. Y esto hace que el comportamiento extraño después La forma posible para que su aplicación correcta es:

void remove(node** root) 
{ 
    //TODO: your code here 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     if(previous) 
     { 
      *root = temp; 
      previous->next = 0; 
     } 
     else { 
      *root = NULL; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

Pero no he decidido aconsejarle para recorrer la lista con el puntero de la raíz .Define algunos iterador y busque el extremo con en lugar de cambiar * raíz

+0

que parece haber sido el problema, ¡muchas gracias por tu consejo! – kamstack

Cuestiones relacionadas