Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61

    [C] - Alberi binari: inserire nuovo nodo

    Ciao ragazzi,

    qualcuno saprebbe dirmi perchè in questa funzione per inserire nuovi nodi in un albero binario non viene mai eseguita l'ultima istruzione (praticamente quando l'albero è vuoto...) e più in generale come potrei modificarla per renderla funzionante?

    codice:
    struct nodo {
     char *parola;
     int occorrenze;
     struct nodo *left;
     struct nodo *right;
     struct nodo *father;
    };
    
    void TreeInsert(struct nodo *albero, struct nodo *nuovo)
    {
     if(albero)
      if(strcmp(nuovo->parola,albero->parola) == 0)
       albero->occorrenze++;
      else
       if(strcmp(albero->parola,nuovo->parola) < 0)
        TreeInsert(albero->left,nuovo);
       else
        TreeInsert(albero->right,nuovo);
     else
      albero = nuovo;
    }
    Grazie a tutti

  2. #2
    prova usando un pò di graffe per identificare i corpi delle varie istruzioni if.

    ciao

  3. #3
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Tu cerchi di modificare il puntatore albero, ma siccome stai chiamando una funzione, lavori su una copia dei dati.

    Possibili soluzioni:
    - Uso di vaiabili globali x la radice
    - Passaggio di parametri indirizzo (solo C++, consigliato per C++)
    - Parametro alero com puntatore a puntatore (consigliato per C)


  4. #4
    uhm cioè tu dici che questo non te lo prende?

    Codice PHP:
    void TreeInsert(struct nodo *alberostruct nodo *nuovo)
    {
     -if(
    albero)
     |  -if(
    strcmp(nuovo->parola,albero->parola) == 0)
     |  |  
    albero->occorrenze++;
     |  -else
     |  
     |  -if(
    strcmp(albero->parola,nuovo->parola) < 0)
     |  |  
    TreeInsert(albero->left,nuovo);
     |  -else
     |    
    TreeInsert(albero->right,nuovo);
     |-else
        
    albero nuovo;

    dunque...vediamo un po
    hai provato a mettere qualcosa del tipo
    if (albero!=NULL){
    }

    usa le parentesi graffe anche se teoricamente non servono servono per far capire meglio cosa accade...
    byeeeeeeezzzzzzzzzzzzzzzzzzzz

  5. #5
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    if(albero!=NULL) equivale a dire if(albero), perchè NULL = 0.
    Le parentesi graffe non sono indispensabili in questo caso.

    Io continuo a sostenere la mia tesi...
    Hai provato?


  6. #6
    lo so che è uguale...ma sai com'è...a volte funge
    cmq...attendiamo risposte
    byeeeeezzzzzzzzzzzzzzzzzzzzzzz

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61
    Non cambia niente (come immaginavo...) inserendo le parentesi graffe o scrivendo if(albero!=NULL) al posto di if(albero).

    Piuttosto sarebbe interessante la soluzione del parametro albero come puntatore a puntatore; qualche indicazione in più...?

    Ciao

  8. #8
    io faccio cosi:
    codice:
    void CTree::InternalAdd(int n, PCTreeNode& ARoot)
    {
         if (ARoot == NULL)
         {
             ARoot = new CTreeNode;
             ARoot->n = n;
             ARoot->left = NULL;
             ARoot->right = NULL;
         }
         else
         if (n <= ARoot->n) InternalAdd(n, ARoot->left);
         else
         if (n > ARoot->n) InternalAdd(n, ARoot->right);
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  9. #9
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Ebbasta con copiare le tue funzioni, Lucas!
    Pensa a correggere il suo codice!

    Tra l'altro sta parlando di C, non C++, quindi il tuo codice non va.

    Prova così (non testato):
    codice:
    struct nodo {
     char *parola;
     int occorrenze;
     struct nodo *left;
     struct nodo *right;
     struct nodo *father;
    };
    
    void TreeInsert(struct nodo **albero, struct nodo *nuovo)
    {
     if(*albero)
      if(strcmp(nuovo->parola,(*albero)->parola) == 0)
       (*albero)->occorrenze++;
      else
       if(strcmp((*albero)->parola,nuovo->parola) < 0)
        TreeInsert((*albero)->left,nuovo);
       else
        TreeInsert((*albero)->right,nuovo);
     else
      *albero = nuovo;
    }
    Tutto questo casino di asterischi è conseguenza del fatto che tu devi poter modificare il puntatore albero (cambiandolo con nuovo), quindi usi un puntatore a puntatore.


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 © 2025 vBulletin Solutions, Inc. All rights reserved.