Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [c] a proposito di alberi binari

    Ciao! Ho fatto questa funzione che dovrebbe eliminarmi le foglie...
    avevo fatto quella per visualizzarle nella stessa maniera di questa solo con un printf al posto della free e allora funzionava.
    Qui il problema credo, che ci sia perchè prima elimino una foglia e poi gli dico di accedere alla parte destra ad esempio.
    Fatto sta che non ci sono errori di compilazione ma al posto di cancellare una foglia resta un numero residuo che viene visualizzato qualora richiamo la procedura per stampare l'albero. Come dovrei fare?
    Basterebbe una piccola modifica a questa fnz ricorsiva?

    typedef struct nodo *tree;
    codice:
    void eliminafoglie(tree T)
    {
      if(!T) return;
    
      eliminafoglie(T->left);
      if(T->left==NULL && T->right==NULL) free(T);
      eliminafoglie(T->right);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    adesso ho fatto questa modifica che mi sembrava sostanziale:
    codice:
    if(T) eliminafoglie(T->right);
    macchè, ottengo sempre lo stesso risultato quando stampo l'albero:

    0 50 39668048

    avendo inserito: 50,30,90

    avrei dovuto vedere solo 50.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    adesso ho provato cosi:

    codice:
    void eliminafoglie(tree *T)
    {
      if(!*T) return;
    
      eliminafoglie(*T->left);
      if(*T->left==NULL && *T->right==NULL) {free(**T); *T = NULL;}
      if(*T) eliminafoglie(*T->right);
    }
    perchè il comp. mi dice su ogni riga questo?
    request for member `left' in something not a structure or union

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    87
    Originariamente inviato da Lucked
    adesso ho provato cosi:

    codice:
    void eliminafoglie(tree *T)
    {
      if(!*T) return;
    
      eliminafoglie(*T->left);
      if(*T->left==NULL && *T->right==NULL) {free(**T); *T = NULL;}
      if(*T) eliminafoglie(*T->right);
    }
    perchè il comp. mi dice su ogni riga questo?
    request for member `left' in something not a structure or union
    Non vorrei dire cavolate ma mi pare che tu debba metterlo in questo modo (*T)->left e (*T)->right e non dovrebbe più lamentarsi...
    Ciao ciao!
    vlr

  5. #5
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da Lucked
    adesso ho provato cosi:

    codice:
    void eliminafoglie(tree *T)
    {
      if(!*T) return;
    
      eliminafoglie(*T->left);
      if(*T->left==NULL && *T->right==NULL) {free(**T); *T = NULL;}
      if(*T) eliminafoglie(*T->right);
    }
    perchè il comp. mi dice su ogni riga questo?
    request for member `left' in something not a structure or union
    Penso che la condizione di uscita debba essere
    if (T == NULL) oppure if (!T) (e non if (!*T) )

    Inoltre o scrivi T->left oppure scrivi (*T).left

    Occhio a confondere un "puntatore a struct nodo" con una "struct nodo" ...

  6. #6
    la freccetta [->] è di per se un operatore di rinvio come *

    quindi... come diceva ed bunker..

    (*T).left

    oppure

    T->left

    in prtatica la freccetta accede al membro left del dato puntato da T.. quindi non server l'asterisco all'inizio.. è eper quello che ti dice che cerchi di accedere ad un membro di qualcosa che non è una struttura...

  7. #7
    Io di solito faccio cosi:
    codice:
     
    void Delete(Node aux)
    {
    	while(aux != NULL)
    	{
    		free(aux->l);
    		free(aux->r);
    		free(aux);
    	}
    	aux = NULL;
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    Re: [c] a proposito di alberi binari

    Originariamente inviato da Lucked

    typedef struct nodo *tree;
    codice:
    void eliminafoglie(tree T)
    {
      if(!T) return;
    
      eliminafoglie(T->left);
      if(T->left==NULL && T->right==NULL) free(T);
      eliminafoglie(T->right);
    }
    In C i parametri sono passati per valore, non per riferimento; quindi se il parametro iniziale T punta a un albero costituito da una sola foglia, alla fine della procedura T dovrebbe valere NULL; ma poichè tu passi il puntatore stesso T, all'uscita della funzione, T continuerà a puntare alla locazione di prima. Quindi o passi T per riferimento, cioè un puntattore a tree (tree *), oppure utilizzi il valore di ritorno:

    codice:
    tree eliminafoglie(tree T)
    {
      if(!T)
         return NULL;
      //Se T è una foglia libero la memoria e ritorno NULL
      if(T->left == NULL && T->right == NULL){
           free(T);
           return NULL;
      }
      //Imposto i nuovi valori di T -> left e T -> right
      T->right = eliminafoglie(T->right);
      T->left = eliminafoglie(T->left);
      return T;
    }
    Un buon esercizio sarebbe riuscire a riscrivere la procedura con valore di ritorno void, ma passandole come argomento un (tree *), cioè &T, e non un tree


  9. #9

    Soluzione

    Prova a fare kosi:


    void deleteTree(TreePtr *T)
    {
    if(*T){

    if(!(*T)->left && !(*T)->right){
    free(*T);
    return ;}
    else{
    deleteTree(&((*T)->left));
    deleteTree(&((*T)->right));
    }
    }
    else return ;
    }

    Spero ke funzioni prova e poi fammi sapere qualcosa..

    Ciauzzz
    DD

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    26
    scusate la mia completa ignoranza, ma qual'è il principale utilizzo di questa struttura ad albero binario?

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.