PROBLEMA Problema Liste linguaggio C

saro1995

Nuovo Utente
82
3
Ragazzi sto svolgendo un compito d'esame in linguaggio C riguardo le liste di liste. C'è la funzione di elimina elemento che non so perchè non parte. La funzione durata media non l'ho saputa scrivere, non so da dove iniziare xD. La funzione copia elemento penso sia scritta giusta ma c'è qualcosina che non va. Vi posto il codice. Giudicate anche nel complesso come è scritto il codice anche a livello di ordine.
ps: In un altro commento a seguire vi sto il compito da svolgere.

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

/*DEFINIZIONE STRUTTURE DATI*/
typedef struct BranoMusicale {
    char titolo_brano[255];
    char nome_cantante[63];
    char genere_musicale[15];
    int anno;
    int minuti;
    int secondi;
}TBranoMusicale;

typedef struct NodoBranoMusicale {
    TBranoMusicale info;
    struct NodoBranoMusicale *next;
}TNodoBranoMusicale;
typedef TNodoBranoMusicale* TListaBrani;

typedef struct GenereMusicale {
    char genere_musicale[15];
    int minuti, secondi;
    TListaBrani elenco_brani;
}TGenereMusicale;

typedef struct NodoGenereMusicale {
    TGenereMusicale info;
    struct NodoGenereMusicale *next;
}TNodoGenereMusicale;
typedef TNodoGenereMusicale* TListaGeneriMusicali;





/*DEFINIZIONE DI FUNZIONE*/
// FUNZIONE PRINCIPALE MENU' TESTUALE 
int menu() {
    int scelta;
    printf("----> MENU' PRINCIPALE <----\n\n");
    printf("[1] Carica Brani Musicali\n");
    printf("[2] Modifica Nome\n");
    printf("[3] Elimina Brano\n");
    printf("[4] Copia In Lista Generi Musicali\n");
    printf("[5] Durata Media\n");
    printf("[6] Visualizza Brani Per Anno\n");
    printf("[7] Inserisci Brano\n");
    printf("[8] Visualizza Lista Generi Musicali\n");
    printf("[9] Esci\n\n");
    printf("Scelta: ");
    scanf("%d", &scelta);
    while (scelta < 1 || scelta > 9) {
        printf("Scelta non valida!!!\n");
        printf("Scelta: ");
        scanf("%d", &scelta);
        return scelta;
    }


    return scelta;
}



// 1) FUNZIONE DI INSERIMENTO IN LISTA ORDINATA
void InseririsciBraniInListaOrdinata(TListaBrani *lis, TBranoMusicale elem) {
    TListaBrani prec, curr, newnode;
    if ((newnode = (TListaBrani)malloc(sizeof(TNodoBranoMusicale))) == NULL) {
        printf("Errore nell'allocazione della memoria.\n");
        exit(1);
    }
    newnode->info = elem;
    prec = NULL;
    curr = *lis;
    while (curr != NULL && strcmp(curr->info.titolo_brano, elem.titolo_brano) < 0) {
        prec = curr;
        curr = curr->next;
    }
    newnode->next = curr;
    if (prec != NULL) {
        prec->next = newnode;
    }
    else {
        *lis = newnode;
    }
}

// FUNZIONE DI CARIMENTO DA FILE
int CaricaBraniMusicali(char *nomefile, TListaBrani *plis) {
    FILE *f;
    TBranoMusicale brano;
    int nBrani = 0;
    if ((f = fopen(nomefile, "r")) == NULL) {
        printf("Errore nell'apertura del file.\n");
        exit(1);
    }
    *plis = NULL;
    while (!feof(f)) {
        fgets(brano.titolo_brano, sizeof(brano.titolo_brano), f);
        fgets(brano.nome_cantante, sizeof(brano.titolo_brano), f);
        if (fgets(brano.genere_musicale, sizeof(brano.genere_musicale), f) == NULL)
            break;
        brano.genere_musicale[strlen(brano.genere_musicale) - 1] = '\0';
        fscanf(f, "%d\t", &brano.anno);
        fscanf(f, "%d : %d\n", &brano.minuti, &brano.secondi);
        InseririsciBraniInListaOrdinata(plis, brano);
        nBrani++;
    }
    fclose(f);
    return nBrani;
}

void VerificaCorrettoCaricamentoFile(TListaBrani lis) {
    int i;
    for (i = 0; i < lis; i++) {
        printf("------> Brano Numero: %d\n", i + 1);
        printf("- Titolo Del Brano: %s\n", lis->info.titolo_brano);
        printf("- Nome Cantante: %s\n", lis->info.nome_cantante);
        printf("- Genere Musicale: %s\n", lis->info.genere_musicale);
        printf("- Anno: %d\t", lis->info.anno);
        printf("Durata: %d:%d\n\n", lis->info.minuti, lis->info.secondi);
        printf("----------------------------------->\n\n");
        lis = lis->next;
    }
}

int EliminaBrano(TListaBrani *lis, char *titolo_brano) {
    TListaBrani prec, curr;
    prec = NULL;
    curr = *lis;
    while (curr != NULL && (strcmp(curr->info.titolo_brano, titolo_brano) != 0)) {
        prec = curr;
        curr = curr->next;
    }
    if (curr == NULL) {
        return 0;
    }
    if (prec != NULL) {
        prec->next = curr->next;
    }
    else {
        *lis = curr->next;
    }
    free(curr);
    return 1;
}

void InserisciNuovoGenereMusicale(TListaGeneriMusicali *lis, char* genere_musicale) {
    TListaGeneriMusicali newnode;
    if ((newnode = (TListaGeneriMusicali)malloc(sizeof(TNodoBranoMusicale))) == NULL) {
        printf("Errore nell'allocazione della memoria.\n");
        exit(1);
    }
    strcpy(newnode->info.genere_musicale, genere_musicale);
    newnode->info.elenco_brani = NULL;
    newnode->next = *lis;
    lis = newnode;
}

TListaGeneriMusicali CercaGenereMusicale(TListaGeneriMusicali lis, char *genere_musicale) {
    while (lis != NULL) {
        if (strcmp(genere_musicale, lis->info.genere_musicale) == 0)
            return lis;
        lis = lis->next;
    }
    return lis;
}

void CopiaBraniMusicaliInListaGeneriMusicali(TListaGeneriMusicali *lis, TListaBrani lista_brani) {
    TListaGeneriMusicali paux;
    TBranoMusicale p;
    while (lista_brani != NULL) {
        p = lista_brani->info;
        paux = CercaGenereMusicale(*lis, p.genere_musicale);
        if (paux != NULL) {
            InseririsciBraniInListaOrdinata(&(paux->info.elenco_brani), p);
        }
        else {
            InserisciNuovoGenereMusicale(lis, p.genere_musicale);
            CercaGenereMusicale(*lis, p.genere_musicale);
            InseririsciBraniInListaOrdinata(&(paux->info.elenco_brani), p);
        }
        lista_brani = lista_brani->next;
    }
}

void VisualizzaListaGeneriMusicali(TListaGeneriMusicali lis) {
    TListaBrani paux;
    printf("Visualizzazione dei dati presenti in memoria.\n");
    while (lis != NULL) {
        printf("\n--------> Genere Musicale: %s\n", lis->info.genere_musicale);
        paux = lis->info.elenco_brani;
        while (paux != NULL) {
            printf("- Titolo Brano: %s\n", paux->info.titolo_brano);
            printf("- Nome Cantante: %s\n", paux->info.nome_cantante);
            printf("- Anno: %d\t", paux->info.anno);
            printf("- Durata: %d:%d\n\n", paux->info.minuti, paux->info.secondi);
            paux = paux->next;
            
        }
        lis = lis->next;
    }
}

TBranoMusicale InserisciBrano(void) {
    TBranoMusicale brano;
    printf("Inserisci i dati di un nuovo brano\n\n");
    printf("Inserisci il titolo del brano: ");
    scanf("%s", brano.titolo_brano);
    printf("Inserisci il nome dle cantante: ");
    scanf("%s", brano.nome_cantante);
    printf("Inserisci il genere musicale: ");
    scanf("%[^\n]s", brano.genere_musicale);
    printf("Inserisci anno: ");
    scanf("%d", brano.anno);
    printf("Inserisci durata: ");
    scanf("%d:%d", &brano.minuti, &brano.secondi);
    return brano;
}

void AggiungiBrano(TListaGeneriMusicali *lis) {
    TBranoMusicale brano;
    TListaGeneriMusicali paux;
    brano = InserisciBrano();
    paux = CercaGenereMusicale(*lis, brano.genere_musicale);
    if (paux != NULL) {
        InseririsciBraniInListaOrdinata(&(paux->info.elenco_brani), brano);
    }
    else {
        InserisciNuovoGenereMusicale(lis, brano.genere_musicale);
        CercaGenereMusicale(*lis, brano.genere_musicale);
        InseririsciBraniInListaOrdinata(&(paux->info.elenco_brani), brano);
    }
}



/*FUNZIONE PRINCIPALE MAIN*/
int main(void) {
    TListaBrani lista_brani = NULL;
    TListaGeneriMusicali lista_generi_musicali = NULL;
    char nomefile[64];
    char titolo_del_brano[255];
    int scelta, n;
    while (scelta = menu()) {
        switch (scelta) {
        case 1:
            system("CLS");
            printf("\t---> FUNZIONE DI CARIMENTO DA FILE <---\n\n");
            printf("Inserisci il nome del file da cui caricare i brani musicali: ");
            scanf("%s", nomefile);
            n = CaricaBraniMusicali(nomefile, &lista_brani);
            printf("\nSono stati caricati %d brani e sono i seguenti: \n\n", n);
            VerificaCorrettoCaricamentoFile(lista_brani);
            system("PAUSE");
            break;
        case 2:
            system("CLS");

            system("PAUSE");
            break;
        case 3:
            system("CLS");
            printf("\t---> FUNZIONE DI ELIMINAZIONE DI UN BRANO <---\n\n");
            printf("Inserisci il titolo del brano: ");
            scanf("%s", titolo_del_brano);
            if (EliminaBrano(&lista_brani, titolo_del_brano) == 1) {
                printf("Brano eliminato con successo, ti stampo la lista aggiornata\n\n");
                VerificaCorrettoCaricamentoFile(lista_brani);
            }
            else {
                printf("Brano non trovato!!\n");
            }
            system("PAUSE");
            break;
        case 4:
            system("CLS");
            CopiaBraniMusicaliInListaGeneriMusicali(&lista_generi_musicali, lista_brani);
            printf("Elenco brani copiati in lista generi musicali\n\n");
            system("PAUSE");
            break;
        case 5:
            system("CLS");

            system("PAUSE");
            break;
        case 6:
            system("CLS");

            system("PAUSE");
            break;
        case 7:
            system("CLS");
            AggiungiBrano(&lista_generi_musicali);
            system("PAUSE");
            break;
        case 8:
            system("CLS");
            if (lista_generi_musicali != NULL) {
                VisualizzaListaGeneriMusicali(lista_generi_musicali);
            }
            else 
                printf("La lista e' vuota!\n");
            system("PAUSE");
            break;
        case 9:
            system("CLS");
            printf("Grazie per aver utilizzato questo programma, <3 \n\n");
            return 0;
            system("PAUSE");
            break;

        }
    }



    return 0;
}
Post unito automaticamente:

20181011_180436.jpg
 
Ultima modifica:

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili