Bienvenido al foro.
[modo_profesor=on]
En la función
Insertar, la asignación:
Código C:
Ver originalif(ListaVacia(*lista) ) {
nuevo->siguiente = *lista;
Es rara, ya que
*lista es
NULL, estas obviedades es mejor indicarlas de forma explícita, ya que el código será más fácil de leer... no tendrás que deducir el valor de
*lista aunque este sea obvio:
En cualquier caso, este problema se puede evitar si a la hora de reservar memoria para el nuevo nodo llamas a
calloc en vez de a
malloc. La diferencia entre ambas funciones es que
calloc pone a 0 todos los bytes de la memoria reservada, por lo que cualquier puntero que se encuentre en la estructura recién creada apuntará automáticamente a
NULL.
Seguimos en
InsertarLista
Código C:
Ver originalwhile(anterior->siguiente)
anterior = anterior->siguiente;
nuevo->siguiente = anterior->siguiente;
anterior->siguiente = nuevo;
Según este código, el while se repetirá hasta que
anterior->siguiente es
NULL, cierto? no te parece entonces que a esta línea:
Código C:
Ver originalnuevo->siguiente = anterior->siguiente;
Le pasa lo mismo que hemos comentado hace un momento?
Las líneas de código que no son necesarias es mejor eliminarlas cuanto antes.
Nota: Por cierto, estaría genial que comprobases que las reservas de memoria se hacen correctamente. Esto lo puedes conseguir comprobando que el puntero ha dejado de apuntar a NULL después de llamar a
malloc.
No corras que aún no hemos terminado con esta función, queda una cosa más y es la más importante: Si se supone que la lista tiene que ser ordenada... por qué añades los nuevos nodos SIEMPRE al final? No deberías tener en cuenta también el valor de cada nodo? Para esta parte no te pongo código, es bastante importante que lo medites primero y saques tus propias conclusiones.
Pasamos a
Borrar
Código C:
Ver originalif(!nodo || nodo->valor != v) return;
else {
if(!anterior)
*lista = nodo->siguiente;
else
anterior->siguiente = nodo->siguiente;
}
Un detalle sobre legibilidad... ese if es un poco raro... si inviertes la condición te puedes ahorrar el return y consigues un código más fácil de leer:
Código C:
Ver originalif(nodo && nodo->valor == v)
{
if(!anterior)
*lista = nodo->siguiente;
else
anterior->siguiente = nodo->siguiente;
}
Vale, ahora retrocedamos al main...
Código C:
Ver originalcase 3: printf("Que Lista Desea Mostrar?\n"); // printf("Lista 1\n");
// printf("Lista 2\n");
// printf("Lista 3\n");
switch(opc)
{
}
break;
No ves nada raro ahí? Estás almacenando la opción del usuario en
v y, sin embargo estás mostrando una lista basándote en
opc
Y para terminar... añade por favor una opción para salir del programa... y no te olvides en este caso borrar todas las listas!!!! Es bueno acostumbrarse a no dejar fugas de memoria en nuestros programas.
Un saludo