Ver Mensaje Individual
  #24 (permalink)  
Antiguo 30/07/2013, 13:46
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Guia_Listas_Enlazadas - C++

"...Me rindo :( NO´se qué hacer :( :( :( :(..."

Ante todo mucha calma

Te expongo lo que te he comentado tres o cuatro veces: una funcion para solicitar datos y otra para trabajar con la lista, es lo que deberias hacer con las demas funciones que interactuan con la lista (de esta forma puedes testar sin tener que esperar las preguntas de 'otra vez', o lo que sea). Ademas te servirá para cuando quieras mover la aplicacion a entorno grafico :)

Primero declaro una nueva funcion para solicitar el dato del nodo a eliminar:

Código C:
Ver original
  1. void ask_eliminarNodo(Lsec *lsec) {
  2.     int dato;
  3.  
  4.     //solicito dato
  5.     cout << "Entre clave del nodo a eliminar" << endl;
  6.     cin >> dato;
  7.    
  8.     //ejecuto en el manejador
  9.     if(lsec->eliminarNodo(dato)) {
  10.         cout << "Listo!!!" << endl;
  11.     }
  12.     else {
  13.         cout << "No se encontro el nodo " << dato << endl;
  14.     }
  15. }

Observa que esta funcion no forma parte de la clase, se supone que la clase es un manejador de listas, lo de preguntar cosas queda fuera de las aptitudes de la clase. Lo mismo tienes que hacer para la funcion agregar, buscar y las demas que interactuen.

Ahora pongo la funcion de la clase que elimina un nodo (que es la que te interesa):

Código C:
Ver original
  1. bool Lsec::eliminarNodo(int dato) {
  2.     nodo *ptr, *prev, *last;
  3.  
  4.     //setup del iterador
  5.     prev = 0;
  6.     ptr = inicial;
  7.     last = buscarUltimo();
  8.  
  9.     //buscamos colision
  10.     while(ptr) {
  11.         if(ptr->dato == dato) {
  12.             break;
  13.         }
  14.         else if(ptr->dato > dato) {
  15.             prev = ptr = 0;
  16.             return 0;
  17.         }
  18.  
  19.         prev = ptr;
  20.         if((ptr = ptr->sig) == last) {
  21.             prev = ptr = 0;
  22.             break;
  23.         }
  24.     }
  25.  
  26.     //validacion
  27.     if(!prev && !ptr) {
  28.         //operacion fallida
  29.         return 0;
  30.     }
  31.  
  32.     //reasignamos siguiente diferenciando entre primer nodo y siguientes
  33.     if(prev) {
  34.         //estamos en segundo o posterior
  35.         prev->sig = ptr->sig;
  36.     }
  37.     else {
  38.         //estamos en primero
  39.         inicial = ptr->sig;
  40.     }
  41.  
  42.     //liberamos memoria
  43.     delete ptr;
  44.  
  45.     //operacion correcta
  46.     return 1;
  47. }

Y ahora solo te queda cambiar la llamada del main a la nueva funcion:

Código C:
Ver original
  1. Lsec l;
  2. l.agregar();
  3. l.desplegarLista();
  4. ask_eliminarNodo(&l);
  5. ...

Revisa lo que te comenté en el otro post.

Saludos
vosk

p.s. Ahora que me fijo, al ser lista circular tal vez habrá que hacer alguna otra asignacion en la funcion que elimina nodos en el caso que elimine el primero

Última edición por vosk; 30/07/2013 a las 14:45