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

Rispondi quotando