Ver Mensaje Individual
  #9 (permalink)  
Antiguo 29/07/2016, 03:36
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Archivos y Listas enlazadas simples en C

Código C:
Ver original
  1. while(fread(&amigo, sizeof(Amigo), 1, file)){
  2.     existe = (strcmpi(amigo.apellido,p.apellido)==0);
  3.     existe &= (strcmpi(amigo.nombre,p.nombre)==0);
  4.     existe &= (strcmpi(amigo.email,p.email)==0);
  5.     existe &= (strcmpi(amigo.celular,p.celular)==0);
  6.     existe &= (amigo.fecNac.anio==p.fecNac.anio);
  7.     existe &= (amigo.fecNac.mes==p.fecNac.mes);
  8.     existe &= (amigo.fecNac.dia==p.fecNac.dia);
  9. }

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 original
  1. while(!existe && fread(&amigo, sizeof(Amigo), 1, file)){
  2.     existe = (strcmpi(amigo.apellido,p.apellido)==0);
  3.     existe &= (strcmpi(amigo.nombre,p.nombre)==0);
  4.     existe &= (strcmpi(amigo.email,p.email)==0);
  5.     existe &= (strcmpi(amigo.celular,p.celular)==0);
  6.     existe &= (amigo.fecNac.anio==p.fecNac.anio);
  7.     existe &= (amigo.fecNac.mes==p.fecNac.mes);
  8.     existe &= (amigo.fecNac.dia==p.fecNac.dia);
  9. }

Y sigo sin entender la utilidad del contador de elementos de la lista:

Código C:
Ver original
  1. /* eliminación al inicio de la lista */
  2. int suprimirInicio (Lista *lista){
  3.     if (lista->cantidad == 0){
  4.         return -1;
  5.     }
  6.     Persona *supElemento;
  7.     supElemento = lista->inicio;
  8.     lista->inicio = lista->inicio->sig;
  9.     if (lista->cantidad == 1){
  10.         lista->fin = NULL;
  11.         lista->inicio=NULL;
  12.     }
  13.     free (supElemento);
  14.     lista->cantidad--;
  15.     return 0;
  16. }

Cuando queda más sencillo así:

Código C:
Ver original
  1. /* eliminación al inicio de la lista */
  2. int suprimirInicio (Lista *lista){
  3.   // ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
  4.   int   toReturn = -1;
  5.  
  6.   if (lista->inicio){
  7.     Persona *sig = lista->inicio->sig;
  8.     free(lista->inicio);
  9.     lista->inicio = sig;
  10.     lista->cantidad--;
  11.  
  12.     if( !sig->sig )
  13.       lista->fin = NULL;
  14.  
  15.     toReturn = 0; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
  16.   }
  17.  
  18.   return toReturn;
  19. }

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
  1. /* eliminación al inicio de la lista */
  2. int suprimirInicio (Lista *lista){
  3.   // ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
  4.   int   toReturn = -1;
  5.  
  6.   if (lista->inicio){
  7.     Persona *sig = lista->inicio->sig;
  8.     free(lista->inicio);
  9.     lista->inicio = sig;
  10.  
  11.     toReturn = 0; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
  12.   }
  13.  
  14.   return toReturn;
  15. }

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
  1. #include <stdbool.h>
  2.  
  3. int main(void) {
  4.     bool continuar = true;
  5.     while(continuar) {
  6.       printf("Pulse 0 para terminar...\n");
  7.       scanf("%d",continuar);
  8.     }
  9.     printf("FIN!!!\n");
  10. }

Deberías plantearte usar esta librería para sustituir la lógica booleana que tienes actualmente implementada en tu aplicación.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.