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 originalvoid borrar_nodo(struct nodo_lista **lista){
/* Para borrar un nodo, tendremos que guardar un puntero al nodo anterior
del que nos encontramos, ya que este puntero pasará a apuntar al nodo
apuntado por el que vamos a borrar */
struct nodo_lista *nodo_aux, *nodo_anterior;
char nombre[T_NOM];
char telefono[T_TEL];
int encontrado = 0;
LEE_CAD(nombre,T_NOM);
nodo_aux = *lista;
/* Comprueba si el elemento a borrar es el primero de la lista */
if(strcmp(nombre
,nodo_aux
->nombre
)==0){ *lista=nodo_aux->siguiente; /* Ahora apunta al segundo de la lista */
free(nodo_aux
);} /* Libera la memoria ocupada por el nodo borrado */ else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;}
while ((nodo_aux->siguiente != NULL) && (!encontrado)){
if(strcmp(nombre
,nodo_aux
->nombre
) == 0) /* Iguales */ encontrado = 1;
else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;
}
}
if((nodo_aux->siguiente == NULL) && (!encontrado))
if(strcmp(nombre
,nodo_aux
->nombre
) == 0) /* Iguales */ encontrado = 1;
if(encontrado){
nodo_anterior->siguiente = nodo_aux->siguiente;
free(nodo_aux
); /* Libera la memoria ocupada por el nodo borrado */ }
printf("Telefono a borrar: "); LEE_CAD(telefono,T_TEL);
nodo_aux = *lista;
/* Comprueba si el elemento a borrar es el primero de la lista */
if(strcmp(telefono
,nodo_aux
->telefono
)==0){ *lista=nodo_aux->siguiente; /* Ahora apunta al segundo de la lista */
free(nodo_aux
);} /* Libera la memoria ocupada por el nodo borrado */ else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;}
while ((nodo_aux->siguiente != NULL) && (!encontrado)){
if(strcmp(telefono
,nodo_aux
->telefono
) == 0) /* Iguales */ encontrado = 1;
else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;
}
}
if((nodo_aux->siguiente == NULL) && (!encontrado))
if(strcmp(telefono
,nodo_aux
->telefono
) == 0) /* Iguales */ encontrado = 1;
if(encontrado){
nodo_anterior->siguiente = nodo_aux->siguiente;
free(nodo_aux
); /* Libera la memoria ocupada por el nodo borrado */ }
}
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.