Código C:
Ver originalwhile(fread(&amigo
, sizeof(Amigo
), 1, file
)){ existe = (strcmpi(amigo.apellido,p.apellido)==0);
existe &= (strcmpi(amigo.nombre,p.nombre)==0);
existe &= (strcmpi(amigo.email,p.email)==0);
existe &= (strcmpi(amigo.celular,p.celular)==0);
existe &= (amigo.fecNac.anio==p.fecNac.anio);
existe &= (amigo.fecNac.mes==p.fecNac.mes);
existe &= (amigo.fecNac.dia==p.fecNac.dia);
}
Si el fichero tiene 2 registros y el buscado es el primero la función te va a decir que no existe el registro.
El while tiene que tener como condición adicional el chequeo de
existe para parar si se localiza el registro:
Código C:
Ver originalwhile(!existe
&& fread(&amigo
, sizeof(Amigo
), 1, file
)){ existe = (strcmpi(amigo.apellido,p.apellido)==0);
existe &= (strcmpi(amigo.nombre,p.nombre)==0);
existe &= (strcmpi(amigo.email,p.email)==0);
existe &= (strcmpi(amigo.celular,p.celular)==0);
existe &= (amigo.fecNac.anio==p.fecNac.anio);
existe &= (amigo.fecNac.mes==p.fecNac.mes);
existe &= (amigo.fecNac.dia==p.fecNac.dia);
}
Y sigo sin entender la utilidad del contador de elementos de la lista:
Código C:
Ver original/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
if (lista->cantidad == 0){
return -1;
}
Persona *supElemento;
supElemento = lista->inicio;
lista->inicio = lista->inicio->sig;
if (lista->cantidad == 1){
lista->fin = NULL;
lista->inicio=NULL;
}
lista->cantidad--;
return 0;
}
Cuando queda más sencillo así:
Código C:
Ver original/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
// ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
int toReturn = -1;
if (lista->inicio){
Persona *sig = lista->inicio->sig;
lista->inicio = sig;
lista->cantidad--;
if( !sig->sig )
lista->fin = NULL;
toReturn = 0; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
}
return toReturn;
}
Pero es que, en una lista enlazada simple yo iría aún más lejos y eliminaría el puntero al último elemento de la lista. Recorrer una lista enlazada es relativamente rápido salvo que tenga millones y millones de elementos y mantener este segundo puntero que únicamente sirve como ayuda a la hora de añadir elementos al final de la lista no aporta demasiado:
Código C:
Ver original/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
// ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
int toReturn = -1;
if (lista->inicio){
Persona *sig = lista->inicio->sig;
lista->inicio = sig;
toReturn = 0; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
}
return toReturn;
}
Y, bueno, como consejo adicional, para gestionar valores booleanos todos sabemos que en C no hay ningún tipo nativo que se encargue de ello. Sin embargo, tenemos la cabecera <stdbool.h> que incluye dicho tipo, lo que permite tener código más legible. Lo que hace esa cabecera es crear el tipo bool a partir de int y definir los valores true y false.
Un ejemplo compilable en C:
Código C:
Ver original#include <stdbool.h>
int main(void) {
bool continuar = true;
while(continuar) {
printf("Pulse 0 para terminar...\n"); }
}
Deberías plantearte usar esta librería para sustituir la lógica booleana que tienes actualmente implementada en tu aplicación.
Un saludo.