Lista di liste

di il
2 risposte

Lista di liste

Sera a tutti. Stavo cimentandomi su un esercizio di lista di liste ma non riesco a capire dove sia il problema ne se le strutture con le rispettive funzioni sono correttamente implementate. Ho provveduto solo a caricamento da file, inserimento (per il momento non ho inserito la funzione in menu) e stampa. il testo è questo

Scrivere un programma che implementa una lista di attesa per le attività sportive fornite da una palestra.
La struttura dati da implementare è una lista di liste in cui la lista più esterna contiene le informazioni relative all'attività
sportiva e la lista interna l'anagrafica dell'utente.
I dati richiesti per l'attività sportiva sono: nome (stringa), durata (intero), codice (stringa)
I dati richiesti per l'utente sono: nome (stringa), età (intero), codice della prenotazione (stringa)

un esempio dei dati :
attivita:
123456 codice
2 durata (in ore)
Zumba nome (senza spazi bianchi nel mezzo)
prenotazione
123456 Codice dell'attività sportiva per identificare la lista dove inserire la prenotazione
0011 codice della prenotazione (unico)
paperino_paolino nome (senza spazi bianchi nel mezzo)
35 età


il codice:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define len 40

typedef struct s_utente{
	char nome_utente[len],codice[len],prenot[len];
	int eta;
}utente;

typedef struct s_nodo_utente{
	utente info;
	struct s_nodo_utente *next;
}nodo_utente;

typedef nodo_utente *lista_utente;

typedef struct s_attivita{
	char nome_att[len],codice[len];
	int durata;
}attivita;

typedef struct s_nodo_attivita{
	attivita info;
	lista_utente *punt_interno;
	struct s_nodo_attivita *next;
}nodo_attivita;

typedef nodo_attivita *lista_attivita;

void inserimento_utente(lista_utente *lis, utente u){
	lista_utente aux;
	aux=(lista_utente)malloc(sizeof(nodo_utente));
	aux->info=u;
	aux->next=(*lis);
	aux=(*lis);
}

void inserimento_attivita(lista_attivita *lis, attivita a){
	lista_attivita paux;
	paux=(lista_attivita)malloc(sizeof(nodo_attivita));
	paux->info=a;
	paux->punt_interno=NULL;
	paux->next=(*lis);
	paux=(*lis);
}

nodo_attivita *ricerca_attivita(lista_attivita lis, char *codice){
	lista_attivita aux=lis;
	while(aux!=NULL){
		if( strcmp(codice,aux->info.codice)==0) return aux;
		aux=aux->next;
	}
	return NULL;
}


int caricamento_utenti(lista_attivita *lis){
	FILE *fp;
	char codice_identita[len];
	nodo_attivita * p_nodo_utente=NULL;
	utente u;
	
	fp=fopen("utenti.txt","r");
	if(fp==NULL){
		perror("");
		exit(1);
		return 0;
	}
	while( fscanf(fp,"%s\n%s\n%s\n%d",codice_identita,u.nome_utente,u.prenot,&u.eta) != EOF){
		p_nodo_utente=ricerca_attivita(lis,codice_identita);
		if(p_nodo_utente!=NULL){
			fprintf(stderr, "\nL'utente %s è gia presente in questa attività.\n",codice_identita);
		}
		else inserimento_utente((&(p_nodo_utente->punt_interno)),u);
	}
	fclose(fp);
}

int caricamento_attivita(lista_attivita *lis){
 FILE *fp;
 attivita a;
 fp=fopen("attivita.txt","r");
 if(fp==NULL){
	 perror("");
	 exit(1);
 }
 while(fscanf(fp,"%s\n%d\n%s",a.codice,a.durata,a.nome_att)!=EOF){
	 inserimento_attivita(lis,a);
 }
 fclose(fp);
}

void stampa_utente(lista_utente lis){
	lista_utente aux=lis;
	while(aux!=NULL){
		printf("\n>>>Prenotazione: %s ", aux->info.prenot);
		printf("\n>>>Nome: %s",aux->info.nome_utente);
		printf("\n>>>Eta: %d",aux->info.eta);
	aux=aux->next;
	}
}

void stampa_struttura(lista_attivita lis){
	lista_attivita aux=lis;
	while(aux !=NULL){
		printf("\nCodice: %s",aux->info.codice);
		printf("\nDurata: %d", aux->info.durata);
		printf("\nNome attivita: %s",aux->info.nome_att);
		stampa_utente(aux->punt_interno);
		aux=aux->next;
	}
	}


int main(){
	char testo[len];
	lista_attivita lista_attivita=NULL;
	lista_utente lista_utente=NULL;
	utente u;
	attivita a;
	int scelta;

	do{
		printf("\n1)Caricamento");
		printf("\n2)Inserimento");
		printf("\n3)Stampa");
		printf("\n0)Uscita");
		printf("\n\n\t>>Scelta: ");
		scanf("%d",&scelta);
		switch(scelta){
		case 1: caricamento_attivita(&lista_attivita);
				caricamento_utenti(&lista_utente);
				break;
		case 3: stampa_struttura(lista_attivita);
			break;
		}
	}while(scelta!=0);
}
Suggerimenti?

2 Risposte

  • Re: Lista di liste

    L'unica cosa che non hai descritto è il problema
  • Re: Lista di liste

    Hai ragione rettifico
    1) non so se l'implementazione della struttura è corretta (una lista dove ogni nodo contiene una lista)
    2) Carico da file (il caricamento richiama l'inserimento, quindi se è giusto l'inserimento, dovrebbe esserlo anche il caricamento) ma quando stampo ottengo solo la lista primaria(esterna) mentre vorrei

    Codice attivita: 123456
    Ore: 2
    Nome: Zumba

    >>>Nome Utente: Pincopanco
    >>>Eta: 21
    >>>Codice Prenotazio: 11122

    e cosi via. Ho modificato il codice penso adesso sia piu..."pulito".

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define len 40
    
    typedef struct s_utente{
    	char nome_utente[len],codice[len],prenot[len];
    	int eta;
    }utente;
    
    typedef struct s_nodo_utente{
    	utente info;
    	struct s_nodo_utente *next;
    }nodo_utente;
    
    typedef nodo_utente *lista_utente;
    
    typedef struct s_attivita{
    	char nome_att[len],codice[len];
    	int durata;
    }attivita;
    
    typedef struct s_nodo_attivita{
    	attivita info;
    	lista_utente *punt_interno;
    	struct s_nodo_attivita *next;
    }nodo_attivita;
    
    typedef nodo_attivita *lista_attivita;
    
    lista_attivita inserimento_attivita(lista_attivita *lis, attivita a){
    	lista_attivita aux=NULL;
    	aux=(nodo_attivita*)malloc(sizeof(nodo_attivita));
    	aux->punt_interno=NULL;
    	aux->info=a;
    	aux->next=*lis;
    	*lis=aux;
    	return *lis;
    }
    
    void inserimento_utente(lista_utente *lis,utente u){
    	lista_utente aux;
    	aux=(nodo_utente*)malloc(sizeof(nodo_utente));
    	aux->info=u;
    	aux->next=*lis;
    	*lis=aux;
    }
    
    nodo_utente *ricerca(lista_utente lis, char *codice){
    	lista_utente aux;
    	aux=lis;
    	while(aux!=NULL){
    		if(strcmp(aux->info.codice,codice)==0) return aux;
    		aux=aux->next;
    	}
    	return NULL;
    }
    
    
    int caricamento_utente(lista_utente *lis){
    	utente u;
    	nodo_utente * p_nodo_utente=NULL;
    	FILE *fp;
    	fp=fopen("utenti.txt","r");
    	if(fp==NULL){
    		perror("");
    		exit(1);
    	}
    	while(fscanf(fp,"%s%s%s%d",u.codice,u.prenot,u.nome_utente,&u.eta) != EOF){
    		p_nodo_utente = ricerca(*lis,u.codice);
    		
    		if(p_nodo_utente!=NULL) inserimento_utente((&p_nodo_utente),u);
    	}
    	fclose(fp);
    }
    
    int caricamento_attivita(lista_attivita *lis){
    	FILE *fp;
    	attivita a;
    	fp=fopen("attivita.txt","r");
    	if(fp==NULL){
    		perror("");
    		exit(1);
    	}
    	while( fscanf(fp,"%s%d%s",a.codice,&a.durata,a.nome_att)!= EOF){
    		inserimento_attivita(lis,a);
    	}
    	fclose(fp);
    }
    
    void stampa_utente(lista_utente lis){
    	lista_utente aux=lis;
    	while(aux!=NULL){
    		printf("\n>>>Codice Prenotazione: %s ", aux->info.prenot);
    		printf("\n>>>Nome: %s ", aux->info.prenot);
    		printf("\n>>>Eta: %d ", aux->info.eta);
    		printf("\n");
    		aux=aux->next;
    	}
    }
    
    lista_attivita stampa_struttura(lista_attivita lis){
    	lista_attivita aux=lis;
    	while (aux != NULL){
    		printf("\n\nCodice: %s", aux->info.codice);
    		printf("\nDurata: %d", aux->info.durata);
    		printf("\nNome: %s\n",aux->info.nome_att);
    		stampa_utente(aux->punt_interno);
    		aux = aux->next;
    	}
    	return aux;
    }
    
    
    
    
    
    
    
    int main(){
    	char testo[len];
    	lista_attivita lista_attivita=NULL;
    	lista_utente lista_utente=NULL;
    	utente u;
    	attivita a;
    	int scelta;
    
    	do{
    		printf("\n1)Caricamento");
    		printf("\n2)Inserimento");
    		printf("\n3)Stampa");
    		printf("\n0)Uscita");
    		printf("\n\n\t>>Scelta: ");
    		scanf("%d",&scelta);
    		switch(scelta){
    		case 1: caricamento_attivita(&lista_attivita);
    				caricamento_utente(&lista_utente);
    				break;
    		case 3: stampa_struttura(lista_attivita);
    			break;
    		}
    	}while(scelta!=0);
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte