Salve.
Sto tentando di elaborare un programma che:
- prenda in input dei nomi
- li inserisca in ordine alfabetico in una lista
-stampi la lista dei nomi inseriti.

Il compilatore però, dopo aver preso il secondo nome, mi dà segmentation fault; perché?

codice:
 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct lista{
	char nome[15];
	struct lista *nextptr;
};
typedef struct lista lista_al;

/*prototipi*/
lista_al *my_alloc(void);
void insert_el(lista_al **sptr);
int disordine(char *ial, char *sal);
void stampa_lista(lista_al *sptr);


int main(){
	int cntr=0;
	lista_al *head=NULL; //all'inizio non ci sono nodi
	insert_el(&head);
	do{
		printf("Per inserire altri elementi,1 to go on, -1 to exit\n");
	    scanf("%d",&cntr);
	    if(cntr!=-1)
	    insert_el(&head);
	}while(cntr!=-1);
	stampa_lista(head);



	return 0;
}

/*definizioni di funzione*/
lista_al *my_alloc(){
	lista_al *p;
	p=(lista_al*)malloc(sizeof(lista_al));
	if(p==NULL){
	   printf("Errore nell'allocazione della memoria.\n");
	   exit(-1);
    }
	return p;
}


void insert_el(lista_al **sptr){
	lista_al *newptr,*scanptr=NULL,*previousPtr=NULL;
	static int j=0;
	int i;
	++j; //contatore numero di elementi inseriti;
	printf("Inserisci nome alunno:\n");
	if(*sptr==NULL){
	   *sptr=my_alloc();
	   scanf("%s",(*sptr)->nome);
	   (*sptr)->nextptr=NULL;
	   printf("Nome primo alunno inserito correttamente\n");
	   return ;
    }
    else{
		i=0;
		newptr=my_alloc();
		scanf("%s",newptr->nome);
		newptr->nextptr=NULL;
		scanptr=*sptr;     //la scansione parte dalla testa della lista
		while((scanptr!=NULL)&&(disordine(newptr->nome,scanptr->nome))) {    //finché non termina la lista, o ha trovato un elemento
		                                                                     //successivo a quello da inserire
		previousPtr=scanptr;
		scanptr=scanptr->nextptr;                                            //continua la scansione
		++i;
	    }
	    newptr->nextptr=scanptr;
	    previousPtr->nextptr=newptr;
	    if((i+1)==j)                                                        //se ho passato in rassegna tutti gli elementi della lista
	    scanptr->nextptr=NULL;                                              //e non ho trovato un nome che venga dopo quello da inserire
	                                                                        //allora il nome appena inserito è l'ultimo della lista
	    printf("Elemento %d inserito correttamente.\n",j);
	    return ;
	}

}





int disordine(char *ial, char *sal){
	int cntr=strcmp(ial,sal);        //ial=alunno da inserire; sal= alunno da passare in Scansione
	if(cntr>0)                       //se l'alunno da inserire viene dopo quello appena esaminato
	return 0;
	else return 1;
}



void stampa_lista(lista_al *sptr){
	lista_al *scanptr;
	for(scanptr=sptr;scanptr!=NULL;scanptr=scanptr->nextptr)
	printf("%s-->",scanptr->nome);
	return;
}