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