PROBLEMA Aiuto Lista di Liste in C

saro1995

Nuovo Utente
82
3
Ciao a tutti ragazzi, ho bisogno di aiuto con un compito d'esame che ho svolto io. In sostanza alcune delle funzioni implementate non funzionano. Poichè questo forum è pieno di persone molto più esperte di me mi sono permesso di domandare nella speranza di essere aiuto e soprattutto nella speranza che prendiate il codice e lo provate voi così da potermi consigliare come risolvere perchè io non ci sto riuscendo proprio :D
In particolare la funzione di modifica nome del cantante, elimina brano, copia brani nell'altra lista mi danno molti problemi, eppure mi sembrano scritte nel modo corretto. Di compilare compila senza problemi. Ovviamente non funzionando la funzione copia nell'altra lista non possono funzionare le altre funzioni visto che le altre funzioni funzionano in base al contenuto della seconda lista. Vi posta qua il codice e vi prego di aiutarmi, inoltre ovviamente posto anche la foto del compito. Grazie.


C:
#include <stdio.h>
#include <stdlib.h>
#include <string.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;
    int secondi;
    TListaBrani elenco_brani;
}TGenereMusicale;

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



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

void InserisciBraniInListaOrdinata(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;
    }
}

int CaricaBraniMusicali(char *nomefile, TListaBrani *plis) {
    FILE *f;
    TBranoMusicale brano;
    int nletti = 0;
    if ((f = fopen(nomefile, "r")) == NULL) {
        perror("File non trovato!!!\n");
        exit(1);
    }
    *plis = NULL;
    while (!feof(f)) {
        fgets(brano.titolo_brano, sizeof(brano.titolo_brano), f);
        fgets(brano.nome_cantante, sizeof(brano.nome_cantante), f);
        fscanf(f, "%[^\n]s\n", brano.genere_musicale);
        fscanf(f, "%d\t", &brano.anno);
        fscanf(f, "%d : %d\n", &brano.minuti, &brano.secondi);
        InserisciBraniInListaOrdinata(plis, brano);
        nletti++;
    }
    fclose(f);
    return nletti;
}

void VisualizzaBrani(TListaBrani lis) {
    int i;
    for (i = 0; i < lis; i++) {
        printf("------> Brano Numero : %d\n\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("\n- Anno: %d\t", lis->info.anno);
        printf("Durata: %d : %d\n\n", lis->info.minuti, lis->info.secondi);
        printf("---------------------------------------------------->\n\n");
        lis = lis->next;
    }
}

TListaBrani RicercaBrano(TListaBrani lis, char *titolo_brano) {
    while (lis != NULL) {
        if (!(strcmp(lis->info.titolo_brano, titolo_brano)))
            return(lis);
        lis = lis->next;
    }
    return(lis);
}

int ModificaCantante(TListaBrani *lis, char *titolo_brano, char *nuovo_cantante) {
    TListaBrani aux;
    aux = RicercaBrano(*lis, titolo_brano);
    if (aux != NULL) {
        strcpy(aux->info.nome_cantante, nuovo_cantante);
        return 1;
    }
    else {
        return 0;
    }
}
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;
}

TBranoMusicale InserisciBrano(void) {
    TBranoMusicale brano;
    getchar();
    printf("Per inserire un nuovo brano inserisci i campi richiesti\n\n");
    printf("- Titolo del brano: ");
    gets(brano.titolo_brano);
    printf("- Nome Cantante: ");
    gets(brano.nome_cantante);
    printf("- Genere Musicale: ");
    scanf("%[^\n]s", brano.genere_musicale);
    printf("- Anno:    ");
    scanf("%d", &brano.anno);
    printf("Durata: ");
    scanf("%d : %d", &brano.minuti, &brano.secondi);
    return brano;
}

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

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

void CopiaProgrammiInListaGeneriMusicali(TListaBrani listabrani, TListaGeneri *lis) {
    TBranoMusicale brano;
    TListaGeneri paux;
    while (listabrani != NULL) {
        brano = listabrani->info;
        paux = RicercaGenereMusicale(*lis, brano.genere_musicale);
        if (paux != NULL) {
            InserisciBraniInListaOrdinata(&(paux->info.elenco_brani), brano);
        }
        else {
            InserisciBrano(lis, brano.genere_musicale);
            RicercaGenereMusicale(*lis, brano.genere_musicale);
            InserisciBraniInListaOrdinata(&(paux->info.genere_musicale), brano);
        }
        listabrani = listabrani->next;
    }
}

float DurataMedia(TListaGeneri listageneri, char *generemusicale) {
    TListaGeneri paux;
    TListaBrani cc;
    int k;
    int sommadurata = 0;
    paux = RicercaGenereMusicale(listageneri, generemusicale);
    if (paux == NULL) {
        return -1;
    }
    cc = paux->info.elenco_brani;
    k = 0;
    while (cc != NULL) {
        sommadurata = sommadurata + cc->info.genere_musicale;
        k++;
        cc = cc->next;
    }
    return((float)sommadurata / k);
}

void VisualizzaBraniAnno(TListaGeneri listageneri, int *anno) {
    TListaBrani paux;
    while (listageneri != NULL) {
        paux = listageneri->info.elenco_brani;
        while (paux != NULL) {
            if (strcmp(paux->info.anno, anno) >= 0) {
                VisualizzaBrani(paux);
            }
            paux = paux->next;
        }
        listageneri = listageneri->next;
    }
}

void VisualizzaTutto(TListaGeneri listageneri) {
    TListaBrani paux;
    printf("Visualizzazione dati lista di liste\n\n");
    while (listageneri != NULL) {
        printf("---> Genere Musicale: %s\n", listageneri->info.genere_musicale);
        paux = listageneri->info.elenco_brani;
        while (paux != NULL) {
            printf("- Titolo del 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", paux->info.minuti, paux->info.secondi);
            paux = paux->next;
        }
        listageneri = listageneri->next;
    }
}
/*FUNZIONE PRINCIPALE MAIN*/
int main(void) {
    TListaBrani lista_brani = NULL;
    TListaGeneri lista_generi = NULL;
    int scelta, n, esito, anno;
    TBranoMusicale cc;
    char nomefile[64];
    char titolo_brano[255];
    char nuovo_cantante[63];
    
    do {
        scelta = menu();
        switch (scelta) {
        case 1:
            printf("\tFunzione Caricamento Da File\n");
            printf("Inserisci il nome del file da cui caricare i brani musicali: ");
            scanf("%s", nomefile);
            n = CaricaBraniMusicali(nomefile, &lista_brani);
            printf("Sono stati caricati %d brani e sono i seguenti: \n\n", n);
            VisualizzaBrani(lista_brani);

            break;
        case 2:
            printf("\tFunzione modifica nome cantante\n\n");
            printf("Inserisci il titolo del brano: ");
            gets(titolo_brano);
            printf("Inserisci il nuovo cantante: ");
            gets(nuovo_cantante);

            break;
        case 3:
            printf("\tFunzione Di Eliminazione Elemento\n");
            printf("Inserisci il titolo del brano che intendi eliminare: ");
            scanf("%s", titolo_brano);
            if (esito = EliminaBrano(&lista_brani, titolo_brano) == 1) {
                printf("Brano Eliminato con successo!!\n\n");
            }
            else {
                printf("Brano non trovato!\n");
            }
            
            break;
        case 4:
            cc = InserisciBrano();
            InserisciBraniInListaOrdinata(&lista_brani, cc);
            VisualizzaBrani(lista_brani);
            break;
        case 5:
            CopiaProgrammiInListaGeneriMusicali(lista_brani, &lista_generi);
            break;
        case 6:

            break;
        case 7:
            printf("Inserisci Anno: ");
            scanf("%d", &anno);
            VisualizzaBraniAnno(lista_generi, anno);
            break;
        case 8:
            VisualizzaTutto(lista_generi);
            break;
        case 9:
            printf("Grazie per aver utilizzato questo programma, alla prossima!!!\n\n");
            return 0;
            break;
        }
    } while (scelta != 0);

    return 0;
}


[ATTACH=full]328601[/ATTACH]
Post unito automaticamente:

Vi posto qua anche un esempio di file riguardo i brani da caricare con il file:

Tra le Granite e le Granate
Francesco Gabbani
Pop
2017 3:15

Per Averti
Adriano Celentano
Pop
2000 4:55

Ecc....
 

Allegati

  • 20190227_020156.jpg
    20190227_020156.jpg
    1.1 MB · Visualizzazioni: 204
Ultima modifica:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Intanto:
1) In VisualizzaBrani tu fai for (i = 0; i < lis; i++), ma lis è un puntatore non un intero
2) gets è deprecato
3) In CopiaProgrammiInListaGeneriMusicali chiami InserisciBrano(lis, brano.genere_musicale), ma non hai definito nessuna funzione InserisciBrano che accetti due parametri (in altri termini, hai definito solo InserisciBrano(void))
Post unito automaticamente:

Dopo vedo che utilizzi il risultato di strcmp come se fosse un booleano, ma quella funzione ritorna un intero (la differenza tra le due stringhe). Se due stringhe sono uguali dovresti fare strcmp(a,b) == 0
 
Ultima modifica:

saro1995

Nuovo Utente
82
3
Intanto:
1) In VisualizzaBrani tu fai for (i = 0; i < lis; i++), ma lis è un puntatore non un intero
2) gets è deprecato
3) In CopiaProgrammiInListaGeneriMusicali chiami InserisciBrano(lis, brano.genere_musicale), ma non hai definito nessuna funzione InserisciBrano che accetti due parametri (in altri termini, hai definito solo InserisciBrano(void))
Post unito automaticamente:

Dopo vedo che utilizzi il risultato di strcmp come se fosse un booleano, ma quella funzione ritorna un intero (la differenza tra le due stringhe). Se due stringhe sono uguali dovresti fare strcmp(a,b) == 0

Puoi postare un esempio per favore? Io ho preso spunto dal prof che ha caricato degli esercizi svolti e comunque è molto simile
 

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili