Buongiorno,
esercitandomi per un esame ho riscontrato un problema nella compilazione di un programma per quanto riguarda la funzione "
newlist" presente nel codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define DIM 20
struct persona
{
char cognome[DIM];
char nome[DIM];
int matricola;
char esame[DIM];
int crediti;
int voto;
struct persona *next;
};
struct element
{
struct persona data;
struct element *next;
};
typedef struct element node;
typedef node *list;
list newnode()
{
return malloc(sizeof(node));
}
list buildlist() //funzione che crea una lista con elementi da file
{
FILE *fp;
list head = NULL, tail = NULL;
char c[DIM], n[DIM], e[DIM];
int m, cr, v;
int i;
fp = fopen("input-esame.txt", "r");
if(fp != NULL)
{
i = 0;
while(feof(fp) == 0)
{
fscanf(fp, "%s %s %d %s %d %d", &c, &n, &m, &e, &cr, &v);
if(i==0)
{
head = newnode();
strcpy(head->data.cognome, c);
strcpy(head->data.nome, n);
head->data.matricola = m;
strcpy(head->data.esame, e);
head->data.crediti = cr;
head->data.voto = v;
tail= head;
i++;
}
else
{
tail->next = newnode();
tail = tail->next;
strcpy(tail->data.cognome, c);
strcpy(tail->data.nome, n);
tail->data.matricola = m;
strcpy(tail->data.esame, e);
tail->data.crediti = cr;
tail->data.voto = v;
i++;
}
}
tail->next = NULL;
fclose(fp);
}
else
printf("Errore: file non trovato.\n");
return head;
}
void printlist(list l1) //funzione ricorsiva che stampa la lista
{
if(l1 != NULL)
{
printf("%s %s %d %s %d %d\n", l1->data.cognome, l1->data.nome, l1->data.matricola, l1->data.esame, l1->data.crediti, l1->data.voto);
printlist(l1->next);
}
}
int printcredits(list l1, int m, int sum) /*funzione ricorsiva che stampa la media dei crediti di una data matricola*/
{
if(l1 != NULL)
{
if(l1->data.matricola == m)
{
sum = sum + l1->data.crediti;
printcredits(l1->next, m, sum);
}
else
printcredits(l1->next, m, sum);
}
else
return sum;
}
list newlist(list *l1, char c[])
{
list head = NULL, tail = NULL;
list d;
if(*l1 != NULL)
{
if(*l1->data.cognome == c) **
{
list p = newnode();
p->data = *l1->data; **
p->next = NULL;
if(head == NULL)
{
head = p;
tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
*l1 = *l1->next; **
}
while(*l1!= NULL)
{
if(*l1->data.cognome != c) **
{
d = *l1;
*l1 = *l1->next; **
free(d);
}
}
return head;
}
int main()
{
list l1, l2;
int m, sum;
char c[20];
l1 = buildlist();
printlist(l1);
printf("Inserire matricola di cui visualizzare i crediti: ");
scanf("%d", &m);
sum = printcredits(l1, m, 0);
printf("Totale crediti: %d\n", sum);
printf("Inserire cognome da cercare:\t");
scanf("%s", c);
l2 = newlist(&l1, c);
printlist(l2);
}
In particolare l'errore è "Request for member 'data' in something not a structure or union" ed è presente nelle righe di codice segnate con **.
La funzione in questione deve creare una lista solo con i dati di uno studente (il cui cognome viene dato in input) e successivamente rimuovere gli stessi dati dalla prima lista data in input. Suppongo di stare sbagliando a gestire la lista passata per riferimento ma non capisco come risolvere il problema (ho anche dei dubbi sulla correttezza logica del codice). La funzione deve essere iterativa e non ricorsiva.
Le altre funzioni non presentano errori e funzionano correttamente.