Salve a tutti. Ho una strutta dati albero definita nel seguente modo:
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 prototipocodice://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;
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 ).codice:t_node* search(t_tree,char[]);
Ho implementato la funzione nel seguente modo:
Effettivamente però è venuta un pò troppo lunghettacodice: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; } } } } } }(tuttavia funziona bene)
Qualcuno mi da qualche consiglio per ridurre il codice?

(tuttavia funziona bene)
Rispondi quotando