Problema di stampa lista [C]

di il
3 risposte

Problema di stampa lista [C]

Ciao a tutti, ho un problema con un programma C che dovrebbe stamparmi una serie di voti per ogni studente identificato da una matricola.
Il programma compila però dopo che legge i voti non stampa la lista dei voti dello studente.
Sicuramente ci sarà qualcosa che mi sfugge quando cerco di passargli la lista dei voti nella funzione aggiungiStudente richiamando la funzione aggiungiEsame(nuovoStudente->voti). Confido nella vostra bravura e pazienza nel farmi capire dove sbaglio.

Questo è il codice:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct nodoEsame{
		
		int voto;
		struct esame *next;

}nodoEsame;


typedef struct nodoStudente{

	int matricola;
	nodoEsame *voti;
	struct nodoStudente *next;
	
}nodoStudente;



void aggiungiEsame(nodoEsame *le){
	
	
	int voto;
	char risposta;
	
	do{
		
		printf("Inserire il voto dell'esame: ");
		scanf("%d", &voto);
		fflush(stdin);
		
		nodoEsame *nuovoEsame;
		nuovoEsame=(nodoEsame*)malloc(sizeof(nodoEsame));
		nuovoEsame->voto=voto;
		nuovoEsame->next=le;
		
		printf("Vuoi inserire un altro voto?[Y/N]");
		scanf("%c", &risposta);
		fflush(stdin);
}while(risposta=='y' || risposta == 'Y');

}
		
void aggiungiStudente(nodoStudente *ls, int matricola){
	
	nodoStudente *nuovoStudente;
	nuovoStudente=(nodoStudente*)malloc(sizeof(nodoStudente));
	nuovoStudente->matricola=matricola;
	
	nuovoStudente->voti=NULL;//Lista dei voti inizialmente vuota
	
	aggiungiEsame(nuovoStudente->voti);
	
	nuovoStudente->next=ls;
	ls=nuovoStudente;
	
}



void stampaEsame(nodoEsame *listaE){
	
	nodoEsame *elem;
	elem=listaE;
	
	while(elem!=NULL){
		
		printf("%d", elem->voto);
		
		elem=elem->next;
		
	}
	
	
	
}


void stampaStudente(nodoStudente *listaS){
	
	nodoStudente *elem;
	elem=listaS;
	
	while(elem!=NULL){
		
		printf("%d", elem->matricola);
		printf("Voti esami: \n");
		stampaEsame(elem->voti);
		elem=elem->next;
		
	}
	
	
	
}
	
int main(){

	int matr, voto;
	nodoStudente *temp;
	temp=NULL;
	printf("Inserisci il numero di matricola dello studente: \n");
	scanf("%d", &matr);
	fflush(stdin);
	
	aggiungiStudente(temp, matr);
	
	stampaStudente(temp);
	
	system("PAUSE");
	
	return 0;
	
}

3 Risposte

  • Re: Problema di stampa lista [C]

    Il problema principale è che i puntatori che passi alle funzioni devono essere doppi (puntatore a puntatore) altrimenti non li puoi modificare all'interno delle funzioni stesse.
  • Re: Problema di stampa lista [C]

    Grazie innanzitutto per la pronta risposta.
    Ho modificato un po' il programma, non so se ho pasticciato un po' aggiungendo puntatori doppi anche alle funzioni stampa.
    Adesso comunque dopo aggiungiStudenti nel main va avanti alla funzione stampaStudente, però stampa la matricola relativa allo studente immesso ma non la lista dei voti che ho inserito.
    Potresti aiutarmi anche qui a farmi capire dove sbaglio? Ti ringrazio.
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    typedef struct nodoEsame{
    		
    		int voto;
    		struct nodoEsame *next;
    
    }nodoEsame;
    
    
    
    typedef struct nodoStudente{
    
    	int matricola;
    	nodoEsame *voti;
    	struct nodoStudente *next;
    	
    }nodoStudente;
    
    
    
    void aggiungiEsame(nodoEsame **le){
    	
    	
    	int voto;
    	char risposta;
    	
    	do{
    		
    		printf("Inserire il voto dell'esame: ");
    		scanf("%d", &voto);
    		fflush(stdin);
    		
    		nodoEsame *nuovoEsame;
    		nuovoEsame=(nodoEsame*)malloc(sizeof(nodoEsame));
    		nuovoEsame->voto=voto;
    		nuovoEsame->next=*le;
    		
    		printf("Vuoi inserire un altro voto?[Y/N]");
    		scanf("%c", &risposta);
    		fflush(stdin);
    }while(risposta=='y' || risposta == 'Y');
    
    }
    		
    void aggiungiStudente(nodoStudente **ls, int matricola){
    	
    	nodoStudente *nuovoStudente;
    	nuovoStudente=(nodoStudente*)malloc(sizeof(nodoStudente));
    	nuovoStudente->matricola=matricola;
    	
    	nuovoStudente->voti=NULL;//Lista dei voti inizialmente vuota
    	
    	aggiungiEsame(&nuovoStudente->voti);
    	
    	nuovoStudente->next=*ls;
    	*ls=nuovoStudente;
    	
    }
    
    
    
    void stampaEsame(nodoEsame **listaE){
    	
    	nodoEsame *elem;
    	elem=*listaE;
    	
    	while(elem!=NULL){
    		
    		printf("%d", elem->voto);
    		
    		elem=elem->next;
    		
    	}
    	
    	
    	
    }
    
    
    void stampaStudente(nodoStudente **listaS){
    	
    	nodoStudente *elem;
    	elem=*listaS;
    	
    	while(elem!=NULL){
    		
    		printf("%d", elem->matricola);
    		printf("Voti esami: \n");
    		stampaEsame(&elem->voti);
    		elem=elem->next;
    		
    	}
    	
    	
    	
    }
    	
    int main(){
    
    	int matr, voto;
    	nodoStudente *temp;
    	temp=NULL;
    	printf("Inserisci il numero di matricola dello studente: \n");
    	scanf("%d", &matr);
    	fflush(stdin);
    	
    	aggiungiStudente(&temp, matr);
    	
    	stampaStudente(&temp);
    	
    	system("PAUSE");
    	
    	return 0;
    	
    }
    
    
  • Re: Problema di stampa lista [C]

    Ok ho tolto i doppi puntatori alle funzioni di stampa che credo non servano e ho aggiunto
    *le=nuovoEsame;
    dopo
     nuovoEsame->next=*le
    alla funzione aggiungiEsame. Credo che sbagliavo in questo punto e infatti adesso funziona.
Devi accedere o registrarti per scrivere nel forum
3 risposte