Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLAPFILE 20
#define MAXLN 80
#define MAXPLACE 3
typedef struct laps
{
int lap;
char lapfile[MAXLAPFILE];
}laps;
typedef struct readlap
{
int drivenum;
char drivename[MAXLAPFILE];
char team[MAXLAPFILE];
int laptime;
}readlap;
typedef struct pilot_t
{
int lap;
int drivenum;
char drivename[MAXLAPFILE];
char team[MAXLAPFILE];
int laptime;
struct pilot_t *next;
}pilot_t;
pilot_t *charge_list(int lap, FILE *fp, pilot_t *head);
void print_fastest(pilot_t *head);
void print_three_bests(pilot_t *head);
pilot_t *take_out(pilot_t *head, char drivename);
int main()
{
char fpIN[MAXLN];
FILE *fp, *fp2;
laps *tmp;
pilot_t *head=NULL;
printf("Inserire nome file input:");
scanf("%s", fpIN);
if((fp=fopen(fpIN,"r"))==NULL)//controllo apertura file
{
printf("Errore apertura file");
return EXIT_FAILURE;
}
if((tmp=(laps *)malloc(sizeof(laps)))==NULL)//allocazione dinamica struct per primo file
{
printf("Errore allocazione memoria");
return EXIT_FAILURE;
}
while(!feof(fp))
{
fscanf(fp, "%d %s", &(*tmp).lap,(* tmp).lapfile);
if((fp2=fopen((*tmp).lapfile,"r"))==NULL)
{
printf("Errore apertura file");
return EXIT_FAILURE;
}
while(!feof(fp2))
head=charge_list((*tmp).lap, fp2, head);//caricamento lista
}
free(tmp);//rimozione struct primo file, è inutile dopo aver caricato la lista
fclose(fp);//chiusura file, è inutile dopo aver caricato la lista
fclose(fp2);//come sopra
print_fastest(head);//giro più veloce
print_three_bests(head);//tre piloti più veloci
return EXIT_SUCCESS;
}
pilot_t *charge_list(int lap, FILE *fp, pilot_t *head)//carica lista
{
pilot_t *tmp;
readlap tmplap;
if((tmp=(pilot_t *)malloc(sizeof(pilot_t)))==NULL)
{
printf("Errore allocazione memoria");
exit(1);
}
fscanf(fp, "%d %s %s %d", &tmplap.drivenum, tmplap.drivename, tmplap.team, &tmplap.laptime);
tmp->lap=lap;
tmp->drivenum=tmplap.drivenum;
strcpy(tmp->drivename, tmplap.drivename);
strcpy(tmp->team, tmplap.team);
tmp->laptime=tmplap.laptime;
tmp->next=head;
head=tmp;
return head;
}
void print_fastest(pilot_t *head)//cerca e stampa a video il giro più veloce
{
pilot_t *s, *t;
s=head;
t=head;
while(s!=NULL)
{
if(s->laptime < t->laptime)
t=s;
s=s->next;
}
printf("Giro veloce: %s, %s, %d secondi, giro %d", t->drivename, t->team, t->laptime, t->lap);
}
void print_three_bests(pilot_t *head)
{
pilot_t *s, *temp=NULL, *ctemp, *t;
int i;
s=head;
while(s!=NULL && s->lap==1)//crea lista temporanea primo giro
{
if((ctemp=(pilot_t *)malloc(sizeof(pilot_t)))==NULL)
{
printf("Errore allocazione memoria");
exit(1);
}
ctemp->lap=s->lap;
ctemp->drivenum=s->drivenum;
strcpy(ctemp->drivename, s->drivename);
strcpy(ctemp->team, s->team);
ctemp->laptime=s->laptime;
ctemp->next=temp;
temp=ctemp;
s=s->next;
}
t=temp;
while(t!=NULL)//somma tempi complessivi
{
t->laptime=0;
while(s!=NULL)
{
if(strcmp(s->drivename, t->drivename)==0)
t->laptime+=s->laptime;
s=s->next;
}
t=t->next;
}
s=temp;
for(i=0;i<MAXPLACE;i++)
{
while(s!=NULL)//cerca il più piccolo
{
if(s->laptime < t->laptime)
t=s;
s=s->next;
}
printf("%d %s, %s, %d secondi", i+1, t->drivename, t->team, t->laptime);
temp=take_out(temp, t->drivename);
}
}
pilot_t *take_out(pilot_t *head, char drivename)
{
pilot_t *s, *t;
if(strcmp((*head).drivename, drivename)==0)
{
s=head;
head=head->next;
free(s);
}
else
{
s=head;
while(s!=NULL)
if(strcmp(drivename, (*s).drivename)==0)
{
t=s->next;
free(s);
}
}
return head;
}Deve stampare a video il pilota più veloce in uno specifico giro e i tre piloti complessivamente più veloci..
mi da dei warning di troppo che credo siano la causa del segmentation fault che ottengo in esecuzione...
vi prego aiutatemi! [-o<


