Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    [c]

    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?

  2. #2

    Moderazione

    Ho dato un titolo un po' più significativo alla discussione (come da regolamento); in futuro imposta la discussione correttamente fin dall'inizio.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Me ne ero completamente dimenticato! :S Scusate....

  4. #4
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Io scrissi così la funzione, se ti può essere utile:

    codice:
    int campionati_pilota(TTree tree, char pilota[]){
        if(tree==NULL){
            return 0;
        }
        return (campionati_pilota(tree->left, pilota) + campionati_pilota(tree->right, pilota) + (!strcmp(tree->info.satellite.pilota, pilota) ? 1 : 0));
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Ma perchè il valore di ritorno è int? Sicuro che parliamo della stessa funzione?

  6. #6
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da slashino
    Ma perchè il valore di ritorno è int? Sicuro che parliamo della stessa funzione?
    Ritornava il numero di campionati vinti di quel pilota..

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Ed è molto diversa da quella che ho postato io...xD

  8. #8
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da slashino
    Ed è molto diversa da quella che ho postato io...xD
    Credo che la traccia sia la stessa.. in ogni caso puoi anche prendere spunto, a me la funzione gira bene

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Ma fanno due cose completamente diverse, non hanno assolutamente legami!
    Grazie comunque...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.