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

[SOLUCIONADO] eliminar elemento de lista enlazada

Estas en el tema de eliminar elemento de lista enlazada en el foro de C/C++ en Foros del Web. Hola que tal, tengo una tarea de eliminar un elemento de una lista enlazada por cola, pila y por búsqueda y le batalle mucho para ...
  #1 (permalink)  
Antiguo 24/11/2013, 20:29
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
eliminar elemento de lista enlazada

Hola que tal, tengo una tarea de eliminar un elemento de una lista enlazada por cola, pila y por búsqueda y le batalle mucho para hacerlo con cola y pila pero por búsqueda no me sale por mas que lo intente, Aquí les dejo el código haber si me pueden echar la mano. Saludos y gracias de antemano

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Nodo {
  6.     public:
  7.         Nodo();
  8.         void capturar();
  9.         void mostrar();
  10.         void buscar( int );
  11.         void eliminar_cola();
  12.         void eliminar_pila();
  13.         void eliminar_busqueda( int );     
  14.        
  15.     private:
  16.         int num;
  17.         Nodo * inicio;
  18.         Nodo * siguiente;
  19.         Nodo * anterior;
  20.         Nodo * fin;
  21. } n, *z;
  22.  
  23. Nodo::Nodo() {
  24.     inicio = NULL;
  25.     fin = NULL;
  26. }
  27.  
  28. void Nodo::capturar() {
  29.     if( inicio == NULL ) {
  30.         z = new Nodo;
  31.         inicio = z;
  32.         fin = inicio;
  33.        
  34.         cout << "Inserta un numero: "; cin >> z -> num;
  35.        
  36.         z -> siguiente = NULL;
  37.     } else {
  38.         z = new Nodo;
  39.        
  40.         cout << "Inserta un numero: "; cin >> z -> num;
  41.        
  42.         z -> siguiente = NULL;
  43.         fin -> siguiente = z;
  44.         fin = z;
  45.     }
  46. }
  47.  
  48. void Nodo::mostrar() {
  49.     if( inicio == NULL ) {
  50.         cout << "Lista vacia" << endl;
  51.     } else {
  52.         Nodo * aux1 = inicio;
  53.        
  54.         while( aux1 != NULL ) {
  55.             cout << aux1 -> num << endl;
  56.             aux1 = aux1 -> siguiente;
  57.         }
  58.     }
  59. }
  60.  
  61. void Nodo::buscar( int b_num ) {
  62.     Nodo * aux1;
  63.     int contador = 0;
  64.    
  65.     if( inicio == NULL ) {
  66.         cout << "Lista vacia" << endl;
  67.     } else {
  68.         aux1 = inicio;
  69.        
  70.         while( aux1 != NULL ) {
  71.             if( b_num == aux1 -> num ) {
  72.                 contador++;
  73.                
  74.                 if( contador == 1 ) {
  75.                     cout << "Numeros encontrados: " << endl;
  76.                 }
  77.                
  78.                 cout << aux1 -> num << endl;
  79.                 aux1 = aux1 -> siguiente;
  80.             } else {
  81.                 aux1 = aux1 -> siguiente;
  82.             }
  83.         }
  84.     }
  85.    
  86.     if( contador == 0 ) {
  87.         cout << "\nNumero no encontrado" << endl;
  88.     }
  89. }
  90.  
  91. void Nodo::eliminar_cola() {
  92.     Nodo * aux1 = inicio;
  93.    
  94.     if( inicio == NULL ) {
  95.         cout << "Lista vacia" << endl;
  96.     } else {
  97.         if( inicio == fin ) {
  98.             aux1 = NULL;
  99.             inicio = NULL;
  100.             fin = inicio;
  101.             delete aux1;
  102.             cout << "El primer elemento de la lista se ha borrado correctamente" << endl;
  103.             aux1 = NULL;
  104.         } else {
  105.             aux1 = inicio;
  106.             inicio = inicio -> siguiente;
  107.             aux1 -> siguiente = NULL;
  108.             delete aux1;
  109.             cout << "El primer elemento de la lista se ha borrado correctamente" << endl;
  110.             aux1 = NULL;
  111.         }
  112.     }
  113. }
  114.  
  115. void Nodo::eliminar_pila() {
  116.     Nodo * aux1 = inicio;
  117.    
  118.     if( inicio == NULL ) {
  119.         cout << "Lista vacia" << endl;
  120.     } else {
  121.         if( inicio == fin ) {
  122.             aux1 = NULL;
  123.             inicio = NULL;
  124.             fin = inicio;
  125.             delete aux1;
  126.             cout << "El ultimo elemento de la lista se ha borrado correctamente" << endl;
  127.             aux1 = NULL;
  128.         } else {
  129.             anterior = inicio;
  130.             aux1 = inicio -> siguiente;
  131.            
  132.             while( aux1 != fin ) {
  133.                 aux1 = aux1 -> siguiente;
  134.                 anterior = anterior -> siguiente;
  135.             }
  136.            
  137.             fin = anterior;
  138.             delete aux1;
  139.             cout << "El ultimo elemento de la lista se ha borrado correctamente" << endl;
  140.             aux1 = NULL;
  141.             fin -> siguiente = NULL;
  142.         }
  143.     }
  144. }
  145.  
  146. // ESTE ES EL ELIMINAR QUE NO ME SALE
  147. void Nodo::eliminar_busqueda( int b_num ) {
  148.     Nodo * aux1;
  149.     int contador = 0;
  150.    
  151.     if( inicio == NULL ) {
  152.         cout << "Lista vacia" << endl;
  153.     } else {
  154.         aux1 = inicio;
  155.        
  156.         while( aux1 != NULL ) {
  157.             if( b_num == aux1 -> num ) {
  158.                 contador++;
  159.  
  160.                 delete aux1 ;
  161.                 aux1 = aux1 -> siguiente;
  162.             } else {
  163.                 aux1 = aux1 -> siguiente;
  164.             }
  165.         }
  166.     }
  167.    
  168.     if( contador == 0 ) {
  169.         cout << "\nNumero no encontrado" << endl;
  170.     }
  171. }
  172.  
  173. enum MENU_PRINCUPAL { CAPTURAR = 1, MOSTRAR, BUSCAR, ELIMINAR, SALIR };
  174. enum SUBMENU_ELIMINAR { COLA = 1, PILA, BUSQUEDA, REGRESAR };
  175.  
  176. main() {
  177.     int opcion, b_num;
  178.    
  179.     do {
  180.         cout << "1) CAPTURAR" << endl;
  181.         cout << "2) MOSTRAR" << endl;
  182.         cout << "3) BUSCAR" << endl;
  183.         cout << "4) ELIMINAR" << endl;
  184.         cout << "5) SALIR" << endl;
  185.         cout << "\nOPCION: "; cin >> opcion;
  186.        
  187.         switch( opcion ) {
  188.             case CAPTURAR:
  189.                 cout << "\n";
  190.                 n.capturar();
  191.                 cout << "\n";
  192.                 break;
  193.                
  194.             case MOSTRAR:
  195.                 cout << "\n";
  196.                 n.mostrar();
  197.                 cout << "\n";
  198.                 break;
  199.                
  200.             case BUSCAR:
  201.                 cout << "\nBuscar numero: "; cin >> b_num;
  202.                 n.buscar( b_num );
  203.                 cout << "\n";
  204.                 break;
  205.                
  206.             case ELIMINAR:
  207.                 cout << "\n";
  208.                 do {
  209.                     cout << "1) ELIMINAR POR COLA" << endl;
  210.                     cout << "2) ELIMINAR POR PILA" << endl;
  211.                     cout << "3) ELIMINAR POR BUSQUEDA" << endl;
  212.                     cout << "4) REGRESAR" << endl;
  213.                     cout << "\nOPCION: "; cin >> opcion;
  214.                    
  215.                     switch( opcion ) {
  216.                         case COLA:
  217.                             cout << "\n";
  218.                             n.eliminar_cola();
  219.                             cout << "\n";
  220.                             break;
  221.                            
  222.                         case PILA:
  223.                             cout << "\n";
  224.                             n.eliminar_pila();
  225.                             cout << "\n";
  226.                             break;
  227.                            
  228.                         case BUSQUEDA:
  229.                             cout << "\nNumero a eliminar: "; cin >> b_num;
  230.                             n.eliminar_busqueda( b_num );
  231.                             cout << "\n";
  232.                             break;
  233.                            
  234.                         default:
  235.                             opcion = REGRESAR;
  236.                     }
  237.                 } while( opcion != REGRESAR );
  238.                 cout << "\n";
  239.                 break;
  240.                
  241.             default:
  242.                 opcion = SALIR;
  243.         }
  244.     } while( opcion != SALIR );
  245.    
  246.     return 0;
  247. }
  #2 (permalink)  
Antiguo 29/11/2013, 09:22
Avatar de elafrikano  
Fecha de Ingreso: noviembre-2013
Ubicación: Carúpano, Estado Sucre.
Mensajes: 9
Antigüedad: 11 años
Puntos: 2
Respuesta: eliminar elemento de lista enlazada

Te explico: No te sale porque cuando encuentras el elemento que es igual al numero que buscas lo borras de una vez y cuando haces aux1=aux1->siguiente te debe dar un error porque el puntero apunta a la nada o no existe, no se como trabaja c++ porque soy mas diestro en c pero creo que ya la el puntero ni debe exisitir y si existe no contiene nada. En ese caso distindo a eliminar en forma de pilas o colas debes declarar 2 punteros uno que sea igual a incio y otro que valla atras de el para que cuando lo encuentres el numero que buscas hagas el enlace antes de borrar y la lista enlazada no quede desenlazada xD Saludos y espero haberte ayudado. Si tengo algun error de sintaxis disculpa como te dije nunca he trabajado con c++ solo con C.

Código C++:
Ver original
  1. void Nodo::eliminar_busqueda( int b_num ) {
  2.     Nodo * aux1, *aux2;
  3.     int contador = 0;
  4.    
  5.     if( inicio == NULL ) {
  6.         cout << "Lista vacia" << endl;
  7.     } else {
  8.         aux1 = inicio;
  9.        
  10.         while( aux1 != NULL ) {
  11.             if( b_num == aux1 -> num ) {
  12.                 contador++;
  13.  
  14.                 if(aux1 == inicio){
  15.  
  16.                       inicio = aux->siguiente;
  17.                       delete aux1;
  18.                 }
  19.                  else if(aux1  == ultimo){
  20.  
  21.                       ultimo = aux2;
  22.                       delete aux1;
  23.                  }
  24.                  else{
  25.                  
  26.                       aux2->siguiente = aux1->siguiente;
  27.                       delete aux1;
  28.                  }
  29.  
  30.             } else {
  31.                 aux2 = aux1;
  32.                 aux1 = aux1 -> siguiente;
  33.             }
  34.         }
  35.     }
  36.    
  37.     if( contador == 0 ) {
  38.         cout << "\nNumero no encontrado" << endl;
  39.     }
  40. }
  #3 (permalink)  
Antiguo 29/11/2013, 12:27
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: eliminar elemento de lista enlazada

Cita:
Iniciado por elafrikano Ver Mensaje
Te explico: No te sale porque cuando encuentras el elemento que es igual al numero que buscas lo borras de una vez y cuando haces aux1=aux1->siguiente te debe dar un error porque el puntero apunta a la nada o no existe, no se como trabaja c++ porque soy mas diestro en c pero creo que ya la el puntero ni debe exisitir y si existe no contiene nada. En ese caso distindo a eliminar en forma de pilas o colas debes declarar 2 punteros uno que sea igual a incio y otro que valla atras de el para que cuando lo encuentres el numero que buscas hagas el enlace antes de borrar y la lista enlazada no quede desenlazada xD Saludos y espero haberte ayudado. Si tengo algun error de sintaxis disculpa como te dije nunca he trabajado con c++ solo con C.

Código C++:
Ver original
  1. void Nodo::eliminar_busqueda( int b_num ) {
  2.     Nodo * aux1, *aux2;
  3.     int contador = 0;
  4.    
  5.     if( inicio == NULL ) {
  6.         cout << "Lista vacia" << endl;
  7.     } else {
  8.         aux1 = inicio;
  9.        
  10.         while( aux1 != NULL ) {
  11.             if( b_num == aux1 -> num ) {
  12.                 contador++;
  13.  
  14.                 if(aux1 == inicio){
  15.  
  16.                       inicio = aux->siguiente;
  17.                       delete aux1;
  18.                 }
  19.                  else if(aux1  == ultimo){
  20.  
  21.                       ultimo = aux2;
  22.                       delete aux1;
  23.                  }
  24.                  else{
  25.                  
  26.                       aux2->siguiente = aux1->siguiente;
  27.                       delete aux1;
  28.                  }
  29.  
  30.             } else {
  31.                 aux2 = aux1;
  32.                 aux1 = aux1 -> siguiente;
  33.             }
  34.         }
  35.     }
  36.    
  37.     if( contador == 0 ) {
  38.         cout << "\nNumero no encontrado" << endl;
  39.     }
  40. }
Muchas gracias me sirvió bastante. Saludos
  #4 (permalink)  
Antiguo 29/11/2013, 12:53
Avatar de elafrikano  
Fecha de Ingreso: noviembre-2013
Ubicación: Carúpano, Estado Sucre.
Mensajes: 9
Antigüedad: 11 años
Puntos: 2
Respuesta: eliminar elemento de lista enlazada

Me alegra haberte ayudado, saludos!

Etiquetas: elemento, enlazada, int, lista, numero
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 09:24.