Sei sulla pagina 1di 5

#include <stdio.

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;
}

Potrebbero piacerti anche