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;
}