Ciao ragazzi,
sono alle prese con la programmazione in c e ho qualche problema con la funzione stampa nella lista di liste.
Il debug mi dice che c'è un errore di segmentazione e se provo ad eseguirlo si crasha!!
mi sapete aiutare???

vi posto il codice:

codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 30
#define fcentraline "centraline.txt"

typedef struct Atomodati{
      int ora;
      int min;
      char data[LEN];
      float temp;
      float press;
      float umid;
}Atomodati,Tatomodati;

typedef struct Lista_dati{
        Atomodati dato;
        struct Lista_dati *succ;
}Lista_dati,*Tlista_dati;

typedef struct Atomocentraline{
        int id;
        char ubicazione[LEN];
        int tipo;
        Tlista_dati dati_ril;
}Atomocentraline,Tatomocentraline;

typedef struct Lista_centraline{
        Atomocentraline dato;
        struct Lista_centraline *succ;
}Lista_centraline,*Tlista_centraline;

void cons(Tlista_centraline *l,Atomocentraline e)
{
     Tlista_centraline tmp;
     tmp=(Tlista_centraline)malloc(sizeof(Lista_centraline));
     
     if(tmp==NULL)
     {
                  printf("errore 1 \n");
                  system("pause");
                  exit(-1);
     }
     
     tmp->dato=e;
     tmp->succ=*l;
     (*l)=tmp;
}
void cons2(Tlista_dati *l,Atomodati e)
{
     Tlista_dati tmp;
     tmp=(Tlista_dati)malloc(sizeof(Lista_dati));
     
     if(tmp==NULL)
     {
                  printf("errore 2 \n");
                  system("pause");
                  exit(-1);
     }
     
     tmp->dato=e;
     tmp->succ=*l;
     (*l)=tmp;
}


void insord_dati(Tlista_dati *l,Atomodati e)
{
     if(((*l)==NULL)||(strcmp((*l)->dato.data,e.data)<0)) cons2 (l,e);
     else insord_dati(&(*l)->succ,e);
}

void insord_centraline(Tlista_centraline *l,Atomocentraline e)
{
     if(((*l)==NULL)||((*l)->dato.id<e.id)) cons (l,e);
     else insord_centraline(&(*l)->succ,e);
}

void carica_lista(Tlista_centraline *l)
{
     Atomocentraline c;
     Atomodati d;
     FILE *fp;
     
     fp=fopen (fcentraline,"r");
     while (fscanf(fp,"%d",&c.id)!=EOF)
     {
           fgets(c.ubicazione,LEN,fp);
           c.ubicazione[strlen(c.ubicazione)-1]='\0';
           fscanf(fp,"%d",&c.tipo);
           c.dati_ril=NULL;
           cons (l,c);
           while(fscanf(fp,"%d",&d.ora)!=EOF)
           {
               fscanf(fp,"%d",&d.min);
               fgets(d.data,LEN,fp);
               d.data[strlen(d.data)-1]='\0';
               fscanf(fp,"%f",&d.temp);
               fscanf(fp,"%f",&d.press);
               fscanf(fp,"%f",&d.umid);
               cons2(&((*l)->dato.dati_ril),d);
           }
     }printf("liste caricate\n");
          fclose(fp);
}

//data id e ora stampare tutte le ubicazioni 

void stampa (Tlista_centraline l) {
	int x,y;
	Tlista_dati tmp;
	printf ("inserisci id\n");
	scanf ("%d",&x);
	printf ("inserisci ora\n");
	scanf ("%d",&y);
	while (l!=NULL) {
		tmp=l->dato.dati_ril;
		if (l->dato.id==x && tmp->dato.ora==y)
			printf ("ecco le ubicazioni che cercavi %d",l->dato.ubicazione);
		l=l->succ;
	}
}

int main()
{
    
    Tlista_dati ld;
    Tlista_centraline lc;
    carica_lista(&lc);
    stampa(ld);
    system("pause");
    return 0;
}
Formattazione codice aggiunta da Alka