Effettivamente mettendo la pulizia del buffer prima del ciclo for l'immissione torna a essere corretta.
Grazie.
P.S. Il listato completo è questo:
Codice PHP:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct veicolo{
int id;
struct veicolo *next;
};
typedef struct veicolo veicolo_t;
struct codapila{
int num;
veicolo_t *first;
};
typedef struct codapila coda_t, pila_t;
void elimina_veicolo(veicolo_t *temp){
free(temp);
}
coda_t coda_new(){
coda_t result;
result.first = NULL;
result.num = 0;
return result;
}
pila_t pila_new(){
pila_t result;
result.first = NULL;
result.num = 0;
return result;
}
void crea_pila(int arrivo, pila_t *p){
veicolo_t *elem = (veicolo_t *)malloc(sizeof( veicolo_t));
elem->id = arrivo;
elem->next = p->first;
p->first = elem;
p->num++;
}
void crea_coda(int arrivo, coda_t *c){
veicolo_t *elem = (veicolo_t *)malloc(sizeof( veicolo_t));
elem->id = arrivo;
elem->next = NULL;
if(c->num == 0){
c->first = elem;
}
else{
veicolo_t *temp = c->first;
while(temp->next != NULL){
temp = temp->next;
}
temp->next = elem;
}
c->num++;
}
veicolo_t *nuova_coda(coda_t *q){
if(q->num == 0){
return (0);
}
veicolo_t *temp = q->first;
q->first = q->first->next;
q->num--;
return temp;
}
veicolo_t *nuova_pila(pila_t *r){
if(r->num == 0){
return (0);
}
veicolo_t *result= r->first;
r->first = r->first->next;
r->num--;
return result;
}
void stampa_coda(coda_t *cq){
if(cq->num == 0){
printf("La coda è vuota ");
}
else{
veicolo_t *temp = cq->first;
printf("{ ");
while(temp != NULL){
printf("%d", temp->id);
temp = temp->next;
}
printf(" }");
}
}
void stampa_pila(pila_t *pr){
if(pr->num == 0){
printf("La pila è vuota ");
}
else{
veicolo_t *temp = pr->first;
printf("{ ");
while(temp != NULL){
printf("%d", temp->id);
temp = temp->next;
}
printf(" }\n");
}
}
struct traghetto{
coda_t camion;
pila_t automobili;
};
typedef struct traghetto traghetto_t;
traghetto_t trag_new(){
traghetto_t result;
result.camion = coda_new();
result.automobili = pila_new();
return result;
}
void crea_trag(char type, int id, traghetto_t *t){
switch(tolower(type)){
case 'c':
crea_coda(id, &t->camion);
break;
case 'a':
crea_pila(id, &t->automobili);
break;
}
}
veicolo_t* traghetto_next(traghetto_t *serv){
if(serv->camion.num > 0){
return (nuova_coda(&serv->camion));
}
if(serv->automobili.num > 0){
return (nuova_pila(&serv->automobili));
}
return NULL;
}
void stampa_traghetto(traghetto_t *tr){
printf("-> Camion: "); stampa_coda(&tr->camion);
printf("\n-> Automobili: "); stampa_pila(&tr->automobili);
printf("\n");
}
int main()
{
traghetto_t serv = trag_new();
char type;
int i, n, arrivo, num;
veicolo_t *temp;
printf("quanti veicoli vuoi immettere? ");
scanf("%d", &n);
num = 0;
for(i=0; i<n; i++){
printf("immetti carattere :");
while(!getchar()) ;
scanf("%c", &type);
printf("\n");
crea_trag(type, ++num, &serv);
}
printf("Stato del traghetto:\n ");
stampa_traghetto(&serv);
temp = traghetto_next(&serv);
while(temp != NULL){
printf("Sbarco: %d\n", temp->id);
elimina_veicolo(temp);
printf("Stato del traghetto:\n ");
stampa_traghetto(&serv);
temp = traghetto_next(&serv);
}
return 1;
}