Errore "Request for member in something not a structure"

di il
2 risposte

Errore "Request for member in something not a structure"

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.

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte