Vai al contenuto

[Linguaggio C] Problema lista di liste


Messaggi raccomandati

Buon pomeriggio a tutti  :ciao:
 
Vorrei creare un programma che mi permetta di inserire una gamma di voti d'esame (dal 18 al 30) e dentro ad ognuno di questi voti inserire i dati degli studenti che hanno preso quel dato voto. Il codice è il seguente, ma dopo la stampa corretta dei nomi inseriti fa altre due stampe indecifrabili e poi crasha...come potrei fare?
 

#include <stdio.h>
#include <stdlib.h>
 
#define CLEAR fpurge(stdin)
 
struct voto {
    
    int voto;
    struct voto *next;
    struct studenti *elenco;
};
 
struct studenti {
    
    char nome[20];
    char cognome[20];
    int matricola;
    struct studenti *next;
};
 
 
void aggiungi_voto(struct voto **testa);
void aggiungi_studente(struct voto **testa);
void stampare_studenti(struct voto *testa);
void menu();
 
int main () {
    
    struct voto *testa = NULL;
    
    int control;
    int input;
    
    do {
        
        menu();
        
        printf("\nInserire un codice: ");
        control = scanf("%d", &input);
        
        CLEAR;
        
        while (control == 0) {
            
            printf("Inserire un codice: ");
            control = scanf("%d", &input);
            
            
            CLEAR;
        }
        
        switch (input) {
                
            case 1:
                
                aggiungi_voto(&testa);
             
                break;
                
            case 2:
                
                aggiungi_studente(&testa);
             
                break;
                
            case 3:
                
                stampare_studenti(testa);
                
                break;
        }
        
        
        
    }while (input != 0);
    
    return 0;
}
 
 
 
void aggiungi_voto(struct voto **testa) {
    
    struct voto *temp;
    struct voto *nuovo;
    
    int voto;
    
    temp = *testa;
    
    nuovo = (struct voto*)malloc(sizeof(struct voto));
    
    if (nuovo == NULL) {
        exit(1);
    }
    
    printf("\nInserire voto lista principale: ");
    scanf("%d", &voto);
    
    while (temp != NULL) {
        
        if (temp->voto == voto) {
            
            printf("\nVoto già inserito.");
            exit(1);
        }
        
        temp = temp->next;
    }
    
    
    nuovo->voto = voto;
    
    nuovo->next = *testa;
    *testa = nuovo;
    
}
    
    
    
void aggiungi_studente(struct voto **testa) {
    
    struct voto *temp;
    struct voto *trovato = NULL;
    struct studenti *nuovo = NULL;
    int voto;
    
    temp = *testa;
    
    printf("\nInserire il voto in cui si vuole inserire lo studente: ");
    scanf("%d", &voto);
    
    
    while (temp != NULL) {
        
        if (temp->voto == voto) {
            
            trovato = temp;
        }
        
        temp = temp->next;
    }
    
    nuovo = (struct studenti*)malloc(sizeof(struct studenti));
    
    printf("\nNome:");
    scanf("%s", nuovo->nome);
    printf("Cognome:");
    scanf("%s",nuovo->cognome);
    printf("Matricola:");
    scanf("%d", &nuovo->matricola);
    CLEAR;
    nuovo->next = trovato->elenco;
    trovato->elenco = nuovo;
    
    
}
 
void stampare_studenti(struct voto *testa) {
    
    
    int voto;
    struct voto *temp;
    struct studenti *ptr = NULL;
 
    temp = testa;
    
    printf("\nInserire il voto di cui si vogliono stampare gli studenti: ");
    scanf("%d", &voto);
    
    while (temp != NULL) {
        
        
        if (temp->voto == voto) {
            
            ptr = temp->elenco;
            
            while (ptr != NULL) {
                
                printf("\n");
                
                printf("\nNome: %s", ptr->nome);
                printf("\nCognome: %s", ptr->cognome);
                printf("\nMatricola: %d", ptr->matricola);
                printf("\n");
          
             
                ptr = ptr->next;
            }
        }
 
         temp = temp->next;
   }
    
    
}
 
 
 
 
 
void menu () {
    
    printf("\n        MENU'\n");
    printf("\n[1] Aggiungere voto");
    printf("\n[2] Aggiungere studente al voto");
    printf("\n[3] Stampare");
    printf("\n[0] Uscire");
    printf("\n");
    

    
}

 MacBook Pro Retina 15"  iPod Classic 80GB  iPhone 4s 16GB  The New iPad 32GB  Apple Cube G4  AppleTV2g 

Link al commento
Condividi su altri siti

Ciao, ho provato il tuo codice.

La prima cosa che ti consiglio è di scrivere un esempio di cosa dovrebbe fare, la tua spiegazione per chi non ha mai provato il codice risulta molto vaga.

La seconda cosa che ti consiglio è di scrivere l'esatto test per il quale ti si blocca il programma. Ho fatto un paio di prove, all'inizio non ho avuto problemi, poi mi ha fatto una stampa sporca e nell'ultima prova si è "finalmente" bloccato... non ho avuto tempo di analizzare il codice da quel che ho visto però pare che il problema sia in qualche malloc.

Link al commento
Condividi su altri siti

Eh ma dov'è l'errore nella malloc?? A me sembrano dichiarate correttamente...

 MacBook Pro Retina 15"  iPod Classic 80GB  iPhone 4s 16GB  The New iPad 32GB  Apple Cube G4  AppleTV2g 

Link al commento
Condividi su altri siti

provandolo meglio quando si tenta di aggiungere "studente al voto" va in stack overflow non ho capito bene il motivo

 

 

Infatti non capisco, anche a me dava quel problema. Comunque ho superato l'esame di programmazione con 27 quindi sono molto contento, c'era un esercizio simile e mi è stato dato corretto...probabilmente aveva qualche problema quello :)

 MacBook Pro Retina 15"  iPod Classic 80GB  iPhone 4s 16GB  The New iPad 32GB  Apple Cube G4  AppleTV2g 

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...