Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXCAD 1000
enum { Anyadir=1, BuscarPorTituloDisco, BuscarPorInterprete, BuscarPorTituloCa
ncion,
Mostrar, EliminarDisco, Salir};
struct Cancion {
char * titulo;
struct Cancion * sig;
};
typedef struct Cancion * TipoListaCanciones;
struct Disco {
char * titulo;
char * interprete;
int anyo;
TipoListaCanciones canciones;
struct Disco * sig;
};
typedef struct Disco * TipoColeccion;
TipoListaCanciones crea_lista_canciones(void)
{
return NULL;
}
TipoListaCanciones anyade_cancion(TipoListaCanciones lista, char titulo[])
{
struct Cancion * nuevo = malloc(sizeof(struct Cancion));
nuevo->titulo = malloc((strlen(titulo)+1)*sizeof(char));
strcpy(nuevo->titulo, titulo);
nuevo->sig = lista;
lista = nuevo;
return lista;
}
TipoListaCanciones libera_canciones(TipoListaCanciones lista)
{
struct Cancion * aux, * siguiente;
aux = lista;
while (aux != NULL) {
siguiente = aux->sig;
free(aux->titulo);
free(aux);
aux = siguiente;
}
return NULL;
}
int contiene_cancion_con_titulo(TipoListaCanciones lista, char titulo[])
{
struct Cancion * aux;
for (aux=lista; aux!=NULL; aux=aux->sig)
if (strcmp(aux->titulo, titulo)==0)
return 1;
return 0;
}
struct Disco * busca_disco_por_titulo_cancion(TipoColeccion coleccion, char titu
lo[])
{
struct Disco * aux;
for (aux=coleccion; aux!=NULL; aux=aux->sig)
if (contiene_cancion_con_titulo(aux->canciones, titulo))
return aux;
return NULL;
}
struct Disco * busca_disco_por_titulo_disco(TipoColeccion coleccion, char titulo
[])
{
struct Disco * aux;
for (aux=coleccion; aux!=NULL; aux=aux->sig)
if (strcmp(aux->titulo, titulo) == 0)
return aux;
return NULL;
}
struct Disco * busca_disco_por_interprete(TipoColeccion coleccion, char interpre
te[])
{
struct Disco * aux;
for (aux=coleccion; aux!=NULL; aux=aux->sig)
if (strcmp(aux->interprete, interprete) == 0)
return aux;
return NULL;
}
TipoColeccion borra_disco_por_titulo_e_interprete( TipoColeccion coleccion, cha
r titulo[],
char interprete[])
{
struct Disco *aux, *atras;
for (atras = NULL, aux=coleccion; aux != NULL; atras = aux, aux = aux->sig)
if (strcmp(aux->titulo, titulo) == 0 && strcmp(aux->interprete, interprete) ==
0) {
if (atras == NULL)
coleccion = aux->sig;
else
atras->sig = aux->sig;
free(aux->titulo);
free(aux->interprete);
libera_canciones(aux->canciones);
free(aux);
return coleccion;
}
return coleccion;
}
TipoColeccion crea_coleccion(void)
{
return NULL;
}
TipoColeccion anyade_disco( TipoColeccion lista, char titulo[], char interprete
[],
int anyo, TipoListaCanciones canciones)
{
struct Disco * disco;
disco = malloc(sizeof(struct Disco));
disco->titulo = malloc((strlen(titulo)+1)*sizeof(char));
strcpy(disco->titulo, titulo);
disco->interprete = malloc((strlen(interprete)+1)*sizeof(char));
strcpy(disco->interprete, interprete);
disco->anyo = anyo;
disco->canciones = canciones;
disco->sig = lista;
lista = disco;
return lista;
}
TipoColeccion libera_coleccion(TipoColeccion lista)
{
struct Disco * aux, * siguiente;
aux = lista;
while (aux != NULL) {
siguiente = aux->sig;
free(aux->titulo);
free(aux->interprete);
aux->canciones = libera_canciones(aux->canciones);
free(aux);
aux = siguiente;
}
return NULL;
}
void muestra_canciones(TipoListaCanciones lista)
{
struct Cancion * aux;
for (aux=lista; aux!=NULL; aux=aux->sig)
printf( %sn, aux->titulo);
}
void muestra_disco(struct Disco eldisco)
{
printf(Ttulo: %sn, eldisco.titulo);
printf(Intrprete: %sn, eldisco.interprete);
printf(Ao de edicin: %dn, eldisco.anyo);
printf(Canciones:n);
muestra_canciones(eldisco.canciones);
printf(n);
}
void muestra_coleccion(TipoColeccion lista)
{
struct Disco * aux;
for (aux=lista; aux!=NULL; aux=aux->sig)
muestra_disco(*aux);
}
int main(void)
{
int opcion;
TipoColeccion coleccion;
char titulo_disco[MAXCAD+1], titulo_cancion[MAXCAD+1], interprete[MAXCAD+1];
char linea[MAXCAD+1];
int anyo;
struct Disco * undisco;
TipoListaCanciones lista_canciones;
coleccion = crea_coleccion();
do {
printf(Menn);
printf(1) Aadir discon);
printf(2) Buscar por ttulo del discon);
printf(3) Buscar por intrpreten);
printf(4) Buscar por ttulo de cancinn);
printf(5) Mostrar todon);
printf(6) Eliminar un disco por ttulo e intrprten);
printf(7) Finalizarn);
printf(Opcin: ); gets(linea); sscanf(linea, %d, &opcion);
switch(opcion) {
case Anyadir:
printf(Ttulo: ); gets(titulo_disco);
printf(Intrprete: ); gets(interprete);
printf(Ao: ); gets(linea); sscanf(linea, %d, &anyo);
lista_canciones = crea_lista_canciones();
do {
printf(Ttulo de cancin (pulse retorno para acabar): );
gets(titulo_cancion);
if (strlen(titulo_cancion) > 0)
lista_canciones = anyade_cancion(lista_canciones, titulo_cancion);
} while (strlen(titulo_cancion) > 0);
coleccion = anyade_disco(coleccion, titulo_disco, interprete, anyo, lista_canci
ones);
break;
case BuscarPorTituloDisco:
printf(Ttulo: ); gets(titulo_disco);
undisco = busca_disco_por_titulo_disco(coleccion, titulo_disco);
if (undisco != NULL)
muestra_disco(*undisco);
else
printf(No hay discos con ttulo %sn, titulo_disco);
break;
case BuscarPorInterprete:
printf(Intrprete: ); gets(interprete);
undisco = busca_disco_por_interprete(coleccion, interprete);
if (undisco != NULL)
muestra_disco(*undisco);
else
printf(No hay discos de %sn, interprete);
break;
case BuscarPorTituloCancion:
printf(Ttulo: ); gets(titulo_cancion);
undisco = busca_disco_por_titulo_cancion(coleccion, titulo_cancion);
if (undisco != NULL)
muestra_disco(*undisco);
else
printf(No hay discos con alguna cancin titulada %sn, titulo_cancion);
break;
case Mostrar:
muestra_coleccion(coleccion);
break;
case EliminarDisco:
printf(Ttulo: ); gets(titulo_cancion);
printf(Intrprete: ); gets(interprete);
coleccion = borra_disco_por_titulo_e_interprete(coleccion, titulo_cancion, inte
rprete);
break;
}
} while (opcion != Salir);
coleccion = libera_coleccion(coleccion);
return 0;
}