"...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 originalvoid ask_eliminarNodo(Lsec *lsec) {
int dato;
//solicito dato
cout << "Entre clave del nodo a eliminar" << endl;
cin >> dato;
//ejecuto en el manejador
if(lsec->eliminarNodo(dato)) {
cout << "Listo!!!" << endl;
}
else {
cout << "No se encontro el nodo " << dato << endl;
}
}
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 originalbool Lsec::eliminarNodo(int dato) {
nodo *ptr, *prev, *last;
//setup del iterador
prev = 0;
ptr = inicial;
last = buscarUltimo();
//buscamos colision
while(ptr) {
if(ptr->dato == dato) {
break;
}
else if(ptr->dato > dato) {
prev = ptr = 0;
return 0;
}
prev = ptr;
if((ptr = ptr->sig) == last) {
prev = ptr = 0;
break;
}
}
//validacion
if(!prev && !ptr) {
//operacion fallida
return 0;
}
//reasignamos siguiente diferenciando entre primer nodo y siguientes
if(prev) {
//estamos en segundo o posterior
prev->sig = ptr->sig;
}
else {
//estamos en primero
inicial = ptr->sig;
}
//liberamos memoria
delete ptr;
//operacion correcta
return 1;
}
Y ahora solo te queda cambiar la llamada del main a la nueva funcion:
Código C:
Ver originalLsec l;
l.agregar();
l.desplegarLista();
ask_eliminarNodo(&l);
...
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