/*Pues eso, que despues de leer tu curiosidad, me he animado a realizarlo y este es el resultado*/
/*
Programa Decodificador Morse LK
Realizado por LamKros.
lamkros@mixmail.comDescripcion: Dado un signo morse lo traduce a caracteres.
Funciona para el abecedario y los numeros, si el signo es menor de 6 digitos 
y si no se introducen caracteres no deseados.
El autor da su consentimiento para que el codigo 
sea modificado, ampliado o mejorado por cualquier persona
He utilizadado como estructura para la decodificacion un arbol binario,
en el cual la rama izquierda es el punto y la rama derecha la raya.
Asi, la W es .--, porque en el arbol nos desplazamos al nodo de la izquierda,
despues hacia la derecha y otra vez a la derecha.
Bueno, que lo disfruteis;) 
*/
         //Realizado por Lamkros
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
        //Realizado por Lamkros
const int MAXMORSE = 5;
const char FINCAD = char(0);
const char ESPACIO = ' ';
const char PUNTO = '.';
const char RAYA = '-';
const char SIN_CARACTER = 'x';
typedef struct TNodo *TMorse;
struct TNodo
       {
       char valor;
       TMorse punto;
       TMorse raya;
       };
typedef char TDato [MAXMORSE+1];
       //Realizado por Lamkros
void CrearMorse(TMorse &m);
void CrearNodosVacios(TMorse &m,int i);
void RellenarValores (TMorse &m);
void MostrarCaracteres(TMorse &m);
void DestruirMorse(TMorse &m);
char BuscarMorse(TMorse &m,TDato dato,int i);
       //De Lamkros para todos
int main()
    {
    TMorse m;
    TDato dato;
    m=NULL;
    //int i=0,j=0;
    char car;
    CrearMorse(m);
    bool fin=false;
    cout << "t Decodificador Morse LK"<<endl<<endl;
    cout << "t Funciona correctamente hasta 5 digitos"<<endl ;
    cout << "t Pulsar Q para salir"<<endl <<endl;
    while (!(fin))
    {
    cout << "t Insertar signo: ";
    cin >> dato;
    if (toupper(dato[0])=='Q')
    {fin = true;}
    else
    {
    car = BuscarMorse(m,dato,0);
    if (car=='x')
    {
    cout << "SIGNO NO VALIDO"<<endl;
    }
    else
    {cout <<car <<" "<<endl;}
    }
    }
    system("PAUSE");
    DestruirMorse(m);
    return 0;
    }
       //Realizado por Lamkros
void CrearMorse(TMorse &m)
     {
     int i=0;
     CrearNodosVacios(m,i);
     RellenarValores (m);
     }
      //Resuelto por Lamkros
void CrearNodosVacios(TMorse &m,int i)
     {
     if (i==(MAXMORSE+1))
     {m=NULL;}
     else
     {
     m=new(TNodo);
     CrearNodosVacios(m->punto,i+1);
     CrearNodosVacios(m->raya ,i+1);
     }
     }
     //Ideado por Lamkros     
void RellenarValores (TMorse &m)
     {TMorse ptr;
     ptr=m;
     if (ptr!=NULL)
     {
     /*
     ptr
     punto->
     raya->
     valor
     */     
     ptr->valor                                     = SIN_CARACTER;
     ptr->punto->valor                              = 'E';     
     ptr->punto->punto->valor                       = 'I';
     ptr->punto->punto->punto->valor                = 'S';
     ptr->punto->punto->punto->punto->valor         = 'H';
     ptr->punto->punto->punto->punto->punto->valor  = '5';
     ptr->punto->punto->punto->punto->raya->valor   = '4';
     ptr->punto->punto->punto->raya->valor          = 'V'; 
     ptr->punto->punto->punto->raya->punto->valor   = SIN_CARACTER;
     ptr->punto->punto->punto->raya->raya->valor    = '3';     
     ptr->punto->punto->raya->valor                 = 'U';
     ptr->punto->punto->raya->punto->valor          = 'F';
     ptr->punto->punto->raya->punto->punto->valor   = SIN_CARACTER;
     ptr->punto->punto->raya->punto->raya->valor    = SIN_CARACTER;
     ptr->punto->punto->raya->raya->valor           = SIN_CARACTER; 
     ptr->punto->punto->raya->raya->punto->valor    = SIN_CARACTER;
     ptr->punto->punto->raya->raya->raya->valor     = '2';          
     ptr->punto->raya->valor                        = 'A';
     ptr->punto->raya->punto->valor                 = 'R';
     ptr->punto->raya->punto->punto->valor          = 'L';
     ptr->punto->raya->punto->punto->punto->valor   = SIN_CARACTER;
     ptr->punto->raya->punto->punto->raya->valor    = SIN_CARACTER;
     ptr->punto->raya->punto->raya->valor           = SIN_CARACTER; 
     ptr->punto->raya->punto->raya->punto->valor    = SIN_CARACTER;
     ptr->punto->raya->punto->raya->raya->valor     = SIN_CARACTER;     
     ptr->punto->raya->raya->valor                  = 'W';
     ptr->punto->raya->raya->punto->valor           = 'P';
     ptr->punto->raya->raya->punto->punto->valor    = SIN_CARACTER;
     ptr->punto->raya->raya->punto->raya->valor     = SIN_CARACTER;
     ptr->punto->raya->raya->raya->valor            = 'J'; 
     ptr->punto->raya->raya->raya->punto->valor     = SIN_CARACTER;
     ptr->punto->raya->raya->raya->raya->valor      = '1';          
     ptr->raya->valor                               = 'T';     
     ptr->raya->punto->valor                        = 'N';
     ptr->raya->punto->punto->valor                 = 'D';
     ptr->raya->punto->punto->punto->valor          = 'B';
     ptr->raya->punto->punto->punto->punto->valor   = '6';
     ptr->raya->punto->punto->punto->raya->valor    = SIN_CARACTER;
     ptr->raya->punto->punto->raya->valor           = 'X'; 
     ptr->raya->punto->punto->raya->punto->valor    = SIN_CARACTER;
     ptr->raya->punto->punto->raya->raya->valor     = SIN_CARACTER;     
     ptr->raya->punto->raya->valor                  = 'K';
     ptr->raya->punto->raya->punto->valor           = 'C';
     ptr->raya->punto->raya->punto->punto->valor    = SIN_CARACTER;
     ptr->raya->punto->raya->punto->raya->valor     = SIN_CARACTER;
     ptr->raya->punto->raya->raya->valor            = 'Y'; 
     ptr->raya->punto->raya->raya->punto->valor     = SIN_CARACTER;
     ptr->raya->punto->raya->raya->raya->valor      = SIN_CARACTER;          
     ptr->raya->raya->valor                         = 'M';
     ptr->raya->raya->punto->valor                  = 'G';
     ptr->raya->raya->punto->punto->valor           = 'Z';
     ptr->raya->raya->punto->punto->punto->valor    = '7';
     ptr->raya->raya->punto->punto->raya->valor     = SIN_CARACTER;
     ptr->raya->raya->punto->raya->valor            = 'Q'; 
     ptr->raya->raya->punto->raya->punto->valor     = SIN_CARACTER;
     ptr->raya->raya->punto->raya->raya->valor      = SIN_CARACTER;     
     ptr->raya->raya->raya->valor                   = 'O';
     ptr->raya->raya->raya->punto->valor            = SIN_CARACTER;
     ptr->raya->raya->raya->punto->punto->valor     = '8';
     ptr->raya->raya->raya->punto->raya->valor      = SIN_CARACTER;
     ptr->raya->raya->raya->raya->valor             = SIN_CARACTER; 
     ptr->raya->raya->raya->raya->punto->valor      = '9';
     ptr->raya->raya->raya->raya->raya->valor       = '0';     
     }
     }
     //Pensado por Lamkros
void MostrarCaracteres(TMorse &m)
     {
     if (m!=NULL)
     {
     cout <<m->valor;
     MostrarCaracteres(m->punto);
     MostrarCaracteres(m->raya);
     }
     }
     //Diseñado por Lamkros
char BuscarMorse(TMorse &m,TDato dato,int i)
     {
     if (m!=NULL)
     {
     if (dato 
 ==FINCAD)
     {return m->valor;}
     else
     {
     if (dato  ==PUNTO)
     {BuscarMorse(m->punto,dato,i+1);}
     else  if (dato==RAYA)
     {BuscarMorse(m->raya,dato,i+1);}
     else 
     {return SIN_CARACTER;}
     }
     }
     }
void DestruirMorse(TMorse &m)
     {
     if (m!=NULL)
     {
     DestruirMorse(m->punto);
     DestruirMorse(m->raya);
     delete(m);
     }
     }
     //Hecho por Lamkros