Ciao a tutti!
Un esercizio di programmazione chiede di implementare due funzioni: la prima ricorsiva per eliminare certi elementi da una lista secondo una data condizione, la seconda iteritiva, sempre per eliminare altri elementi.
Ho scritto questo codice ma mi dà due problemi:
se devo eliminare il primo elemento va in segmentation fault e quando stampo, stampa solo l'ultimo elemento della lista.
Riuscite a trovare dove sbaglio?
codice:
typedef struct partecipante {
   char nome;
   int laurea;
   int pubblicazioni;
   struct partecipante *next;
} partecipante;

void eliminacandidatiric (partecipante **lista){
    partecipante *aux;
if (*lista!=NULL){if ((*lista)->laurea==0) {aux=*lista;
                                           *lista=(*lista)->next;
                                           free(aux);
                                            eliminacandidatiric(lista);}
                  else eliminacandidatiric(&((*lista)->next));}
}

void shortlist(partecipante **lista){
   partecipante *corr;
   partecipante *prec;
   partecipante *aux;
if (*lista!=NULL) {while ((*lista)->pubblicazioni<3){aux=*lista;
                                                     *lista=(*lista)->next;
                                                     free(aux);}
                   if (*lista!=NULL){prec=*lista;
                                     corr=prec->next;
                                     while (corr!=NULL) {if (corr->pubblicazioni<3){prec->next=corr->next;
                                                                                    free(corr);
                                                                                    corr=prec->next;}
                                                         else {prec=prec->next;
                                                               corr=corr->next;}
                                                         } 
                                      }
                   }
}

void stampa(partecipante *lista1){
   partecipante *aux;
aux=lista1;
while (aux!=NULL){printf("(%c,%d,%d) ",aux->nome, aux->laurea, aux->pubblicazioni);
                  aux=aux->next;}
}

partecipante * crealista(){
   char risp1;
   char risp2;
   partecipante *inizio;
   partecipante *aux;
printf("La lista è vuota?\n");
scanf(" %c", &risp1);
if (risp1=='y') return NULL;
else {inizio=malloc(sizeof(partecipante));
      printf("Inserisci il nome\n");
      scanf(" %c", &inizio->nome); 
      printf("E' laureato?\n");
      scanf("%d",&inizio->laurea);
      printf("Quanti testi ha pubblicato?\n");
      scanf("%d", &inizio->pubblicazioni);
      aux=inizio;}
printf("Ci sono altri elementi? y or n?\n");
scanf(" %c", &risp2);
while (risp2!='n'){aux->next=malloc(sizeof(partecipante));
                   aux=aux->next;
                   printf("Inserisci il nome\n");
                   scanf(" %c", &inizio->nome); 
                   printf("E' laureato?\n");
                   scanf("%d",&inizio->laurea);
                   printf("Quanti testi ha pubblicato?\n");
                   scanf("%d", &inizio->pubblicazioni);
                   printf("Ci sono altri elementi? y or n?\n");
                   scanf(" %c", &risp2);}
aux->next=NULL;
return inizio;}