Está en la página 1de 8

#include <iostream>

#include <stdlib.h>
#include <string>
#include <windows.h>

using namespace std;

struct Cancion{
string nom;
string art;
string gen;
float dur;
int num_repr;
};
struct Nodo {
Cancion *Cancion;
Nodo *padre;
Nodo *Izq;
Nodo *Der;
Nodo *siguiente;
};

Cancion* crearCancion(string nom,string art,string gen,float dur,int num_repr){


Cancion *cancion = new Cancion();
cancion->nom=nom;
cancion->art=art;
cancion->gen=gen;
cancion->dur=dur;
cancion->num_repr;
return cancion;
}

Nodo *crearNodo(Cancion *cancion,Nodo *padre){


Nodo *nuevo_nodo = new Nodo();
nuevo_nodo->Cancion=cancion;
nuevo_nodo->Der = NULL;
nuevo_nodo->Izq = NULL;
nuevo_nodo->padre = padre;
return nuevo_nodo;
}

Nodo *pila_Reciclaje = NULL;


Nodo *lista_Reproduccion = NULL;
Nodo *principal = NULL;

void InsertarNodo(Nodo *& principal, Cancion *cancion, Nodo *padre){


if(principal == NULL){
Nodo *nuevo_nodo = crearNodo(cancion,padre);
principal = nuevo_nodo;
}
else{
string nombreRaiz = principal->Cancion->nom;
if(nombreRaiz.compare(cancion->nom)<=0){
InsertarNodo(principal->Izq,cancion,principal);
}else{
InsertarNodo(principal->Der,cancion,principal);
}
}
}

Nodo * Buscar(Nodo *principal,string nom){


if(principal == NULL){
return NULL;
}else if(nom.compare(principal->Cancion->nom)==0){
return principal;
}else if(nom.compare(principal->Cancion->nom)>0){
return Buscar(principal->Izq,nom);
}else{
return Buscar(principal->Der,nom);
}
}

void encolar(Nodo *&lista_Reproduccion, Nodo *&nuevoNodo){


if(lista_Reproduccion == NULL){
lista_Reproduccion= nuevoNodo;
} else {
nuevoNodo->siguiente = lista_Reproduccion;
lista_Reproduccion = nuevoNodo;
}
}
void agregar_Lista_Reproduccion(Nodo *principal, Nodo *&lista_Reproduccion,string
cancion){
Nodo *nodo_nuevo = Buscar(principal,cancion);
if(nodo_nuevo != NULL){
encolar(lista_Reproduccion,nodo_nuevo);
cout<<"Cancion Añadida correctamente"<<endl;
}else{
cout<<"la cancion no existe en los registros"<<endl;
}
}
void eliminar1(Nodo *nodo){
if(nodo->padre == NULL ){
nodo->Izq = NULL;
nodo->Der = NULL;
nodo->siguiente = NULL;
delete nodo;
Nodo *aux = NULL;
principal = aux;
}else{
nodo->Izq = NULL;
nodo->Der = NULL;
nodo->siguiente = NULL;
delete nodo;
}
}
void sustituir(Nodo *principal,Nodo *nuevoNodo){ // busca el nodo a reemplazar
if(principal->padre){
if(principal->Cancion->nom == principal->padre->Izq->Cancion->nom)
{//sustituye el nodo por el hijo izquierdo
principal->padre->Izq= nuevoNodo;
}else if (principal->Cancion->nom == principal->padre->Der->Cancion-
>nom){//sustituye el nodo por el hijo dereho
principal->padre->Der=nuevoNodo;
}
}if(nuevoNodo){ //nodo padre apunta a su nuevo hijo
nuevoNodo->padre=principal->padre;
}
}
Nodo *nodoMasIzquierdo(Nodo *principal){
if(principal==NULL){
return NULL;
}
if(principal->Izq){
return nodoMasIzquierdo(principal->Izq);
}else{
return principal;
}
}
void eliminarNodo(Nodo *NodoEliminar){
if(NodoEliminar->Der && NodoEliminar->Izq){ //nodo con dos hijos
Nodo *masIzq = nodoMasIzquierdo(NodoEliminar->Der);//reemplaza el nodo
a eliminar con el nodo mas izquierdo
NodoEliminar->Cancion->nom=masIzq->Cancion->nom;
NodoEliminar->Cancion->art=masIzq->Cancion->art;
NodoEliminar->Cancion->gen=masIzq->Cancion->gen;
NodoEliminar->Cancion->dur=masIzq->Cancion->dur;
NodoEliminar->Cancion->num_repr=masIzq->Cancion->num_repr;
eliminarNodo(masIzq); //elimina el nodo a reemplazar
}//nodo con un solo hijo independiente de la ubicacion
else if(NodoEliminar->Izq){ //nodo con hijo zquierdo
sustituir(NodoEliminar,NodoEliminar->Izq);
eliminar1(NodoEliminar);
}else if(NodoEliminar->Der){
sustituir(NodoEliminar,NodoEliminar->Der);
eliminar1(NodoEliminar);
}else{
sustituir(NodoEliminar,NULL);
eliminar1(NodoEliminar);
}
}
void eliminarNodoPila(Nodo* nodo) {
nodo->siguiente = NULL;
delete nodo;
}
Nodo *desapilar(Nodo *&pila){
if(pila != NULL){
Nodo* nodoRetirar = pila;
pila= nodoRetirar->siguiente;
return nodoRetirar;
eliminarNodoPila(nodoRetirar);
} else {
cout<<" No hay canciones para reingreso"<<endl;
}
}

void rehacer(Nodo *&pila_Reciclaje){


Nodo *nodo_Aux = desapilar(pila_Reciclaje);
Cancion *cancion_Aux = crearCancion(nodo_Aux->Cancion->nom,nodo_Aux->Cancion-
>art,nodo_Aux->Cancion->gen,nodo_Aux->Cancion->dur,nodo_Aux->Cancion->num_repr);

if(nodo_Aux != NULL){
InsertarNodo(principal,cancion_Aux,NULL);
}
else{
cout<<"No hay canciones para reingreso"<<endl;
}
}

void empilar(Nodo *&pila, Nodo *&nuevoNodo){


if(pila == NULL){
pila = nuevoNodo;
} else {
nuevoNodo->siguiente = pila;
pila = nuevoNodo;
}
}
void eliminar (Nodo *principal,string nom){
if(principal == NULL){
cout<<"Cancion no existe en el reproductor, verifica el nombre."<<endl;
return;
}else if(nom.compare(principal->Cancion->nom)>0){
eliminar(principal->Izq,nom);
}else if(nom.compare(principal->Cancion->nom)<0){
eliminar(principal->Der,nom);
}else{
Cancion *cancion_Aux = crearCancion(principal->Cancion->nom,principal-
>Cancion->art,principal->Cancion->gen,principal->Cancion->dur,principal->Cancion-
>num_repr);
Nodo *nodo_Aux = crearNodo(cancion_Aux,NULL);
empilar(pila_Reciclaje,nodo_Aux);
cout<<" x _____ X "<<endl;
cout<<" _ |x x| _ "<<endl;
cout<<" \| _ |/ "<<endl;
cout<<" |___| "<<endl;
cout<<" | | "<<endl;
eliminarNodo(principal);
}
}

void play(Nodo *&principal, Nodo *&lista_Reproduccion){


Nodo *aux;
Nodo *aux_principal;
aux = lista_Reproduccion;
aux_principal= principal;
int min =0;
cout<<"--------------Reproduciendo----------- :"<<endl;
while(aux != NULL){
aux->Cancion->num_repr+=1;
min += aux->Cancion->dur;
cout<<"------------------------- :"<<endl;
cout<<"Nombre :"<<aux->Cancion->nom<<endl;
cout<<"------------------------- :"<<endl;
aux = aux->siguiente;
}
cout<<"Total Reproduccion: "<<min<<endl;
}
// Metodo para recorrer arbol por profundidad en Preorden

void recorridoPreorden(Nodo* principal) {


if (principal != NULL) {

cout<<"Nombre :"<<principal->Cancion->nom<<endl;
cout<<"Artista :"<<principal->Cancion->art<<endl;
cout<<"Genero :"<<principal->Cancion->gen<<endl;
cout<<"Duracion :"<<principal->Cancion->dur<<endl;
cout<<"Numero De Reproduciones :"<<principal->Cancion-
>num_repr<<endl;
recorridoPreorden(principal->Izq);
recorridoPreorden(principal->Der);
}
}

/**
* Metodo para recorrer arbol por profundidad en Inorden
**/
void recorridoInorden(Nodo* principal) {
if (principal != NULL) {
recorridoInorden(principal->Izq);
cout<<"---------*-*-BIBLIOTECA-*-*----"<<endl;
cout<<"Nombre :"<<principal->Cancion->nom<<endl;
cout<<"Artista :"<<principal->Cancion->art<<endl;
cout<<"Genero :"<<principal->Cancion->gen<<endl;
cout<<"Duracion :"<<principal->Cancion->dur<<endl;
cout<<"Numero De Reproduciones :"<<principal->Cancion-
>num_repr<<endl;

recorridoInorden(principal->Der);
}
}

int main(){
int opcion;

while (opcion != 8){


system("CLS");
cout<<"\t YA PUEDES AGREGAR Y ESCUCHAR TUS CANCIONES FAVORITAS"<<endl;
cout<<"Digite la opcion que desea realizar: "<<endl;
cout<<"1. Agregar Cancion"<<endl;
cout<<"2. Buscar favoritos "<<endl;
cout<<"3. Borrar"<<endl;
cout<<"4. Rehacer cancion"<<endl;
cout<<"5. Crear lista de reproducion"<<endl;
cout<<"6. Ver canciones"<<endl;
cout<<"7. Play"<<endl;
cout<<"8. Salir"<<endl;
cin>>opcion;
cin.ignore();
system("CLS");

if(opcion==1){
string nom;
string art;
string gen;
float dur;
int num_repr;
cout<<"nombre de la cancion:"<<endl;
getline(cin,nom);

cout<<"artista:"<<endl;
getline(cin,art);

cout<<"genero:"<<endl;
getline(cin,gen);

cout<<"duracion:"<<endl;
cin>>dur;

num_repr = 0;
Cancion *cancion = crearCancion(nom,art,gen,dur,num_repr);
InsertarNodo(principal,cancion,NULL);
cout<<"Cancion agregada correctamente a la
Biblioteca"<<endl;
cout<<"Espere..."<<endl;
Sleep(3000);
}else if(opcion==2){
string nom;
Nodo *nodo_Buscar = new Nodo();
cout<<"Buscar por nombre de cancion, ingrese
nombre"<<endl;
getline(cin,nom);
nodo_Buscar = Buscar(principal,nom);
if(nodo_Buscar != NULL){
cout<<"---------CANCION--
ENCONTRADA------"<<endl;
cout<<"Nombre :"<<nodo_Buscar->Cancion-
>nom<<endl;
cout<<"Artista :"<<nodo_Buscar->Cancion-
>art<<endl;
cout<<"Genero :"<<nodo_Buscar->Cancion-
>gen<<endl;
cout<<"Duracion :"<<nodo_Buscar->Cancion-
>dur<<endl;
cout<<"Numero De Reproduciones :"<<nodo_Buscar-
>Cancion->num_repr<<endl;
cout<<"Espere..."<<endl;
Sleep(3000);
}else{
cout<<"--LO-SENTIMOS--NO-SE-
ENCUENTRA---"<<endl;
cout<<" ? ______ ? "<<endl;
cout<<" ? _ (o o) _ ? "<<endl;
cout<<" \| ~ |/
"<<endl;
cout<<" ? |____| ? "<<endl;
cout<<" | | "<<endl;
cout<<"Espere..."<<endl;
Sleep(3000);
}
}else if(opcion==3){
string nom;
cout<<"Nombre de la cancion a eliminar"<<endl;
getline(cin,nom);
eliminar(principal,nom);
cout<<"Espere..."<<endl;
Sleep(3000);
}else if(opcion==4){
if(pila_Reciclaje!=NULL){
cout<<"--CANCION : "<<pila_Reciclaje->Cancion->nom<<endl;
cout<<" * _____ * "<<endl;
cout<<" * _ (o o) _ * "<<endl;
cout<<" * \| o |/ "<<endl;
cout<<" |___| "<<endl;
cout<<" | | "<<endl;
cout<<"--CANCION-RESTABLECIDA--"<<endl;
rehacer(pila_Reciclaje);
cout<<"Espere..."<<endl;
Sleep(3000);
}else{
cout<<"--NO-HAY-CANCIONES-ELIMINADAS"<<endl;
cout<<"Espere... "<<endl;
Sleep(3000);
}

}else if(opcion==5){

string cancion;
cout<<"Cancion para agregar a lista, nombre:"<<endl;
cin>>cancion;
agregar_Lista_Reproduccion(principal,lista_Reproduccion,cancion);
cout<<"Espere... "<<endl;
Sleep(3000);

}else if(opcion==6){
int opcion1;
cout<<"VER"<<endl;
cout<<"1. canciones ascendente"<<endl;
cout<<"2. canciones descente"<<endl;
cout<<"3. eliminadas"<<endl;
cout<<"4. reproduccion"<<endl;
cin>>opcion1;
if(opcion1==1){

cout<<"1. canciones ascendente"<<endl;


recorridoInorden(principal);
cout<<"Espere..."<<endl;
Sleep(3000);

}else if(opcion1==2){

cout<<"2. canciones descente"<<endl;


recorridoPreorden(principal);
cout<<"Espere..."<<endl;
Sleep(3000);

}else if(opcion1==3){
cout<<"3. canciones eliminadas"<<endl;
if(pila_Reciclaje != NULL){
Nodo *nodo_Aux = pila_Reciclaje;
while(nodo_Aux != NULL){
cout<<"---------CANCIONES--
ELIMINADAS------"<<endl;
cout<<"Nombre :"<<nodo_Aux->Cancion-
>nom<<endl;
cout<<"Artista :"<<nodo_Aux->Cancion-
>art<<endl;
cout<<"Genero :"<<nodo_Aux->Cancion-
>gen<<endl;
cout<<"Duracion :"<<nodo_Aux->Cancion-
>dur<<endl;
cout<<"Numero De
Reproduciones :"<<nodo_Aux->Cancion->num_repr<<endl;
nodo_Aux = nodo_Aux->siguiente;
}
}
cout<<"Espere..."<<endl;
Sleep(3000);
}else if(opcion1==4){
if(lista_Reproduccion != NULL){
Nodo *nodo_Aux = lista_Reproduccion;
while(nodo_Aux != NULL){
cout<<"---------LISTA DE
REPRODUCCION------"<<endl;
cout<<"Nombre :"<<nodo_Aux->Cancion->nom<<endl;
cout<<"Artista :"<<nodo_Aux->Cancion-
>art<<endl;
cout<<"Genero :"<<nodo_Aux->Cancion->gen<<endl;
cout<<"Duracion :"<<nodo_Aux->Cancion-
>dur<<endl;
cout<<"Numero De Reproduciones :"<<nodo_Aux-
>Cancion->num_repr<<endl;
nodo_Aux = nodo_Aux->siguiente;
}
cout<<"Espere..."<<endl;
Sleep(3000);
}else{
cout<<"No-hay-canciones-en-lista"<<endl;
cout<<" __ ___"<<endl;
cout<<" |__| --> |_x_|"<<endl;

cout<<"Espere..."<<endl;
Sleep(3000);
}

}
}else if(opcion==7){
if(lista_Reproduccion !=NULL){

play(principal,lista_Reproduccion);
cout<<"Espere..."<<endl;
Sleep(3000);
}else{
cout<<"No hay Canciones Agregadas en el
Reproductor"<<endl;
cout<<"Espere..."<<endl;
Sleep(3000);
}
}
}

cout<<"---------------GRACIAS POR USAR NUESTRO


SERVICIO---------"<<endl;
cout<<" _ "<<endl;
cout<<" |_ "<<endl;
cout<<" |-| _ "<<endl;
cout<<" |-| _ "<<endl;
cout<<" |_| "<<endl;
return 0;
};

También podría gustarte