Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[C++] Problema con función para borrar ultimo nodo de una lista enlazada

Estas en el tema de [C++] Problema con función para borrar ultimo nodo de una lista enlazada en el foro de C/C++ en Foros del Web. Buenas, mi problema es el siguiente: he hecho una función, para borrar el ultimo elemento de una lista enlazada, tal como dice el título del ...
  #1 (permalink)  
Antiguo 02/04/2011, 12:13
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
[C++] Problema con función para borrar ultimo nodo de una lista enlazada

Buenas, mi problema es el siguiente: he hecho una función, para borrar el ultimo elemento de una lista enlazada, tal como dice el título del post. A esta función se le pasa la dirección de memoria del nodo raiz, y a partir de ahi buscaríamos el ultimo nodo de la lista para borrarlo y poner el penultimo apuntando a NULL.

Estoy haciendo algo mal, porque al ejecutar el programa, muestro por pantalla la lista, y lo que me muestra, creo entender, es una dirección de memoria.

Aqui os pongo la función para borrar el ultimo nodo, he repasado todo de arriba a abajo y no se que es lo que hago mal, si necesitais que ponga el programa entero lo pongo sin problemas.

Código C++:
Ver original
  1. void eliminaUltimo(nodo **r){
  2.    
  3.     nodo *ulti = *r;
  4.     nodo *penulti = *r;
  5.    
  6.    
  7.     if(*r!=NULL){
  8.        
  9.         if(ulti->siguiente = NULL){
  10.            
  11.             *r = NULL;
  12.             delete ulti;
  13.        
  14.         }else{
  15.            
  16.             while(ulti->siguiente != NULL){
  17.                 ulti = ulti->siguiente;
  18.                 penulti -> siguiente = ulti;
  19.             }
  20.            
  21.             penulti->siguiente = NULL;
  22.             delete ulti;
  23.         }
  24.     }
  25.    
  26. }

Un saludo y gracias.
  #2 (permalink)  
Antiguo 02/04/2011, 14:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

Código C:
Ver original
  1. ulti = ulti->siguiente;
  2.  penulti -> siguiente = ulti;
Estas dos intrucciondes deberian ir al revez. porque actualizas el ultimo y despues se lo asinas al penultimo osea los dos apuntan a lo mismo...deberia ir asi:

Código C:
Ver original
  1. penulti -> siguiente = ulti;
  2.  ulti = ulti->siguiente;

Sobre lo que muetra si es una diccion de memoria o no podrias mostrar mas parte de tu codigo y la salida que produce tu programa.
  #3 (permalink)  
Antiguo 02/04/2011, 15:03
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

He cambiado eso que dices, pero sigue saliendo mal, voy a poner todo el programa, gracias por tu ayuda sam90:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. struct nodo{
  7.     int num;
  8.     nodo *siguiente;
  9. };
  10.  
  11. void inserta(nodo **r, int n);
  12. void muestra(nodo *r);
  13. void eliminaUltimo(nodo **r);
  14.  
  15. int main(){
  16.    
  17.     nodo *raiz = NULL;
  18.    
  19.     inserta(&raiz, 1);
  20.     inserta(&raiz, 3);
  21.     inserta(&raiz, 5);
  22.    
  23.     cout << endl << endl << "Lista original:" << endl;
  24.     muestra(raiz);
  25.    
  26.     eliminaUltimo(&raiz);
  27.     eliminaUltimo(&raiz);
  28.    
  29.     cout << endl << endl << "Lista con dos elementos borrados:" << endl;
  30.     muestra(raiz);
  31.    
  32.     eliminaUltimo(&raiz);
  33.    
  34.     cout << endl << endl << "Lista vacia:" << endl;
  35.     muestra(raiz);
  36.    
  37.     cout << endl << endl;
  38.     system("PAUSE");
  39. }
  40.  
  41. void inserta(nodo **r, int n){
  42.    
  43.     nodo *nuevo, *ultimo;
  44.    
  45.     nuevo=new nodo;
  46.     nuevo->num = n;
  47.     // Buscamos el último nodo
  48.     if(*r == NULL){
  49.         nuevo->siguiente = NULL;
  50.         *r = nuevo;
  51.     }else {
  52.         ultimo = *r;
  53.         while(ultimo->siguiente != NULL){
  54.             ultimo = ultimo->siguiente;
  55.         }
  56.         nuevo->siguiente = NULL;
  57.         ultimo->siguiente = nuevo;
  58.     }
  59.    
  60. }
  61.  
  62. void muestra(nodo *r){
  63.    
  64.     while(r!= NULL){
  65.        
  66.         cout << endl;
  67.         cout << r->num;
  68.         r=r->siguiente;
  69.     }
  70. }
  71.  
  72. void eliminaUltimo(nodo **r){
  73.    
  74.     nodo *ulti;
  75.     ulti = *r;
  76.     nodo *penulti;
  77.     penulti = *r;
  78.    
  79.    
  80.     if(*r!=NULL){
  81.        
  82.         if(ulti->siguiente = NULL){
  83.            
  84.             *r = NULL;
  85.             delete ulti;
  86.        
  87.         }else{
  88.            
  89.             while(ulti->siguiente != NULL){
  90.                 penulti -> siguiente = ulti;
  91.                 ulti = ulti->siguiente;
  92.             }
  93.            
  94.             penulti->siguiente = NULL;
  95.             delete ulti;
  96.         }
  97.     }
  98.    
  99. }

Salida:

Código consola:
Ver original
  1. Lista original:
  2.  
  3. 1
  4. 3
  5. 5
  6.  
  7. Lista con dos elementos borrados:
  8.  
  9. 11145392
  10.  
  11. Lista vacia:
  12.  
  13. 11145392
  14.  
  15. Presione una tecla para continuar . . .
  #4 (permalink)  
Antiguo 02/04/2011, 15:19
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

Yo cambiaria esas dos lineas por estas dos:
Código C:
Ver original
  1. penulti  = ulti;
  2. ulti = ulti->siguiente;

Perdona que antes no habia terminado de interpretar bien todo.
  #5 (permalink)  
Antiguo 02/04/2011, 15:29
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

Lo que está dentro del while dices no??

Lo he cambiado, pero me sigue el mismo problema...

Thank ;)
  #6 (permalink)  
Antiguo 02/04/2011, 17:23
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

No puede ser que sea la comparacion con el if que lo que haces es una saignacion, entonces siempre va a ser cierto
Código C++:
Ver original
  1. if(ulti->siguiente = NULL){
  2.            
  3.             *r = NULL;
  4.             delete ulti;

Código C++:
Ver original
  1. if(ulti->siguiente == NULL){
  2.            
  3.             *r = NULL;
  4.             delete ulti;
  #7 (permalink)  
Antiguo 02/04/2011, 17:26
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: [C++] Problema con función para borrar ultimo nodo de una lista enlazada

Diooos Poi!!

Ciertamente cierto... vaya cabeza la mia, sabia que iba a estar en algun fallo de ese tipo, que no ves aunque lo revises 500 veces. Con lo que me he comido el coco...

Muchas gracias, en serio.

Un saludo.

Etiquetas: c++, enlazada, lista, nodo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:11.