[ Foro de C ]

Al llamar a la accion CargarFallecidos, me muestra 2 veces al primero

21-Nov-2023 15:40
Juan Boyero
1 Respuestas

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Max 150
#define TRUE 1
#define FALSE 0

typedef struct {
   int dia;
   int mes;
   int anio;
} TFecha;

typedef struct {
   int dni;
   char nombre[100];
   char apellido[100];
   TFecha fechaNac;
   int edad;
   char ciudRes[100];
   char direcPost[100];
   char email[100];
   char tel[20];
   int vivo;
   TFecha fechaFall;
} TPersona;//TIPO que almacena todos los datos necesarios de cada persona ingresada


typedef struct {
   TPersona persona[Max];
   int cant;
} TData;//TIPO para poder llevar el conteo de lo almacenado en el array

TData list;

typedef struct TNodo {
   TPersona info;
   struct TNodo* next;
} TNodo;

TNodo* cabecera;


typedef struct TLocalidad{
   TPersona info;
   struct TLocalidad* next;
   struct TLocalidad* back;
} TLocalidad;

TLocalidad* puntIni;
TLocalidad* puntF;

int opcion;
TFecha fechaActual;
TPersona personaNueva;
int dniBusqueda;



void CargarArreglo(TData *p) {
   FILE *f;
   int i = 0;

   f = fopen("personas.dat", "rb");

   if (f == NULL) {
       printf("Error al abrir el archivo");
   } else {
       fseek(f, 0, SEEK_END);//Me muevo al final del archivo
       size_t numElementos = ftell(f) / sizeof(TPersona);//Veo la cantidad de elementos cargados en el archivo
       rewind(f);//Me coloco al principio del archivo

       p->cant = 0;  // Reinicializar el contador antes de cargar los datos

       while (i < numElementos && fread(&p->persona[i], sizeof(TPersona), 1, f) == 1) {
           //Leo el archivo  y lo guardo en el array
           i++;
           p->cant++;
       }
       fclose(f);
   }

   
}

void CargarArchivo(TData p) {
   int i;
   FILE *f;
   TPersona aux;

   // Abre el archivo en modo escritura binaria (crea uno nuevo o sobrescribe si existe)
   f = fopen("personas.dat", "w+b");

   if (f != NULL) {
       // Escribe cada persona del arreglo en el archivo
       i = 0;
       while (i < p.cant) {
           aux = p.persona[i];
           fwrite(&aux, sizeof(TPersona), 1, f);
           i++;
       }

       fclose(f);
   } else {
       // Imprime un mensaje si no se pudo abrir el archivo
       printf("El archivo no pudo abrirse correctamente.\n");
   }
}

void BubbleSortDni(TData m) {
   int i, j;
   TPersona aux;

   // Verifica si el arreglo no está vacío
   if (m.cant != 0) {
       for (i = m.cant - 1; i > 0; i--) {
           for (j = 0; j < i; j++) {
               if (m.persona[j].dni > m.persona[j + 1].dni) {
                   aux = m.persona[j];
                   m.persona[j] = m.persona[j + 1];
                   m.persona[j + 1] = aux;
               }
           }
       }
       // Muestra el arreglo ordenado por dni
       printf("Arreglo Ordenado por DNI:\n\n");
       for (i = 0; i < m.cant; i++) {
           printf("\n");
           //muestro todos los datos de cada persona
           printf("DNI: %d\n", m.persona[i].dni);
           printf("Nombre: %s\n", m.persona[i].nombre);
           printf("Apellido: %s\n", m.persona[i].apellido);
           printf("Fecha de Nacimiento: %d/%d/%d\n", m.persona[i].fechaNac.dia, m.persona[i].fechaNac.mes, m.persona[i].fechaNac.anio);
           printf("Edad: %d\n", m.persona[i].edad);
           printf("Ciudad de Residencia: %s\n", m.persona[i].ciudRes);
           printf("Dirección Postal: %s\n", m.persona[i].direcPost);
           printf("Email: %s\n", m.persona[i].email);
           printf("Telefono: %s\n", m.persona[i].tel);
           printf("Vivo: %d\n", m.persona[i].vivo);

           if (m.persona[i].vivo == 0) {//Si la persona ya fallecio muestro su fecha de fallecimiento
               printf("Fecha de Fallecimiento: %d/%d/%d\n", m.persona[i].fechaFall.dia, m.persona[i].fechaFall.mes, m.persona[i].fechaFall.anio);
               printf("\n");
           }
       }
   } else {
       // Imprime un mensaje si el arreglo está vacío
       printf("El arreglo está vacío.\n");
   }
}

int comparaDos(TPersona* a, TPersona* b) {
   /*Esta accion nos sirve para determinar cual persona debe ir primero
     segun el orden pedido por los profesores*/
   return strcmp(a->apellido, b->apellido) > 0 ||//(1)
          (strcmp(a->apellido, b->apellido) == 0 && strcmp(a->nombre, b->nombre) > 0) || //(2)
          (strcmp(a->apellido, b->apellido) == 0 && strcmp(a->nombre, b->nombre) == 0 && a->dni > b->dni); //(3)
   /*
   (1) Si el apellido de "a" es mayor al de "b" devuelve verdadero sino falso
   (2) Si los apellidos son iguales analizamos los nombres y comparamos al igual que antes
   (3) Si tanto apellido y nombre son iguales, analizamos si el dni de "a" es mayor devolvemos True sino False
   */
}

void OrdenarPrincipal(TData *m) {
   int i, j;
   TPersona aux;
   int comp;
   //Verifico que el arreglo no estè vacio
   if (m->cant != 0) {
       /*
       Esta accion es un Bubble Sort que llama a la funcion compararDos para
       determina si los datos de la persona estan en la posicion correcta,
       si no lo esta intercambia de posicion con el siguiente y asi hasta

       */
      //Tomo el tamaño del arreglo y los voy "disminuyendo" con cada ciclo
       for (i = m->cant - 1; i > 0; i--) {
           for (j = 0; j < i; j++) {
               comp = comparaDos(&(m->persona[j]), &(m->persona[j + 1]));
               if (comp == 1) {
                   aux = m->persona[j];
                   m->persona[j] = m->persona[j + 1];
                   m->persona[j + 1] = aux;
               }
           }
       }
   } else {
       printf("El arreglo esta vacio.\n");
   }
}

int Vacia(TData p) {
   /*Como su nombre lo indica esta funcion determina si el arreglo esta vacio*/
   if(p.cant == 0) {
     return TRUE;
   }else{
       return FALSE;
   }
}
         
int llena(TData p){
   if(p.cant == Max){
       return TRUE;
   }else{
       return FALSE;
   }

}                  
void Suprimir(TData* p) {
   int dniBuscado, i, can;
   //Ingreso el dni de la persona que quiero quitar
   printf("Ingrese el DNI de la persona a suprimir: ");
   scanf("%d", &dniBuscado);

   i = 0;

   // Busca la posición del DNI en el arreglo
   while ((p->persona[i].dni != dniBuscado) && (i <= p->cant)) {
       i++;
   }
   //Si se encontro la persona
   if (p->persona[i].dni == dniBuscado) {
       /* Realiza el corrimiento desde la posicion actual
       hacia la izquierda para "eliminar" la persona encontrada
       */
       do {
           p->persona[i] = p->persona[i + 1];
           i++;
       } while (i <= p->cant);
       p->cant = p->cant - 1;
   } else {
       //Si no se encontro la persona aviso
       printf("La persona que busca no se encuentra cargada.\n");
   }
}

int BusqDicot_DNI(TData p, int dni) {
   int limInf = 0;
   int limSup = (p.cant - 1);
   int medio = (limInf + limSup) / 2;
   /*
   Como el array ya està ordenado por dni previamente
   analizo si este es menor al primero o mayor al ultimo,
   si esto se cumple ya sabemos que no se encuentra la persona
   cargada en el array.
   */
   if (p.persona[0].dni > dni || p.persona[p.cant - 1].dni < dni) {
       printf("La persona buscada no se encuentra cargada, Dni fuera de rango.\n");
       return -1;
   } else {
       //Sino busco la persona a travez de busqueda dicotomica.
       while (dni != p.persona[medio].dni && limInf <= limSup) {
           if (dni < p.persona[medio].dni) {
               limSup = medio - 1;
           } else {
               limInf = medio + 1;
           }
           medio = (limInf + limSup) / 2;
       }
       //Si se encontrò la persona devuelvo su posicion
       if (dni == p.persona[medio].dni) {
           return medio;
       //Sino devuelvo (-1) para indicar una posicion invalida del array
       } else {
           printf("La persona buscada no se encuentra cargada.\n");
           return -1;
       }
   }
}

void Modificar(int dni, TFecha fAct, TData* p) {
   int i, j, pos, edad;
   TPersona aux;
   char mdf;//Variable "modificar"

   if (p->cant == 0) {
       printf("No hay elementos cargados en el arreglo.\n");
   } else {
       // Buble_Sort_DNI
       for (i = (p->cant - 1) ; i > 0; i--) {
           for (j = 0; j < i; j++) {
               if (p->persona[j].dni > p->persona[j + 1].dni) {
                   aux = p->persona[j];
                   p->persona[j] = p->persona[j + 1];
                   p->persona[j + 1] = aux;
               }
           }
       }

       // Busqueda dicotómica
       pos = BusqDicot_DNI(*p, dni);                                       //////////////////////

       if (pos != -1) {
           //Muestro los datos de la persona a modificar si fue encontrada
           printf("Datos de la persona a modificar:\n");
           printf("\n");
           printf("DNI: %d\n", p->persona[pos].dni);
           printf("Apellido: %s\n", p->persona[pos].apellido);
           printf("Nombre: %s\n", p->persona[pos].nombre);
           printf("Fecha de Nacimiento: %d/%d/%d\n", p->persona[pos].fechaNac.dia, p->persona[pos].fechaNac.mes, p->persona[pos].fechaNac.anio);
           printf("Edad: %d\n", p->persona[pos].edad);
           printf("Ciudad de Residencia: %s\n", p->persona[pos].ciudRes);
           printf("Direccion Postal: %s\n", p->persona[pos].direcPost);
           printf("Email: %s\n", p->persona[pos].email);
           printf("Telefono: %s\n", p->persona[pos].tel);
           printf("Vivo: %d\n", p->persona[pos].vivo);
           //Si la persona fallecio muestros su fecha de fallecimiento
           if (p->persona[pos].vivo == 0) {
               printf("Fecha de Fallecimiento: %d/%d/%d\n", p->persona[pos].fechaFall.dia, p->persona[pos].fechaFall.mes, p->persona[pos].fechaFall.anio);
           }
           printf("\n");
           //Modificacion de Apellido
           printf("Deseas modificar el Apellido de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese el apellido nuevo: ");
               scanf("%s", p->persona[pos].apellido);
           }
           //Modificacion de Nombre
           printf("Deseas modificar el Nombre de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese el nombre nuevo: ");
               scanf("%s", p->persona[pos].nombre);
           }
           //Modificacion de fecha de Nacimiento
           printf("Deseas modificar la fecha de nacimiento de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
            printf("Ingrese el dia, el mes y el ano de nacimiento: ");
               scanf("%d %d %d", &p->persona[pos].fechaNac.dia, &p->persona[pos].fechaNac.mes, &p->persona[pos].fechaNac.anio);

               // Calcular la edad
               edad = (fAct.anio - p->persona[pos].fechaNac.anio);
               if (fAct.mes < p->persona[pos].fechaNac.mes || (fAct.mes == p->persona[pos].fechaNac.mes && fAct.dia < p->persona[pos].fechaNac.dia)) {
                   edad--;
               }
               p->persona[pos].edad = edad;
           }
           //Modificacion de residencia
           printf("Deseas modificar la ciudad de residencia de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese la nueva ciudad de residencia: ");
               scanf("%s", p->persona[pos].ciudRes);
           }
           //Modificacion de  direccion
           printf("Deseas modificar la dirección postal de la vivienda de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese la nueva dirección postal: ");
               scanf("%s", p->persona[pos].direcPost);
           }
           //Modificacion de Email
           printf("Deseas modificar el Email de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese el nuevo email: ");
               scanf("%s", p->persona[pos].email);
           }
           //Modificacion de Telefono
           printf("Deseas modificar el numero de telefono de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               printf("Ingrese el nuevo numero: ");
               scanf("%s", p->persona[pos].tel);
           }
           //Modificacion de Condicion de vida
           printf("Deseas modificar el estado de vivo o muerto de la persona? (S/N): ");
           scanf(" %c", &mdf);
           if (mdf == 'S' || mdf == 's') {
               if(p->persona[pos].vivo == 1){
                   p->persona[pos].vivo = 0;
               }else{
                   p->persona[pos].vivo = 1;
               }
           //Modificacion de Fecha de fallecimiento si cambio su condiciin
               if (p->persona[pos].vivo == 0) {
                   printf("Ingrese la fecha de fallecimiento (dia/mes/ano): ");
                   scanf("%d %d %d", &p->persona[pos].fechaFall.dia, &p->persona[pos].fechaFall.mes, &p->persona[pos].fechaFall.anio);
                   
               }
           }
           printf("Datos modificados con exito.\n");

       } else {
           printf("La persona buscada no se encuentra cargada.\n");
       }

       // Llamada a la acción OrdenarPrincipal
       OrdenarPrincipal(&(*p));                                            
   }
}

void Mostrar(TData p) {
   int i;

   if (p.cant == 0) {
       printf("No hay elementos cargados en el arreglo.\n");
   } else {
       for (i = 0; i < (p.cant); i++) {
           
           printf("\n");
           printf("DNI: %d\n", p.persona[i].dni);
           printf("Apellido: %s\n", p.persona[i].apellido);
           printf("Nombre: %s\n", p.persona[i].nombre);
           printf("Fecha de Nacimiento: %d/%d/%d\n", p.persona[i].fechaNac.dia, p.persona[i].fechaNac.mes, p.persona[i].fechaNac.anio);
           printf("Edad: %d\n", p.persona[i].edad);
           printf("Ciudad de Residencia: %s\n", p.persona[i].ciudRes);
           printf("Dirección Postal: %s\n", p.persona[i].direcPost);
           printf("Email: %s\n", p.persona[i].email);
           printf("Teléfono: %s\n", p.persona[i].tel);
           printf("Vivo: %d\n", p.persona[i].vivo);

           if (p.persona[i].vivo == 0) {
               printf("Fecha de Fallecimiento: %d/%d/%d\n", p.persona[i].fechaFall.dia, p.persona[i].fechaFall.mes, p.persona[i].fechaFall.anio);
           }
           printf("\n");
       }
   }
}

void Insertar(TData *p, TPersona per) {
   int i, can;
   int j;
   
   
   i = 0;
   can = p->cant;
   p->persona[can] = per;
   p->cant ++;
   OrdenarPrincipal(&(*p)); // Tambien se puede hacer asi JAJAJAJA
   
   // Buscar la posición de inserción basada en apellido, nombre y dni
   /*while ((i < p->cant) &&
          (strcmp(per.apellido, p->persona[i].apellido) > 0 ||
           (strcmp(per.apellido, p->persona[i].apellido) == 0 &&
            (strcmp(per.nombre, p->persona[i].nombre) > 0 ||
             (strcmp(per.nombre, p->persona[i].nombre) == 0 &&
              per.dni > p->persona[i].dni))))) {
       i++;
   }

   // Desplazar elementos para hacer espacio para la nueva persona
   for (j = can; j > i; j--) {
       p->persona[j] = p->persona[j - 1];
   }

   // Insertar la nueva persona en la posición correcta
   p->persona[i] = per;

   p->cant++;*/
}


void CrearList(TNodo **cab) {
   *cab = (TNodo *)malloc(sizeof(TNodo));//Obtener(cab)
   (*cab)->next = NULL;
}

/*void InsertarFallecido(TData p, int i, TNodo **cab) {
   TNodo *aux;
   
   aux= *cab;
   while (aux->next != NULL) {//Me desplazo hacia el final de la lista
       aux = aux->next;
   }
   aux->next = (TNodo *)malloc(sizeof(TNodo));//Obtener(aux)
   aux = aux->next;                       //FIJARSE ENTRE LINEA 453 y 456
   aux->info = p.persona[i];
   aux->next = NULL;
}*/

// Acción CargarFallecidos
/*void CargarFallecidos(TData p, TNodo **cab) {
   int i;
   TNodo *aux;
   
   i = 0;
   while (i < p.cant) {
       if (p.persona[i].vivo == 0) {//Si la persona ha fallecido lo inserto a la lista
           aux = *cab;
           while (aux->next != NULL) {//Me desplazo hacia el final de la lista
               aux = aux->next;
           }
           aux->next = (TNodo *)malloc(sizeof(TNodo));//Obtener(aux)
           aux = aux->next;                        FIJARSE ENTRE LINEA 453 y 456                              /////HAY QUE CAMBIARLO/////////
           aux->info = p.persona[i];
           aux->next = NULL;
       }
       i++;
   }
}*/
void CargarFallecidos(TData p, struct TNodo** cab) {
   int i;
   struct TNodo *auxMostrar;
   i = 0;

   while (i < p.cant) {
       if (p.persona[i].vivo == 0) {
           struct TNodo* aux1 = (struct TNodo*)malloc(sizeof(struct TNodo));
           aux1->info = p.persona[i];
           aux1->next = NULL;

           if (*cab == NULL) {
               *cab = aux1;  // Si la lista está vacía, establecer el nuevo nodo como el primer nodo
           } else {
               struct TNodo* temp = *cab;
               while (temp->next != NULL) {
                   temp = temp->next;
               }
               temp->next = aux1;  // Agregar el nuevo elemento al final de la lista
           }
       }
       i++;  // Incrementar i
   }

   auxMostrar = *cab;  // Inicialización de auxMostrar al principio de la lista


   while (auxMostrar != NULL) {        
       printf("Nombre:%s\n",auxMostrar->info.nombre);
       printf("Apellido:%s\n",auxMostrar->info.apellido);
       printf("DNI:%d\n",auxMostrar->info.dni);
       printf("Fecha de Nacimiento:(%d/%d/%d) \n",auxMostrar->info.fechaNac.dia,auxMostrar->info.fechaNac.mes,auxMostrar->info.fechaNac.anio);
       printf("Edad:%d\n",auxMostrar->info.edad);
       printf("Fecha de Fallecimiento:(%d/%d/%d) \n",auxMostrar->info.fechaFall.dia,auxMostrar->info.fechaFall.mes,auxMostrar->info.fechaFall.anio);
       printf("Localidad:%s\n",auxMostrar->info.ciudRes);
       printf("Direccion:%s\n",auxMostrar->info.direcPost);
       printf("Email:%s\n",auxMostrar->info.email);
       printf("Telefono:%s\n",auxMostrar->info.tel);
       printf("\n");
       auxMostrar = auxMostrar->next;
   }
   printf("\n");
}      
void LiberarLista(struct TNodo** cab) {
   struct TNodo* temp;

   while (*cab != NULL) {
       temp = *cab;
       *cab = (*cab)->next;
       free(temp);
   }
}

// Acción MostrarFallecidos
/*void MostrarFallecidos(TNodo *cab) {
   TNodo *aux;
   aux = cab->next;
   if(aux != NULL){
   while (aux != NULL) {
   printf("DNI: %d\n", aux->info.dni);
   printf("Nombre: %s\n", aux->info.nombre);
   printf("Apellido: %s\n", aux->info.apellido);
   printf("Fecha de Nacimiento: %d/%d/%d\n", aux->info.fechaNac.dia, aux->info.fechaNac.mes, aux->info.fechaNac.anio);
   printf("Edad: %d\n", aux->info.edad);
   printf("Ciudad de Residencia: %s\n", aux->info.ciudRes);
   printf("Dirección Postal: %s\n", aux->info.direcPost);
   printf("Email: %s\n", aux->info.email);
   printf("Teléfono: %s\n", aux->info.tel);
   printf("Vivo: %s\n", aux->info.vivo ? "Sí" : "No");
   if (!aux->info.vivo) {
       printf("Fecha de Fallecimiento: %d/%d/%d\n", aux->info.fechaFall.dia, aux->info.fechaFall.mes, aux->info.fechaFall.anio);
   }
   aux = aux->next;
  }
   }else{
       printf("No hay personas Fallecidas en el arreglo");
   }
}*/

void MostrarLista(TLocalidad *lista, TLocalidad *listafin, char orden) {
   TLocalidad *aux1;
   if (orden == 'A' || orden == 'a') {// MUESTRA DE FORMA ASCENDENTE
       aux1 = lista->next;
       while (aux1->next != NULL) {
           printf("\n");
           printf("DNI: %d\n", aux1->info.dni);
           printf("Nombre: %s\n", aux1->info.nombre);
           printf("Apellido: %s\n", aux1->info.apellido);
           printf("Fecha de Nacimiento: %d/%d/%d\n", aux1->info.fechaNac.dia, aux1->info.fechaNac.mes, aux1->info.fechaNac.anio);
           printf("Edad: %d\n", aux1->info.edad);
           printf("Ciudad de Residencia: %s\n", aux1->info.ciudRes);
           printf("Dirección Postal: %s\n", aux1->info.direcPost);
           printf("Email: %s\n", aux1->info.email);
           printf("Teléfono: %s\n", aux1->info.tel);
           if (!aux1->info.vivo) {
               printf("Fecha de Fallecimiento: %d/%d/%d\n", aux1->info.fechaFall.dia, aux1->info.fechaFall.mes, aux1->info.fechaFall.anio);
           }
           printf("\n");
           aux1 = aux1->next;
       }
       }else{ // MUESTRA DE FORMA DESCENDENTE
           if (orden == 'D' || orden == 'd') {
           aux1 = listafin->back;
           while (aux1->back != NULL) {
               printf("\n");
               printf("DNI: %d\n", aux1->info.dni);
               printf("Nombre: %s\n", aux1->info.nombre);
               printf("Apellido: %s\n", aux1->info.apellido);
               printf("Fecha de Nacimiento: %d/%d/%d\n", aux1->info.fechaNac.dia, aux1->info.fechaNac.mes, aux1->info.fechaNac.anio);
               printf("Edad: %d\n", aux1->info.edad);
               printf("Ciudad de Residencia: %s\n", aux1->info.ciudRes);
               printf("Dirección Postal: %s\n", aux1->info.direcPost);
               printf("Email: %s\n", aux1->info.email);
               printf("Teléfono: %s\n", aux1->info.tel);
               if (!aux1->info.vivo) {
                   printf("Fecha de Fallecimiento: %d/%d/%d\n", aux1->info.fechaFall.dia, aux1->info.fechaFall.mes, aux1->info.fechaFall.anio);
               }
               printf("\n");
               aux1 = aux1->back;
           }
           }
    }  
}

void MismaLocalidad(TData p, char loc[], TLocalidad **q, TLocalidad **r) {
   TLocalidad *aux1, *aux2;
   int i, j;
   char opcion;

   if (p.cant == 0) {
       printf("El arreglo está vacío\n");
   } else {
       //CREACION  de LDE con ficticio
       *q = (TLocalidad *)malloc(sizeof(TLocalidad));//Obtener(q)
       (*q)->back = NULL;
       *r = (TLocalidad *)malloc(sizeof(TLocalidad));//Obtener(r)
       (*r)->next = NULL;
       (*r)->back = *q;//Antes estaba asi (*r)->back = NULL; fijate fran graficalo, te quedaba mal
       (*q)->next = *r;

       i = 0;
       j = 0;
       aux1 = *q;
       while (i < p.cant) {
           if (strcmp(p.persona[i].ciudRes, loc) == 0) {
               aux2 = (TLocalidad *)malloc(sizeof(TLocalidad));
               aux2->info = p.persona[i];
               aux2->back = aux1;
               aux2->next = aux1->next;            /*Preguntarle al fran sobre esto, mepa que està mal*/

               if (aux1->next != NULL) {
                   ((TLocalidad *)(aux1->next))->back = aux2;
               }

               aux1->next = aux2;
               aux1 = aux1->next;
               j++;
           }
           i++;
       }

       if (j == 0) {
           printf("No hay personas de esta localidad registradas\n");
       } else {
           printf("Deseas ver los integrantes de manera ascendente o descendente, Ascendente “A”, descendente “D”: ");
           scanf(" %c", &opcion);

           MostrarLista(*q, *r, opcion);
       }
   }
}




int main() {
   int opcion = 0;
   int edad;
   
   printf("Ingrese la fecha actual:\n");
   printf("Dia: ");
   scanf("%d", &fechaActual.dia);
   printf("Mes: ");
   scanf("%d", &fechaActual.mes);
   printf("Ano: ");
   scanf("%d", &fechaActual.anio);
   CargarArreglo(&list);
   OrdenarPrincipal(&list);
   CrearList(&cabecera);
   //CargarFallecidos(list, &cabecera);

   do {
     
       
       printf("Menu Principal\n");
       printf("[1] Insertar persona\n");
       printf("[2] Eliminar personas\n");
       printf("[3] Modificar datos de personas\n");
       printf("[4] Listar todas las personas\n");
       printf("[5] Listar personas fallecidas\n");
       printf("[6] Listar personas de una localidad\n");
       printf("[7] Ordenar por DNI\n");
       printf("[8] Salir\n");

       printf("Ingrese la opcion: ");
       scanf("%d", &opcion);
       
       if (opcion == 1) {
           if(!llena(list)){
               printf("Ingrese el DNI de la persona: ");
               scanf("%d", &personaNueva.dni);
               printf("Ingrese el nombre de la persona: ");
               scanf("%s", personaNueva.nombre);
               printf("Ingrese el apellido de la persona: ");
               scanf("%s", personaNueva.apellido);
               printf("Ingrese la fecha de nacimiento (dd/mm/aaaa): ");
               scanf("%d %d %d", &personaNueva.fechaNac.dia, &personaNueva.fechaNac.mes, &personaNueva.fechaNac.anio);
               edad = (fechaActual.anio - personaNueva.fechaNac.anio);
                   if (fechaActual.mes < personaNueva.fechaNac.mes || (fechaActual.mes == personaNueva.fechaNac.mes && fechaActual.dia < personaNueva.fechaNac.dia)) {
                       edad--;
                   }
                   personaNueva.edad = edad;
               printf("Ingrese la ciudad de residencia de la persona: ");
               scanf("%s", personaNueva.ciudRes);
               printf("Ingrese la direccion postal de la persona: ");
               scanf("%s", personaNueva.direcPost);
               printf("Ingrese el correo electronico de la persona: ");
               scanf("%s", personaNueva.email);
               printf("Ingrese el numero de telefono de la persona: ");
               scanf("%s", personaNueva.tel);
               printf("La persona esta viva (1) o fallecida (0): ");
               scanf("%d", &personaNueva.vivo);
               if (!personaNueva.vivo) {
                   printf("Ingrese la fecha de fallecimiento (dd/mm/aaaa): ");
                   scanf("%d %d %d", &personaNueva.fechaFall.dia, &personaNueva.fechaFall.mes, &personaNueva.fechaFall.anio);
               }      
               Insertar(&list, personaNueva);
           }else{
               printf("El arreglo ya esta lleno");
           }
       } else if (opcion == 2) {
           if (!Vacia(list)) {
               Suprimir(&list);
           }
       } else if (opcion == 3) {
           printf("Ingrese el DNI que deseas buscar: ");
           scanf("%d", &dniBusqueda);
           Modificar(dniBusqueda, fechaActual, &list);
           //CargarFallecidos(list, &cabecera);
       } else if (opcion == 4) {
           Mostrar(list);
       } else if (opcion == 5) {
           CargarFallecidos(list,&cabecera);
           LiberarLista(&cabecera);

       } else if (opcion == 6) {
           char localidad[50];
           printf("Ingrese la localidad que deseas listar: ");
           scanf("%s", localidad);
           MismaLocalidad(list, localidad, &puntIni, &puntF);
       } else if (opcion == 7) {  
           BubbleSortDni(list);
       } else if (opcion == 8) {
           CargarArchivo(list);
           printf("Adiós\n");
           opcion = 9;
       }
   } while (opcion != 9);
   return 0;
}


28-Nov-2023 22:56
Invitado (ram?n)

hola juan

lo que ocurre es que cuando arranca el programa llamas a crearlista,
y ya le das un valor a cabecera y es un valor que lo tienes ahí sin nada
o con basura y si llamas a la opción de listar fallecidos lista lo que tiene

otra cosa es el porqué de usar listas enlazadas cuando de entrada creas
un array con el máximo de personas posibles ¿? es una locura

lo suyo es que uses listas enlazadas desde el principio, te puede ayudar
mucho este video de makigas donde crea una librería para uso de listas,
solo tienes que copiar las funciones que te interesen al hacerte tu librería
y la lógica del programa se verá mucho más clara y tendrás menos errores

Estructuras de datos – 3. Listas enlazadas en C (COMPLETO)
dura un poco mas 15min

https://www.youtube.com/watch?v=vldM-3PYAmo&list=PLTd5ehIj0goMTSK7RRAPBF4wP-Nj5DRvT&index=3&pp=iAQB

quedaría mucho más limpio el código si crearas funciones:
- que muestre los datos de una persona por ej
     ver_persona(TPersona* persona),
- que pida los datos por ej
     rellena_persona(TPersona* persona)
- que modifique los datos por ej
     midifica_persona(TPersona* persona)
- que muestre el menú y devuelva la opción por ej
     int menu_principal()

si le añades la librería de makigas tendrás un código muchísimo
más limpio y con menos errores
ya verás que te encantará

saludos ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)