Ver Mensaje Individual
  #7 (permalink)  
Antiguo 20/05/2010, 04:19
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: crear una lista enlazada

En el modulo borrar_nodo que publiqué además de pedir el nombre a borrar también pido el teléfono a borrar de un nodo en concreto, lo he hecho así:

Código C:
Ver original
  1. void borrar_nodo(struct nodo_lista **lista){
  2.     /* Para borrar un nodo, tendremos que guardar un puntero al nodo anterior
  3.        del que nos encontramos, ya que este puntero pasará a apuntar al nodo
  4.        apuntado por el que vamos a borrar */
  5.     struct nodo_lista *nodo_aux, *nodo_anterior;
  6.     char nombre[T_NOM];
  7.     char telefono[T_TEL];
  8.     int encontrado = 0;
  9.  
  10.     printf("Nombre a borrar: ");
  11.     LEE_CAD(nombre,T_NOM);
  12.  
  13.     nodo_aux = *lista;
  14.     /* Comprueba si el elemento a borrar es el primero de la lista */
  15.     if(strcmp(nombre,nodo_aux->nombre)==0){
  16.        *lista=nodo_aux->siguiente; /* Ahora apunta al segundo de la lista */
  17.        free(nodo_aux);} /* Libera la memoria ocupada por el nodo borrado */
  18.     else{
  19.       nodo_anterior = nodo_aux;
  20.       nodo_aux = nodo_aux->siguiente;}
  21.       while ((nodo_aux->siguiente != NULL) && (!encontrado)){
  22.         if(strcmp(nombre,nodo_aux->nombre) == 0) /* Iguales */
  23.            encontrado = 1;
  24.         else{
  25.            nodo_anterior = nodo_aux;
  26.            nodo_aux = nodo_aux->siguiente;
  27.         }
  28.       }
  29.       if((nodo_aux->siguiente == NULL) && (!encontrado))
  30.        if(strcmp(nombre,nodo_aux->nombre) == 0) /* Iguales */
  31.          encontrado = 1;
  32.       if(encontrado){
  33.         nodo_anterior->siguiente = nodo_aux->siguiente;
  34.         free(nodo_aux); /* Libera la memoria ocupada por el nodo borrado */
  35.       }
  36.       printf("Telefono a borrar: ");
  37.     LEE_CAD(telefono,T_TEL);
  38.  
  39.     nodo_aux = *lista;
  40.     /* Comprueba si el elemento a borrar es el primero de la lista */
  41.     if(strcmp(telefono,nodo_aux->telefono)==0){
  42.        *lista=nodo_aux->siguiente; /* Ahora apunta al segundo de la lista */
  43.        free(nodo_aux);} /* Libera la memoria ocupada por el nodo borrado */
  44.     else{
  45.       nodo_anterior = nodo_aux;
  46.       nodo_aux = nodo_aux->siguiente;}
  47.       while ((nodo_aux->siguiente != NULL) && (!encontrado)){
  48.         if(strcmp(telefono,nodo_aux->telefono) == 0) /* Iguales */
  49.            encontrado = 1;
  50.         else{
  51.            nodo_anterior = nodo_aux;
  52.            nodo_aux = nodo_aux->siguiente;
  53.         }
  54.       }
  55.       if((nodo_aux->siguiente == NULL) && (!encontrado))
  56.        if(strcmp(telefono,nodo_aux->telefono) == 0) /* Iguales */
  57.          encontrado = 1;
  58.       if(encontrado){
  59.         nodo_anterior->siguiente = nodo_aux->siguiente;
  60.         free(nodo_aux); /* Libera la memoria ocupada por el nodo borrado */
  61.       }
  62. }
Cuando lo compilo introduzco esto: Maria 12, Lola 13, Pepe 14 a continuación me pide nombre a borrar pongo Maria y cuando le doy Enter para que me pide el teléfono a borrar me da fallo de segmentación. Después si quiero borrar el 2º nodo compuesto por Lola y 13 y le doy a mostrar lista me ha borrado el 2º y el 3º nodo y me muestra sólo Maria 12. Finalmente si elimino el 3º nodo y muestro la lista me ha borrado el 3º y el anterior, mostrándome sólo Maria 12.
¿Por qué el modulo que he hecho no funciona correctamente? Por favor, ayúdenme, gracias.