struct autom{
int targa;
int strada_arrivo;
};
struct rotatoria{
struct autom * autom_rot;
int posizione;
struct rotatoria * next;
};
struct coda{
struct autom * auto_strada;
struct coda * next;
struct coda * testa;
struct coda * ultimo;
struct rotatoria * collegamento;
};
struct strada{
int nome;
struct coda *attesa;
};
struct istante{
struct rotatoria * rotat_ist;
struct strada * stradat[5];
int momento;
};
struct rotatoria* crearotatoria()
{
struct rotatoria *p,*t;
int i;
t = NULL;
for( i = 0; i < 15; i++)
{
p = malloc( sizeof(struct rotatoria) );
p->autom_rot = malloc( sizeof(struct autom) );
p->autom_rot->targa = 0;
p->autom_rot->strada_arrivo = 0;
p->posizione = 14-i;
p->next = t;
t = p;
}
return t;
}
int metti_in_rotonda(struct rotatoria* rot,int targa, int pos_e, int str_u)
{
if(rot->posizione == pos_e)
{
if(rot->autom_rot->targa == 0)
{
rot->autom_rot->targa = targa;
rot->autom_rot->strada_arrivo = str_u;
return 1;
}
else
return 0;
}
else
{
//return metti_in_rotonda(rot->next, targa, pos_e, str_u);
//se pos_e non corrisponde inneschi una ricorsione infinita.(per quello ho tolto la lista circolare)
return (rot->next) ? metti_in_rotonda(rot->next, targa, pos_e, str_u) : 0;
}
}
struct coda* crea(int targa,int uscita)
{
struct coda* appoggio = malloc( sizeof(struct coda) );
appoggio->auto_strada = malloc( sizeof(struct autom) );
appoggio->auto_strada->targa = targa;
appoggio->auto_strada->strada_arrivo = uscita;
appoggio->next=NULL;
appoggio->collegamento = malloc(sizeof(struct rotatoria));
return appoggio;
}
struct coda* ins_coda(struct coda* via,int targa,int strada_u)
{
if( !via )
return crea(targa,strada_u);
struct coda* l;
for ( l = via; l->next ; l = l->next);
l->next = crea(targa,strada_u);
return via;
}
int main(int argc, char *argv[])
{
//HANDLE hConsole;
//hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int c;
int cont_macc_rot = 0;//variabile usata per sapere il numero di macchine presenti sulla rotonda
int targa;//variabile usate per leggere da file la targa dell auto
int posizione_e;//variabile usata per leggere da file dove si trova l' auto inizialmente
int strada_u;//variabile usata per indicare la strada di uscita che l' auto vuole prendere
struct istante* iniziale = malloc( sizeof(struct istante) );
//iniziale->rotat_ist = (struct rotatoria*) malloc(sizeof(struct rotatoria));
for( c = 0 ; c < 5 ; c++ )
{
iniziale->stradat[c] = malloc(sizeof(struct strada));
iniziale->stradat[c]->nome = c;
iniziale->stradat[c]->attesa = malloc(sizeof(struct coda ));
iniziale->stradat[c]->attesa->collegamento = malloc(sizeof(struct coda));
}
iniziale->rotat_ist = crearotatoria();
FILE* file = fopen ("macchine.txt","r");
if ( !file )
{
//qui sarebbe carino liberare la memoria
fputs ("File impossibile da aprire\n",stderr);
return -1;
}
while( !feof(file) )
{
if ( (fscanf(file,"%d" ,&targa)>=0) &&(fscanf(file,"%d",&posizione_e)>=0) && (fscanf(file,"%d",&strada_u)>=0))
{
if ( (posizione_e >= 0) && (posizione_e < 15) && (cont_macc_rot <= 15) && (targa != 0))
{
printf("\n%d",posizione_e);
if( !metti_in_rotonda(iniziale->rotat_ist, targa, posizione_e, strada_u ) )
printf("macchina con targa: %d non inserita perche la posizione %d e' gia' occupata",targa,posizione_e);
else
cont_macc_rot++;
}
if( (posizione_e >= 15) && (posizione_e < 19) && (targa != 0))
{
switch(posizione_e)
{
case 15:
iniziale->stradat[0]->attesa = ins_coda(iniziale->stradat[0]->attesa,targa,strada_u);
break;
case 16:
iniziale->stradat[1]->attesa = ins_coda(iniziale->stradat[1]->attesa,targa,strada_u);
break;
case 17:
iniziale->stradat[2]->attesa = ins_coda(iniziale->stradat[2]->attesa,targa,strada_u);
break;
case 18:
iniziale->stradat[3]->attesa= ins_coda(iniziale->stradat[3]->attesa,targa,strada_u);
break;
case 19:
iniziale->stradat[4]->attesa = ins_coda(iniziale->stradat[4]->attesa,targa,strada_u);
break;
}
}
}//if read scanf
}//while
printf("\n");
fclose(file);
return 0;
}
Il codice cosi è corretto.
Non ho controllato però la logica del programma,ovvero ho tolto solo gli errori di programmazione ma non quelli di logica perchè non conosco cosa debba fare il programma,e il contenuto del file.La logica che usi è un pò contorta ma come detto non conoscendo l'esercizio è difficile valutare.
Se continua a non funzionare allora dovrai spiegare cosa deve fare il programma e cosa contiene il file.