[ Foro de C ]

ejercicio de estructuras

04-Dec-2020 11:44
Invitado (ayuda)
1 Respuestas

hola,quisiera saber en que falla mi codigo. Gracias:

#include <stdio.h>
#include <stdlib.h>
#define N 20
struct Fecha {
   int dia, mes, anio;
};
struct Lista {
   int tam; //Cantidad de valores del array siguiente
   struct Fecha vectorFechas[N];     // Array de fechas
};
void rellenar_lista(struct Lista *l);
void escribir_lista(struct Lista l);
int insertar(struct Lista *l,struct Fecha f);
int main()
{
   struct Lista l;
   l.tam=0;
   rellenar_lista(&l);
   escribir_lista(l);
   return 0;
}

int insertar(struct Lista *l,struct Fecha f){
   int insertado=1;
   if(l->tam<N){
       l->vectorFechas[l->tam].dia=f.dia;
       l->vectorFechas[l->tam].mes=f.mes;
       l->vectorFechas[l->tam].anio=f.anio;
       l->tam++;
   }else{insertado=0;}
   return insertado;
}
void rellenar_lista(struct Lista *l){
   int acabar=0;
   struct Fecha f;
   printf("Introduce fechas, 0 0 0 para acabar.");
   do{
       printf("\nIntroduce dia, mes y anio: ");
       scanf("%d %d %d",&f.dia,&f.mes,&f.anio);
       if(f.dia==0 && f.mes==0 && f.anio==0){
           acabar=1;
       }
       else{
           insertar(&l,f);
       }
   }while(!acabar);
}
void escribir_lista(struct Lista l){
   int i;
   if(l.tam!=0){
       for(i=0;i<l.tam;i++){
           printf("\n\t%02d/%02d/%d",l.vectorFechas[i].dia,l.vectorFechas[i].mes,l.vectorFechas[i].anio);
       }
   }else{printf("\nLista vacia");}
}


08-Dec-2020 15:55
Invitado (jose)

hola invitado, en general lo tienes bien salvo quizás cuando llamas a insertar desde rellenar lista, ahí le estas enviando la dirección del puntero y no la dirección de la lista

ya que en insertar l es un puntero y no un doble puntero
resumiendo que sobra el '&' , l ya es un puntero.

tambíen decirte que en escribir lista, no necesitas hacer una copia de la estructura, es mas eficiente enviar la dirección

y que no tiene mucho sentido que insertar devuelva un int si no lo vas a usar

he retocado un poco tu programa para dejarlo un poco a mi gusto, ahí te lo dejo ya que este si compila, al menos a mi ;-)


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

#define N 20

enum { no, si };

struct Fecha { int dia, mes, anio; };

struct Lista
{
  int tam;    // nº de valores del array siguiente
  struct Fecha vectorFechas[N]; // Array de fechas
};

void rellenar_lista(struct Lista *l);
void escribir_lista(struct Lista *l);
int insertar(struct Lista *l,struct Fecha f);

int main()
{
  struct Lista l;

  l.tam=0;
  rellenar_lista(&l);
  escribir_lista(&l);

  return 0;
}

void rellenar_lista(struct Lista *l)
{
  int seguir=si;
  struct Fecha f;

  printf("Introduce fechas, 0 0 0 para acabar.");

  do{
     printf("\nIntroduce dia, mes y anio: ");
     scanf("%d %d %d",&f.dia,&f.mes,&f.anio);
     if(f.dia==0 && f.mes==0 && f.anio==0)
        seguir=no;      
     else
        insertar(l,f);
  }while(seguir);
}

void escribir_lista(struct Lista *l)
{
  if(l->tam)
     for(int i=0; i<l->tam; i++)
        printf("\n\t%02d/%02d/%d\n",
              l->vectorFechas[i].dia,
              l->vectorFechas[i].mes,
              l->vectorFechas[i].anio);
  else printf("\nLista vacia\n");
}

int insertar(struct Lista *l,struct Fecha f)
{
  int insertado=no;

  if(l->tam<N)
  {
     l->vectorFechas[l->tam].dia=f.dia;
     l->vectorFechas[l->tam].mes=f.mes;
     l->vectorFechas[l->tam].anio=f.anio;
     l->tam++;
     insertado=si;
  }

  return insertado;
}






(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.)