Salve sono uno studente universitario alle prime armi con il linguaggio C. Dato che a breve dovrò sostenere un esame stavo cercando di esercitarmi svolgendo un programma in grado di gestire un archivio di un azienda attraverso una lista dinamica che prende i dati dal file. Il programma dovrà avere le funzioni che permettono di inizializzare la lista con i dati del file, stamparla e effettuare qualche ricerca, il mio problema è che quando compilo ed eseguo, provando ad inizializzare la lista il compilatore mi dice "Segmentation falut (core drumped). Potete aiutarmi? Metto qui sotto i codice
codice:
FILE DI HEADER

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


#define LUN 11
#define MAX 10
#define DIM 20
#define CAT 2


typedef struct{


    char piva[LUN];
    char r_sociale[DIM];
    char cognome[DIM];
    char nome[DIM];
    char tel[MAX];
    char fax[MAX];
    char email[DIM];
    char categoria[CAT];
    char acquisti_anno[MAX];


}data;




struct nodo{


    data info;
    struct nodo *next;


};


typedef struct nodo tlista;




tlista *inizializza (char *, tlista*);
void salva (char *, tlista*);
void stampa_aziende(tlista*);
void stampa_a(tlista*);
tlista *inserisci(tlista*);
void determina_b(tlista*);
codice:
FILE SORGENTE

#include "data.h"


int main(){


    int input;
    tlista *p = NULL;


    for(;;)
    {
        printf("----------MENU----------\n");
        printf("Scegli qello che vuoi fare.\n");
        printf("1) Inizializza la lista.\n");
        printf("2) Salva.\n");
        printf("3) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel di tutte le aziende presenti in archivio\n");
        printf("4) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel delle aziendeappartenenti alla categoria 'A'\n");
        printf("5) Inserire una nuova azienda\n");
        printf("6) Determinare il numero delle aziende che appartengono alla categoria 'B' e che presentano un valore di AcquistiAnno superiore a 100000 €\n");
        //printf("7) ");
        scanf("%d",&input);


    if (input==1){


        p=inizializza("archivio.txt",p);
    }
    else if (input==2){


        salva("archivio.txt",p);
    }
    else if (input==3){


        stampa_aziende(p);
    }
    else if (input==4){


        stampa_a(p);
    }
    else if (input==5){


        p=inserisci(p);
    }/*
    else if (input==6){


        determina_b(p);
    }*/
    else
    {
        break;
    }
}
}
codice:
FILE SORGENTE IN CUI IMPLEMENTO LE FUNZIONI

#include "data.h"


tlista *inizializza (char *nomefile, tlista *p){
    data elem;
    tlista *newElem;
    FILE *fp;


        if((fp=open(nomefile,"r"))!=NULL){
            while(fscanf(fp,"%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n\n]\n", elem.piva, &(elem.r_sociale), &(elem.cognome), &(elem.nome), &(elem.tel), &(elem.fax), &(elem.email), &(elem.categoria), &(elem.acquisti_anno))!=EOF){
        newElem = (tlista*) malloc (sizeof(tlista));
        newElem->info = elem;
        newElem->next = p;
        p = newElem;
            }
        }else{
            printf("Errore nell'apertura del file.");
            }
            fclose(fp);
        return p;
            }






void salva (char *nomefile, tlista *p){
    FILE *fp=open(nomefile,"w");


        while(p!=NULL){


            fprintf(fp,"%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n", p->info.piva, p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel, p->info.fax, p->info.email, p->info.categoria, p->info.acquisti_anno);
            p=p->next;
        }
        fflush(fp);
        fclose(fp);


        return;
}


void stampa_aziende(tlista *p){


    if (p==NULL){
        printf("Lista vuota.\n");


    }else{
        while(p!=NULL){
            printf("%s\n,%s\n,%s\n,%s\n",p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
            p=p->next;
        }
    }
}




void stampa_a(tlista *p){


    if (p==NULL){
        printf("Lista vuota.\n");
    }else{
        while (p!=NULL){
            if (p->info.categoria=="A"){
                printf("%s\n,%s\n,%s\n,%s\n", p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
                p=p->next;
            }
        }
    }
}


tlista *inserisci(tlista *p){


    data agg;
    char piva[LUN];
    char r_sociale[DIM];
    char cognome[DIM];
    char nome[DIM];
    char tel[MAX];
    char fax[MAX];
    char email[DIM];
    char categoria[CAT];
    char acquisti_anno[MAX];
    tlista *p2 = NULL;


        printf("Inserisci le info del cliente");
        printf("Inserisci la piva");
        scanf("\n%[^\n]", piva);
        strcpy(agg.piva,piva);


        printf("Inserisci la ragione sociale");
        scanf("\n%[^\n]", r_sociale);
        strcpy(agg.r_sociale, r_sociale);


        printf("Inserisci il cognome");
        scanf("\n%[^\n]", cognome);
        strcpy(agg.cognome, cognome);


        printf("Inserisci il nome");
        scanf("\n%[^\n]", nome);
        strcpy(agg.nome, nome);


        printf("Inserisci il numero di telefono");
        scanf("\n%[^\n]", tel);
        strcpy(agg.tel, tel);


        printf("Inserisci il fax");
        scanf("\n%[^\n]", fax);
        strcpy(agg.fax, fax);


        printf("Inserisci l'email");
        scanf("\n%[^\n]", email);
        strcpy(agg.email, email);


        printf("Inserisci la categoria");
        scanf("\n%[^\n]", categoria);
        strcpy(agg.categoria, categoria);




        printf("Inserisci gli acquisti annuali");
        scanf("\n%[^\n]", acquisti_anno);
        strcpy(agg.acquisti_anno, acquisti_anno);


        if (p!=NULL){
            p2=(tlista*)malloc(sizeof(tlista));
            p2->info=agg;
            p2->next=p;
        }else{


            p=(tlista*)malloc(sizeof(tlista));
            p->next=NULL;
            p2=p;
        }
        return p2;
}

FILE archivio.txt

12345678901
Running s.n.c.
Russo
Salvatore
0901234567
0901231234
info@running.it
A
8500



12345678901
Happening s.r.l.
Todaro
Mario
021234567
021231234
info@happening.com
B
22750