Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Ricerca stringa in un albero binario

    Salve a tutti. Ho un albero binario la cui chiavi è l'anno in cui si è svolto un determinato campionato di Moto GP. Devo scrivere una funzione ricorsiva che cerchi quale pilota ha vinto più edizioni.
    Il mio dubbio è che non so come cercare la stringa "pilota", dato che non è una chiave. Gli alberi a quanto ho capito sono strutturati in modo tale che a sinistra va l'elemento minore, e a destra l'elemento maggiore (in questo caso gli anni delle edizioni). Come posso sapere se devo cercare a destra o a sinistra?
    Io ho provato a scriverla così, ma naturalmente funziona solo la prima parte:

    codice:
    TNode* campionati_pilota(TTree tree, char pilota[]){
        if(tree==NULL || strcmp(tree->info.satellite.pilota, pilota)==0){
            return tree;
        }else{
            campionati_pilota(tree->right, pilota);
            campionati_pilota(tree->left, pilota);
        }
    }
    Se inserisco il primo pilota che ho inserito, la funziona mi restituisce il numero di edizione vinte del pilota, quindi la prima parte della funzione va bene. Se inserisco già il secondo pilota inserito da tastiera, mi dice "Pilota non trovato". Non so come determinare se il pilota va cercato a destra o a sinistra.

    Ho immaginato che la funziona vada scritta così:

    codice:
    if(...){
         campionati_pilota(tree->right, pilota);
    }else
         campionati_pilota(tree->left, pilota);
    Ma non so cosa dovrei mettere nell'if, forse una strcmp?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    A mio parere ti conviene cercare il numero di occorrenze per ogni pilota con un una funzione tipo:
    codice:
    int funzione(albero, nomepilota) {
      if(albero == NULL)
        return 0;
      return (funzione(albero->sinistra, nomepilota) + funzione(albero->destra, nomepilota) + (!strcmp(albero->nomepilota, pilota) ? 1 : 0));
    }
    è pseudocodice da modificare...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Non mi è molto chiaro..
    In effetti contare le occorrenze sarebbe la soluzione più giusta, ma non ho capito il metodo che mi hai suggerito..

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    La funzione ritorna 1 + la ricerca nei nodi figli se nome è uguale a quello inserito altrimenti zero più la ricerca nei nodi figli...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    ma l'albero è già dato? perchè in effetti avere quella chiave, per il problema che hai, non è proprio il massimo...

  6. #6
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da Mond0
    ma l'albero è già dato? perchè in effetti avere quella chiave, per il problema che hai, non è proprio il massimo...
    L'albero lo creo io e inserisco i dati. La chiave è l'anno in cui si è svolta l'edizione del campionato.

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Hai provato con la funzione che ti ho scritto??
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da Scara95
    Hai provato con la funzione che ti ho scritto??
    L'ho scritta così ma la strcmp non l'ho capita..

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

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non restituisce sempre 1...
    strcmp restituisce 0 se le stringhe sono uguali, il ! non fa altro che cambiarlo in 1 per fare risultare true l'if o, in questo caso, l'operatore ternario ? :
    Provala e vedrai che è corretta, ammesso che tu inserisca correttamente i dati...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da Scara95
    Non restituisce sempre 1...
    strcmp restituisce 0 se le stringhe sono uguali, il ! non fa altro che cambiarlo in 1 per fare risultare true l'if o, in questo caso, l'operatore ternario ? :
    Provala e vedrai che è corretta, ammesso che tu inserisca correttamente i dati...
    Mi restituisce sempre 1, i dati li inserisco correttamente.

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.