Un archivio musicale è organizzato nel seguente modo: gli artisti sono disposti in un array e sono ordinati per nome; ogni artista ha associata un array di album organizzati per anno e a parità di anno per ordine alfabetico; ogni album contiene un array di canzoni ordinate per posizione all’interno dell’album.
Le strutture dati utilizzate sono le seguenti:
typedef struct Song { char * titolo;
int durata;
int pos;
int valido; } Canzone;
typedef Canzone SequenzaCanzoni[1000];
typedef struct Album { char * titolo;
int n_canzoni;
int anno;
SequenzaCanzoni canzoni;
int valido; } Disco;
typedef Disco SequenzaDischi[1000];
typedef struct Singer { char * nome;
int n_dischi;
SequenzaDischi dischi;
int valido; } Artista;
typedef Artista SequenzaArtisti[1000];
Il campo “valido” presente in tutte le struct serve a dire se la casella dell’array contiene contenuto valido (nel caso l’attributo ha valore 1) o è da considerarsi vuota (nel caso l’attributo ha valore 0).
Si codifichi in C la seguente funzione:
int invalidaCanzone (SequenzaArtisti artisti, char * artista, char * disco, char * canzone)
che invalida dal catalogo la canzone qualora questa esista e restituisce 0 in caso di esito positivo, -1 in caso di canzone non esistente. Qualora la canzone sia l’unica del disco, occorre inoltre invalidare il disco. Infine, se il disco invalidato dovesse essere l’unico esistente dell’artista, è necessario invalidare l’artista stesso. Conseguentemente, vanno opportunamente aggiornati i contatori del numero di canzoni e di dischi.