Liste di liste in C

di il
1 risposte

Liste di liste in C

Ciao a tutti ragazzi. Ormai, quando ho un problema, mi rivolgo ai miei esperti preferiti
Tornando a noi: ci hanno dato un programma da fare sulle liste di liste... In pratica, dobbiamo gestire le iscrizioni ad una Facoltà. La lista principale dovrà considerare gli anni accademici, la secondaria invece gli studenti, con i loro dati anagrafici e di curriculum. Io ho fatto tutto molto basilare, nel senso che per ora considero solo il nome e il cognome di ciascuno.
Ecco il mio codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CLS system("cls")

struct studente {
	char nome[20];
	char cognome[20];
	int numeroMatricola;
	struct studente *prossimo;
};

struct anno {
	int numero;
	struct anno *next;
	struct studente *elenco;
};

void menu_1()
{
	printf("\nPremi: I - Inserisci anno");
	printf("\nPremi: P - Stampa tutti gli studenti di un anno");
	printf("\nPremi: D - Elimina anno");
	printf("\nPremi: E - Esci dal programma\n");
	printf("\nLa tua scelta >	");
}

void menu_2()
{
	printf("\nPremi: 1 - Inserisci studente");
	printf("\nPremi: 2 - Stampa caratteristiche di uno studente");
	printf("\nPremi: 3 - Elimina studente");
	printf("\nPremi: 4 - Torna al menu principale\n");
	printf("\nLa tua scelta >	");
}

void inserisciAnno(struct anno **insAnno, struct anno *nuovo);
void inserisciStudente(struct studente **insStudente, struct studente *nStud);
void stampaStudenti(struct studente **printStud);
void stampaAnno(struct anno **printYear);

int main()
{
	struct anno *testa = NULL;
	struct anno *temp = NULL;
	struct anno *nuovoAnno = NULL;
	struct studente *nuovoStudente;
	int scelta, scelta2;
	
	while(1)
	{
		menu_1();
		scelta = getch();
		switch(scelta)
		{
			case 'P':
			case 'p':
				CLS;
				stampaAnno(&testa);
				printf("\n\nPremi un tasto per tornare al menu...\n");
				scelta2 = getch();
				CLS;
				break;
			case 'I':
			case 'i':
				CLS;
				inserisciAnno(&testa, nuovoAnno);
				printf("\n\nPremi un tasto per continuare...\n");
				scelta = getch();
				CLS;
				while(1) {
					menu_2();
					scelta2 = getch();
					switch(scelta2)
					{
						case '1':
							CLS;
							inserisciStudente(&(testa->elenco), nuovoStudente);
							printf("\n\nPremi un tasto per tornare al menu...\n");
							scelta2 = getch();
							CLS;
							break;
						case '2':
							CLS;
							stampaStudenti(&(testa->elenco));
							printf("\n\nPremi un tasto per tornare al menu...\n");
							scelta2 = getch();
							CLS;
							break;
						default:
							CLS;
							break;
					}
					int choose;
					CLS;
					printf("\n\nUtente, desideri continuare?\n");
					printf("\nPremi 0 per confermare, 1 per tornare al menu principale\n");
					scanf("%d", &choose);
					CLS;
					if(choose == 1) {
						break;
					}
						
				}
			
			
			
			
			
			
		}	
		
		
		
		
		
		
		
	}
	
	
	
}

void inserisciAnno(struct anno **insAnno, struct anno *nuovo)
{
	int numAnno;

	nuovo = (struct anno*)malloc(sizeof(struct anno));
	printf("\n\nUtente, inserisci l'anno: ");
	scanf("%d", &numAnno);
	nuovo->numero = numAnno;
	nuovo->next = *insAnno;
	*insAnno = nuovo;
}

void inserisciStudente(struct studente **insStudente, struct studente *nStud)
{
	char studNome[20], studCognome[20];
	
	nStud = (struct studente*)malloc(sizeof(struct studente));
	printf("\n\nUtente, inserisci il nome dello studente: ");
	fflush(stdin);
	scanf("%s", studNome);
	printf("\n\nUtente, inserisci il cognome dello studente: ");
	fflush(stdin);
	scanf("%s", studCognome);
	strcpy(nStud->nome, studNome);
	strcpy(nStud->cognome, studCognome);
	nStud->prossimo = *insStudente;
	*insStudente = nStud;
	
}

void stampaStudenti(struct studente **printStud) {
	
	struct studente *temp;
	temp = *printStud;
	while(temp != NULL) 
	{
		printf("\nNome studente: %s", temp->nome);
		printf("\nCognome studente: %s", temp->cognome);
		temp = temp->prossimo;
	}
}

void stampaAnno(struct anno **printYear) {
	int anno;
	struct anno *tmp;
	printf("\n\nUtente, che anno vuoi visualizzare?\n");
	scanf("%d", &anno);
	tmp = *printYear;
	while(tmp != NULL)
	{
		printf("\n\nNome: %s", tmp->elenco->nome);
		printf("\n\nCognome: %s", tmp->elenco->cognome);
		tmp = tmp->next;
	}
}
In sostanza, il problema è questo: inserisco il nome e cognome di uno studente, premo 0 (quindi decido di continuare l'inserimento), poi quando torno al menu principale e vado a stampare tutti gli studenti inseriti di un certo anno lui mi stampa solo l'ultimo (quindi è come se non allocasse abbastanza celle per la lista degli studenti).
Sinceramente questo argomento non mi è molto chiaro, in più sto cercando di prendere confidenza col passaggio di parametri nelle funzioni... Quindi abbiate pazienza

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte