Vai al contenuto

Benvenuto nella community di Italiamac Forum

Guest Image

Benvenuto su Italiamac, la più grande comunità AMUG italiana riconosciuta da Apple. La consultazione è libera. Se vuoi anche partecipare attivamente alle discussioni pubblicando post e messaggi puoi iscriverti gratuitamente, avrai molti vantaggi:

  • Pubblicare post, messaggi e richieste di aiuto
  • Fare amicizia e usare i messaggi privati fra utenti
  • Pubblicare annunci di vendita di usato
  • Usare tutte le funzioni della community

ISCRIVITI GRATIS


Change Mode






[Linguaggio C] Problema lista di liste


Recommended Posts

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");
    

    
}

Modificato da iColas7

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

Link di questo messaggio
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 di questo messaggio
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 di questo messaggio
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 di questo messaggio
Condividi su altri siti

Rispondi e partecipa alla discusione

Puoi rispondere subito e iscriverti successivamente. If you have an account, sign in now to post with your account.

Ospite
Rispondi a questa discussione...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Crea Nuovo...

Info

Questo sito utilizza cookies, anche di terze parti e profilazione. Utilizzando il sito acconsenti al loro impiego e dichiari di aver letto e di accettare: Privacy Policy Termini di utilizzo