Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/10/2015, 03:26
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Menu para listas enlazadas simples

Bienvenido al foro.

[modo_profesor=on]

En la función Insertar, la asignación:

Código C:
Ver original
  1. if(ListaVacia(*lista) ) {
  2.   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:

Código C:
Ver original
  1. nuevo->siguiente = NULL;

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 original
  1. while(anterior->siguiente)
  2.       anterior = anterior->siguiente;
  3.    
  4.     nuevo->siguiente = anterior->siguiente;
  5.     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 original
  1. nuevo->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 original
  1. if(!nodo || nodo->valor != v) return;
  2.   else {
  3.     if(!anterior)
  4.       *lista = nodo->siguiente;
  5.     else
  6.       anterior->siguiente = nodo->siguiente;
  7.     free(nodo);
  8.   }

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 original
  1. if(nodo && nodo->valor == v)
  2.   {
  3.     if(!anterior)
  4.       *lista = nodo->siguiente;
  5.     else
  6.       anterior->siguiente = nodo->siguiente;
  7.     free(nodo);
  8.   }

Vale, ahora retrocedamos al main...

Código C:
Ver original
  1. case 3: printf("Que Lista Desea Mostrar?\n");
  2.         // printf("Lista 1\n");
  3.         // printf("Lista 2\n");
  4.         // printf("Lista 3\n");
  5.         scanf("%d",&v);
  6.         switch(opc)
  7.         {
  8.         }
  9.         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