Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di buji
    Registrato dal
    Nov 2002
    Messaggi
    178

    [C] Richiesta chiarimenti su puntatori e strutture

    Buongiorno,
    avrei bisogno che qualcuno mi chiarisse come gestire puntatori a strutture all'interno di altre strutture. Anche qualche chiarimento sulle strutture stesse è graditissimo.
    Ho provato a costruire un albero con una struttura dati caratterizzata da un solo valore intero e funziona, appena provo a gestire una struttura non mi ci raccapezzo.

    Questo è ciò che ho prodotto:

    codice:
    struct tpunto {
           int valore;
    };
    typedef struct tpunto punto;
    
    struct tnode {
           punto *ppunto;
           struct tnode *pleft;
           struct tnode *pright;
    };
    typedef struct tnode nodo;
    
    
    struct tnode *addtree (nodo *p, punto *w) {
           if (p==NULL) {
                 p = (nodo *)malloc(sizeof(struct tnode));
                 p->ppunto = w;
                 p->pleft=p->pright=NULL;
           } else if (p->ppunto->valore <= w->valore) {
                  p->pleft = addtree(p->pleft, w);
           } else {
                  p->pright = addtree(p->pright,w);
           }
           return p;
    }
    
    void visita(nodo *p) {
         if (p != NULL) {
             printf("Valore = %d\n",p->ppunto->valore);
             visita(p->pleft);
             visita(p->pright);
         }
    }
    
    int stampa_albero(nodo *p, char *nome_file) {
        void stampa(nodo *p, int spacer, FILE *fileptr);
        int spacer = 0;
        FILE *file_ptr;
        file_ptr = fopen(nome_file,"w");
        if (file_ptr == NULL) {
            return 0;
        }
        else {
            if (p != NULL) {
                stampa(p, spacer, file_ptr);
                fclose(file_ptr);
            }
        }
        return 1;
    }
    
    void stampa(nodo *p, int spacer, FILE *fileptr) {
           int spacerL = spacer;
           int spacerR = spacer;
           int i = 0;
           for (i; i < spacer; i++) {
              fputs("\t",fileptr);
           }
           if (p != NULL) {
               fprintf(fileptr,"Valore = %d \n",p->ppunto->valore);
               stampa(p->pleft, ++spacerL, fileptr);
               stampa(p->pright, ++spacerR, fileptr);
           } else
               fprintf(fileptr,"NODO - > NULL\n");
    }
    Grazie
    Buji

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Devi essere piu' specifico ... "non mi ci raccapezzo" non serve per darti suggerimenti ...

    Hai un errore? In quale funzione? In quale linea di codice?

  3. #3
    Utente di HTML.it L'avatar di buji
    Registrato dal
    Nov 2002
    Messaggi
    178
    Ho un errore alla prima riga della funzione addtree dove c'è il test if (p==NULL).
    Arresta l'esecuzione del programma.
    Buji

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    E il main?

  5. #5
    Utente di HTML.it L'avatar di buji
    Registrato dal
    Nov 2002
    Messaggi
    178
    Eccolo
    codice:
           nodo *nodo;
           punto x1,x2,x3,x4,x5,x6,x7,x8,x9;
           x1.valore = 10;
           x2.valore = 3;
           x3.valore = 7;
           x4.valore = 12;
           x5.valore = 15;
           x6.valore = 17;
           x7.valore = 19;
           x8.valore = 20;
           x9.valore = 6;
           addtree(nodo,&x1);
           addtree(nodo,&x2);
    Buji

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ecco l'errore ...

    Il puntatore nodo deve essere inizializzato perche' nessuno ti assicura che abbia valore NULL all'inizio. Quindi deve essere

    nodo *nodo = NULL;

    e poi, ti ho detto piu' e piu' volte, non fare confusione tra nomi di strutture, puntatori e nomi di variabili perche', se c'e' un errore, si fa una faticaccia a capirci qualcosa ...

    E' meglio scrivere

    nodo *pnodo = NULL;

  7. #7
    Utente di HTML.it L'avatar di buji
    Registrato dal
    Nov 2002
    Messaggi
    178
    Originariamente inviato da oregon
    e poi, ti ho detto piu' e piu' volte, non fare confusione tra nomi di strutture, puntatori e nomi di variabili perche', se c'e' un errore, si fa una faticaccia a capirci qualcosa ...
    Il problema è che non faccio solo confusione con i nomi.. faccio confuzione con tutto
    Buji

  8. #8
    Originariamente inviato da buji
    Eccolo
    codice:
           nodo *mio_nodo = NULL;
    .....
           addtree(mio_nodo,&x1);
           addtree(mio_nodo,&x2);
    altrimenti nodo è indefinito, inoltre non dargli il nome della struttura.
    ciao
    sergio

  9. #9
    Utente di HTML.it L'avatar di buji
    Registrato dal
    Nov 2002
    Messaggi
    178
    Qualcuno sa consigliarmi dove trovare qualche testo che mi chiarisca le idee?
    Buji

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da buji
    Qualcuno sa consigliarmi dove trovare qualche testo che mi chiarisca le idee?
    Ci sono una marea di testi in libreria e sono tutti equivalenti ... non si puo' sapere se ce n'e' uno che ti "chiarisca le idee" perche' dipende tutto dalle tue idee ... non so se mi sono spiegato ...

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.