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?