Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65

    [C] creare un albero binario di ricerca con puntatore a puntatore

    Ciao. ho difficolta a creare un albero binario di ricerca con i puntatori a puntatori. Con il singolo puntatore ci sono riuscito. qualcuno saprebbe dirmi dove sbaglio in questo codice?

    codice:
    typedef struct nodo
       {
         int info;
         struct nodo  *sinistro;
         struct nodo  *destro;
       }nod;
    
    int vuoto(nod **rad)
    {
     if((*rad))/*rad == NULL*/
       return 0;/*albero vuoto*/
     else 
       return 1;/*albero non vuoto*/
    }
    
    void inserisci(nod **punt,int numero)
    {
      if (vuoto(punt))/*se punt==NULL*/
        {
          punt=(nod**)malloc(sizeof(nod));/*inserimento valore*/
          (*punt)->info=numero;
          (*punt)->sinistro=NULL;
          (*punt)->destro=NULL;
        }
      else
        {
          if (numero>(*punt)->info)/*scorriamo a destra*/
             inserisci(&(*punt)->destro,numero);
          else  /*scorriamo a sinistra*/   
             inserisci(&(*punt)->sinistro,numero);
        }
           
    }
    nod **crea_albero()
    {
     int val;
     nod **p;
     *p=NULL;
     do
      {
        printf("INSERIRE VALORE : \n");
        scanf("%d", &val);   
        if (val!=0)     /*possiamo inserire il valore*/
          inserisci(p,val);
       }
     while (val!=0);
     return p;  
    }
    
    int main()
    {
      nod **rad;
      printf("creazione ALBERO \n");
      rad=crea_albero();
    }
    il programma appena lo lancio va subito in loop.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    ragazzi non so più che fare mi aiutate????

  3. #3

    Re: [C] creare un albero binario di ricerca con puntatore a puntatore

    Originariamente inviato da mame83

    codice:
    typedef struct nodo
       {
         int info;
         struct nodo  *sinistro;
         struct nodo  *destro;
       }nod;
    
    int vuoto(nod **rad)
    {
     if((*rad))/*rad == NULL*/
       return 0;/*albero vuoto*/
     else 
       return 1;/*albero non vuoto*/
    }
    il programma appena lo lancio va subito in loop.

    Mmm premetto che non ho mai lavorato con questo tipo di dati... però un paio di cose posso azzardarle..

    Per comodità non ti converrebbe fare un nuovo typedef ? Qualcosa tipo:

    codice:
    typedef nod* node
    Forse aiuterebbe a fare un po' di chiarezza

    Poi non so, non mi convince molto la funzione vuoto.. La prima condizione (per verificare se sia vuoto) non converrebbe esplicitarla:

    codice:
    if ((*rad) == NULL)
    ??

    Se ti va in loop ci deve essere qualche ciclo che non termina, con il debugger non arrivi a nessuna conclusione?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    facendo diversi test va in loop appena vede l istruzione *p=NULL.
    ho provato a fare quest altra versione con void.

    codice:
    #include <stdio.h>
    #include <malloc.h>
    typedef struct nodo
       {
         int info;
         struct nodo  *sinistro;
         struct nodo  *destro;
       }nod;
    
    int vuoto(nod **rad)
    {
     if((*rad))/*rad == NULL*/
       return 0;/*albero vuoto*/
     else 
       return 1;/*albero non vuoto*/
    }
    
    void inserisci(nod **punt,int numero)
    {
      if (vuoto(punt))/*se punt==NULL*/
        {
          punt=(nod**)malloc(sizeof(nod));/*inserimento valore*/
          (*punt)->info=numero;
          (*punt)->sinistro=NULL;
          (*punt)->destro=NULL;
        }
      else
        {
          if (numero>(*punt)->info)/*scorriamo a destra*/
             inserisci(&(*punt)->destro,numero);
          else  /*scorriamo a sinistra*/   
             inserisci(&(*punt)->sinistro,numero);
        }
           
    }
    void crea_albero(nod **p)
    {
     int val;
     
     do
      {
        printf("INSERIRE VALORE : \n");
        scanf("%d", &val);   
        if (val!=0)        /*possiamo inserire il valore*/
          inserisci(p,val);
      }
     while (val!=0);
    }
    int main()
    {
      nod **rad;
      printf("creazione ALBERO \n");
      *rad=NULL;
      printf("chiamo la funzione \n");
      crea_albero(rad);
    }
    mi va in loop subito dopo la printf("creazione albero \n");

    spero mi aiutate

  5. #5
    So che magari sparo anche cavolate ma vado anche io un po' a tentativi

    Nel main, rad è già un puntatore a puntatore a nod, giusto?
    Quindi quando lo inizializzi a NULL, perchè non provi a scrivere solo rad invece che *rad?
    E poi in che senso va in loop? Schermata bianca che non fa niente o segmentation fault?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    si blocca . ed esce la finestra di microsft windows dicendomi il programma ha smesso di funzionare. il problema è che non riesco a capire come si fa a inizializzare un puntatore a puntatore a null? nel puntatore singolo si faceva punt=NULL.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    14
    tanto per iniziare la funzione vuoto riporta i valori al contrario

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    ho messo p=NULL e si blocca dopo quando vado ad inserire il valore.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    14
    sicuro che hai letto quello che ho scritto?

  10. #10
    Originariamente inviato da kafley
    tanto per iniziare la funzione vuoto riporta i valori al contrario
    Sinceramente anche a me sembrava così... però, in pseudocodice, quello che ha scritto lui equivale a: se la l'elemento puntato da rad (che è a sua volta un puntatore) ha senso, ritorna FALSE (non è vuoto!), altrimenti ritorna TRUE (è vuoto!). E potrebbe tornare, anche se la condizione per stabire che l'albero sia vuoto io la espliciterei con un bel

    codice:
    if (*rad == NULL)
    Poi si, togliendo che non sono sicuro che vada bene come l'ha scritta lui, ha anche invertito i commenti
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

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.