Ciao ragazzi, avrei bisogno di un aiutino.. Il mio scopo è quello di creare una lista che memorizza varie stringhe. Quindi ho un menu che fa selezionare all'utente se inserire la stringa, stampare la lista completa o uscire dal programma. Io ho tirato giù tutto il codice ma al momento che il programma va ad inserire la stringa in memoria mi da errore di segmentazione. Intuisco che sia un problema di allocazione di memoria, ma non riesco proprio a capire dove sbaglio.. non so da quanto è che ci sbatto la testa . Sono nuovo nel forum chiudo scusa in anticipo se sbaglio sezione.
Grazie in anticipo.

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

#define MAX 30


        /* STRUTTURA DATI */


    struct listNode {
        char *stringa;
        struct listNode *next;
    };
    typedef struct listNode ListNode;
    typedef ListNode *List;


        /* PROTOTIPI DI FUNZIONI */


    int menu ();
    List Inserimento (List , char *);
    void Stampa (List );


        /* * * * * * * * * * * * */


    int main (int argc, char *argv[]) {


    int scelta;
    char item[MAX];
    List lista=NULL;
        while (scelta=menu()) {
            switch (scelta) {
                case 1:
                printf("Inserisci stringa\n");
                scanf(" %[^\n]", item);
                lista=Inserimento (lista,item);
                break;


                case 2:
                Stampa(lista);
                break;


                case 0:
                exit(1);
                break;
            }
        }
    free(lista);
    return 0;
    }




        /* DEFINIZIONI DI FUNZIONI */


    int menu() {
    int choice;
    printf("Cosa vuoi fare..\n");
    printf("[1] Inserisci in lista\n");
    printf("[2] Stampa lista\n");
    printf("[0] Esci\n");
    scanf("%d", &choice);
    return choice;
    }


    List Inserimento (List lista, char *item) {
    List newnode;
    
        if(lista==NULL) {
            lista=malloc((strlen(item)+1)*sizeof(char));
            newnode=lista;
        }
        else {
            newnode->next=malloc((strlen(item)+1)*sizeof(char));
            newnode=newnode->next;
        }
    strcpy(newnode->stringa,item);
    newnode->next=NULL;
    return lista;
    }


    void Stampa (List lista) {
    List curr;
    curr=lista;
        while (curr!=NULL){
            printf ("%s ", curr->stringa);
            curr=curr->next;
        }
    }