ciao a tutti, sto cercando di risolvere la 3funzione di questo compito :
- una funzione che riceve un nuovo elemento (cognome, nome) e il codice del volo; se il numero di posti disponibili del volo è maggiore di zero, la funzione deve effettuare l'inserimento del cognome e nome nella lista delle prenotazioni o degli acquisti, a secondo della richiesta del cliente (si può passare un parametro formale o chiedere direttamente al cliente se vuole fare una prenotazione o un acquisto). In ogni caso il numero dei posti disponibili deve essere decrementato di uno, dopo aver fatto l'inserimento in una delle 2 liste.

codice:
/*COMPITO 10 SETTEMBRE 2012*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FLUSH while(getchar()!='\n')

/*****tipobaseList*******/
#define STR 20
typedef struct{
        char cognome[STR], nome[STR];
}tipobaseList;

int Confronta(tipobaseList a, tipobaseList b){
    if(!strcmp(a.cognome,b.cognome)) 
         return(strcmp(a.nome, b.nome));
    else return(strcmp(a.cognome, b.cognome));     
}

void LeggiStringa(char s[],unsigned long dim){
     unsigned long i=0;
     for (i=0; i<dim-1; i++)
     if ((s[i]=getchar())=='\n') break;
     if (i==dim-1) while (getchar()!='\n');
     s[i]='\0';
}

void LeggiElemento(tipobaseList *x){
     printf("\nInserisci cognome:");
     LeggiStringa(x->cognome,STR);
     printf("\nInserici nome:");
     LeggiStringa(x->nome,STR);
}


/********list*************/
#define LISTAVUOTA NULL

typedef struct nodoList{
       tipobaseList info;
       struct nodoList *next;
} *list;

typedef short boolean;
typedef list position;

void MakeNullList(list *l){
     *l=LISTAVUOTA;
}

boolean EmptyList(list l){
        return(l==LISTAVUOTA);
}

boolean  FullList(list l){
       return(0);
}

position End(list l){
        if(l==LISTAVUOTA) return(LISTAVUOTA);
        while(l->next!=LISTAVUOTA)
              l=l->next;
        return(l);
}

position First(list l){
         return(LISTAVUOTA);
}

void InsertList(list *l, position p,tipobaseList x){
     struct nodoList *tmp;
     if(!FullList(*l)){
                   tmp=(struct nodoList *) malloc(sizeof(struct nodoList));
                   tmp->info=x;
                   if(p==LISTAVUOTA){
                                     tmp->next=*l;
                                     *l=tmp;
                   }else{
                         tmp->next=p->next;
                         p->next=tmp;
                   }
     }
}

void DeleteList(list *l, position p){
     struct nodoList *tmp;
     if(p==LISTAVUOTA){
                       tmp=(*l)->next;
                       free(*l);
                       *l=tmp;
     }else {
           tmp=p->next;
           p->next=tmp->next;
           free(tmp);
     }
}

position Next(list l, position p){
         if(p==LISTAVUOTA) return(l);
         else return(p->next);
}

tipobaseList Retrieve(list l, position p){
             if(l==LISTAVUOTA) return(l->info);
             else return(l->next->info);
}

position Locate(list l, tipobaseList x){
         if(!EmptyList(l)){
                if(!Confronta(l->info,x)) return(LISTAVUOTA);
                while(l->next!=LISTAVUOTA){
                       if(!Confronta(l->next->info,x)) return(l);
                       l=l->next;                    
                } 
                return(l);           
         }
}

/*****archivio*******/
typedef struct{
        unsigned int posti_disponibili;
        list posti_acquistati;
        list posti_prenotati;
}archivio;
archivio *archivio_voli;


void AllocaVettore(archivio **, unsigned int );
void InizializzaVettore(archivio *, unsigned int);
void Insord(list *,tipobaseList);
void InserimentoPrenotazione(list *, tipobaseList);
void InserimentoAcquisto(list *, tipobaseList);
void Inserisci(archivio *, tipobaseList, unsigned int);



main (){
     unsigned int n,v, scelta;
     tipobaseList persona;
     
      do{
        printf("\n/**********ARCHIVIO VOLI***************/");
        printf("\n1-Alloca Vettore");
        printf("\n2-Numero posti disponibili");
        printf("\n3-Inserimento");
        printf("\n4-Conferma acquisto");
        printf("\n5-Esci");
        printf("\nscelta--------------->");
        scanf("%u", &scelta);
        FLUSH;
        switch(scelta){
                   case 1: do{
                              printf("\nInserisci il numero di elementi del vettore: ");
                              scanf("%u",&n);
                              FLUSH;
                           }while(n<2); 
                           AllocaVettore(&archivio_voli, n);
                           break;
                   case 2: InizializzaVettore(archivio_voli, n);
                           break;
                   case 3: LeggiElemento(&persona); 
                           Inserisci(&archivio_voli[v], persona, n);
                           break;  
                   case 4: LeggiElemento(&persona);
        }
      }while(scelta<4);
}



void AllocaVettore(archivio **x, unsigned int n){
     *x=(archivio *)malloc(n*sizeof(archivio));
}

void InizializzaVettore(archivio *x, unsigned int n){
     unsigned int i=0, s=0;
     for(i=0; i<n; i++){
        printf("Numero posti disponibili del volo <%u> ? ", i);
        scanf("%u", &s);
        FLUSH;
        (x+i)->posti_disponibili=s;
        MakeNullList(&((x+i)->posti_acquistati));
        MakeNullList(&((x+i)->posti_prenotati));
     }
}

void Insord(list *l,tipobaseList x){
     position p,u;
     tipobaseList tmp;
     if(EmptyList(*l))
           InsertList(l,First(*l),x);
     else {
          p=First(*l);
          u=End(*l);
          while(p!=u) {
                      tmp=Retrieve(*l,p);
                      if(Confronta(tmp,x)<0) p=Next(*l,p);
                      else break;
          }
          InsertList(l,p,x);
     }
}

void InserimentoPrenotazione(list *l,tipobaseList a){
     position p;
     if(!EmptyList(*l)) p=Locate(*l,a);
     if(EmptyList(*l) && p==End(*l)){
     Insord(l,a);
     } else printf("\nPasseggero gia' presente");
}

void InserimentoAcquisto(list *l,tipobaseList a){
     position p;
     if(!EmptyList(*l)) p=Locate(*l,a);
     if(EmptyList(*l) && p==End(*l)){
     Insord(l,a);
     } else printf("\nPasseggero gia' presente");
}

void Inserisci(archivio *x, tipobaseList a, unsigned int n){
     unsigned int v, c;
     do{
        printf("\nCodice volo? ");
        scanf("%u", &v);
        FLUSH;
        if(v>n) printf("\nCodice volo errato, riprova\n");
     }while(v>n) ;
      printf("posti %u", (x+v)->posti_disponibili);
     if((x+v)->posti_disponibili>0){
                         printf("\n1-prenota ");
                         printf("2-acquista ");
                         scanf("%u", &c);
                         FLUSH;
                         if(c==1) InserimentoPrenotazione(&((x+v)->posti_prenotati), a);
                         if(c==2) InserimentoAcquisto(&((x+v)->posti_acquistati), a);
                         (x+v)->posti_disponibili--;
     }else if((x+v)->posti_disponibili=0)(printf("\nNumero posti disponibili esaurito"));
}
nella funzione inserisci quando vado a fare la scelta tra prenota o acquista si blocca il programma, inoltre quando faccio stampare il numero di posti disponibili del relativo volo mi da un numero errato
codice:
printf("posti %u", (x+v)->posti_disponibili);