Ejercicio 1 removeAll

Ejercicio 1 removeAll

de Luciano Umpierrez Garcia -
Número de respuestas: 8

Buenas, me maree un poco en este ejercicio y no se si lo que hice esta mal o si voy bien encaminado por lo menos, ¿esta mal este código?.

lista removeAll(int x, lista l){

  lista borrar = l

  if(l == NULL){

    return l;

  }else if(l->elem == x){

    l = l->sig;

    delete borrar

    return l

  }

  else {

    lista aux = l;

    while(l->sig != NULL && l->sig->elem != x){

      l = l->sig;

    }

    borrar = l->sig;

    l->sig = l->sig->sig;

    delete borrar;

    return aux

  }

}

En respuesta a Luciano Umpierrez Garcia

Re: Ejercicio 1 removeAll

de Gaston Notte -
Hola Luciano,
El razonamiento lógico está bastante bien, pero tienes algunos errores.
Para empezar ese código no compila. Nota que te faltan algunos ";".
Por otro lado, tu solución solamente elimina la primera aparición de "x". Si en la lista aparece más de una vez el elemento "x", solamente borra el primero.
Ejemplo cuando la lista contiene los siguientes elementos 10->10->15->20-> Ejemplo cuando la lista contiene los siguientes elementos 10->15->15->20-> Saludos
En respuesta a Gaston Notte

Re: Ejercicio 1 removeAll

de Luciano Umpierrez Garcia -
Gracias por la ayuda. Ahora podría estar un poco mejor el código?.

lista removeAll(int x, lista l){
    lista borrar = l;
    if(l==NULL){
        return l;
    }
    else (l->elem == x){
        l = l->sig;
        delete borrar;
    }
    lista aux = l;
    while(l != NULL){
        if(l->sig != NULL && l->sig->elem = x){
            borrar = l->sig;
            l->sig = l->sig->sig;
           delete borrar;
        }
        l = l->sig
    }
    return aux
}
En respuesta a Luciano Umpierrez Garcia

Re: Ejercicio 1 removeAll

de Federico Andrade -
Hola Luciano,
Mejoró con respecto al anterior.
De todas formas veo que vos separas el caso cuando x es el primer elemento. Sin embargo, en caso de que x sea el primer elemento, y lo eliminás, el elemento que le seguìa a x, que tambièn podría ser x queda sin ser analizado. Me parece que es porque como decía gastón, quedaste con la idea de que hay que buscar uno solo. Entonces, no separaría casos, sino que unificaría ese caso en que borrars el primero con el caso general.
El while me parece bien teniendo en cuenta que se saltea el primer elemento.
Lo otro que te quería comentar es que te recomiendo que los programas los programes y los ejecutes. Te podrías hacer una función auxiliar que imprima una lista, así podés ver cómo quedó la lista antes y como quedó depués de tu función. Te recomiendo probar algunos ejemplos del caso genérico y otros de los casos bordes. Estas cosas te ayudan mucho a agarrar práctica con en lenguaje y a vos mismo podés mejorar y entender tu cóidgo.
Saludos
En respuesta a Federico Andrade

Re: Ejercicio 1 removeAll

de Gonzalo Maulella Mederos -
Hola, buenas tardes, yo hice así el removeAll por si sirve de ayuda, en el primer while saco todos los primeros x's que pueda haber y luego cuando el primero ya no sea igual a x paso al if, que si todavía queda algún elemento en la lista, verifique en todos los espacios si alguno es o no es igual que x.

En respuesta a Gonzalo Maulella Mederos

Re: Ejercicio 1 removeAll

de Federico Andrade -

Hola Gonzalo,
El código parece funcionar, pero tiene algunos errores. El más grave es que pedís memoria (new nodo) a pesar de que este ejercicio no requiere memoria adicional. Supongo que fue un error distracción, porque luego el puntero siguiente lo usas bien.
El otro comentario es que está un poco confuso el código, sobretodo con el uso de la variable booleana, la cual no es necesaria.
Saludos

En respuesta a Federico Andrade

Re: Ejercicio 1 removeAll

de Dario Luz Mendez -

Aprovecho esta instancia para dejar mi código por si requiere mejoras o le falta algo, quizás ayude.

remove

Muchas gracias,

Saludos.

En respuesta a Dario Luz Mendez

Re: Ejercicio 1 removeAll

de Federico Andrade -
Hola Darío,
No me quedó claro si estás haciendo una consulta o lo pusiste para compartirlo con el compañero. En general lo bueno es que hagas algún planteo de duda, o algo que no te está funcionando y no entendés por qué.
Sobre el código, la lógica general está bien. Tenés un problema de casos borde, por ejemplo si la lista tiene un solo elemento cargado con el valor x, ese se va a eliminar y cuando en el segundo while quieras acceder a aux-sig va a dar error dado que aux va a ser null. Además, el último aux = anterior-> sig no es correcto, porque te estás moviendo a un nodo que no sabés si es o no null, y luego vas a consultar por su siguiente.
Resumiendo, la lógica está bien, tenés que ajustar esos casos bordes que te comenté.
Te recomiendo correrlo en papel un par de veces y luego en la pc probando varias posibilidades.
Saludos.
En respuesta a Federico Andrade

Re: Ejercicio 1 removeAll

de Dario Luz Mendez -
Muchas gracias Federico, ya cubrí ese caso, vuelvo a revisarlo. Otra consulta aprovechando, la parte 1B hace mención de operaciones totales y parciales, que no recuerdo haberlo visto, ¿eso se menciona en el teórico?