Salve a tutti. Ho una strutta dati albero definita nel seguente modo:
codice:
 
//Definizione strutture
struct s_key
{
    int anno;
};
typedef struct s_key t_key;
struct s_sat
{
    char cognome[15];
    char team[15];
    int vittorie;
};
typedef struct s_sat t_sat;
struct s_info
{
    t_key key;
    t_sat satellite;
};
typedef struct s_info t_info;
struct s_node
{
    t_info info;
    struct s_node* right;
    struct s_node* left;
};
typedef struct s_node t_node;
typedef t_node* t_tree;
utilizzata per gestire un elenco di mondiali di F1 che contiene i dati di cui sopra. L'elenco è ordinato in base all'anno di ogni mondiale ( t_key ). Devo scrivere una funzione con il seguente prototipo
codice:
t_node* search(t_tree,char[]);
la quale riceve in ingresso il nome di un pilota, e restituisce il puntatore al nodo con l'anno dove ha conseguito il massimo di vittorie ( in caso di parità di vittorie, prevale quello più recente, quindi con parametro anno maggiore ).
Ho implementato la funzione nel seguente modo:
codice:
t_node* search(t_tree tree,char cognome [])
{
    if(tree==NULL)                                     //caso base
        return NULL;
    else
    {
        t_node* right=search(tree->right,cognome);
        t_node* left=search(tree->left,cognome);
        if(left==NULL && right==NULL)                              //l'unico nodo valido è la radice
        {
            if(strcmp(tree->info.satellite.cognome,cognome)==0)
                return tree;
            else
                return NULL;
        }
        else
        {
            if(left==NULL)                                    //Confronto tra figlio destro e radice
            {
                if(strcmp(tree->info.satellite.cognome,cognome)==0 && tree->info.satellite.vittorie>right->info.satellite.vittorie)
                    return tree;
                else
                    return right;
            }
            else
            {
                if(right==NULL)                            // confronto tra figlio sinistro e radice
                {
                    if(strcmp(tree->info.satellite.cognome,cognome)==0 && tree->info.satellite.vittorie>left->info.satellite.vittorie)
                        return tree;
                    else
                    {
                        if(strcmp(tree->info.satellite.cognome,cognome)==0)
                        {
                            if(tree->info.satellite.vittorie==left->info.satellite.vittorie)
                                return tree;
                            else
                                return left;
                        }
                        else
                            return left;
                    }
                }
                else
                {
                    if(strcmp(tree->info.satellite.cognome,cognome)==0)              //confronto tra radice, figliore desto e figlio sinistro
                    {
                        if(tree->info.satellite.vittorie>=left->info.satellite.vittorie)
                        {
                            if(tree->info.satellite.vittorie<=right->info.satellite.vittorie)
                                return right;
                            else
                                return tree;
                        }
                        else
                        {
                            if(tree->info.satellite.vittorie<= right->info.satellite.vittorie)
                            {
                                if(right->info.satellite.vittorie>=left->info.satellite.vittorie)
                                    return right;
                                else
                                    return left;
                            }
                            else
                                return left;
                        }
                    }
                    else
                    {
                        if(right->info.satellite.vittorie>=left->info.satellite.vittorie)
                                return right;
                        else
                                return left;

                    }
                }
            }
        }
    }
}
Effettivamente però è venuta un pò troppo lunghetta (tuttavia funziona bene)
Qualcuno mi da qualche consiglio per ridurre il codice?