Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Puntatori all'interno di strutture

    Ciao a tutti, ho un problema la cui soluzione penso sia abbastanza banale, non capisco proprio come risolvere:
    creo una struttura di nome "nodo" contenente un valore intero ed un 2 puntatori ad una struttura dello stesso tipo. Poi nel main creo due di questi nodi; uno dei 2 puntatori del primo nodo, punta al secondo nodo, metre gli altri puntatori sono NULL. Praticamente creo un piccolo albero binario con nodo radice ed un figlio sinistro. Vorrei poi passare ad una funzione il figlio sinistro(cioè il secondo nodo) tramite il puntatore del primo nodo(radice); so che in generale, per riferirsi a CIO' A CUI PUNTA UN PUNTATORE si usa l'asterisco *.Se io ad esempio scrivo:

    int x =3;
    int* p;
    p=&x;
    printf("il valore è:%d", *p)

    printf stamperà 3. Non so come realizzare la stessa cosa con il caso di prima dei nodi; riporto qui sotto il codice per i nodi:

    #include <stdio.h>
    #include <math.h>

    // creo la struttura nodo
    struct nodo { int value;
    struct nodo* left;
    struct nodo* right; } ;

    void stampa ( struct nodo t) {
    printf("il nodo vale: %d\n", t.value);
    }

    int main() {

    // creo un albero composti dai seguenti nodi
    struct nodo n1,n2;
    // nodo 1
    n1.value = 1;
    n1.left = &n2;
    n1.right = NULL;
    // nodo 2
    n2.value = 2;
    n2.left = NULL;
    n2.right = NULL;

    stampa(n1.*left); // qui non capisco come passare correttamente il parametro !!!!!!!!!!

    return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    codice:
    void stampa (struct nodo *t) {
    printf("il nodo vale: %d\n", t->value);
    }
    
    ...
    
    stampa(n1.left);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ti ringrazio; mi era venuto anche in mente di trasformare il parametro della funzione in un puntatore a struttura, ma provandoci avevo edivendtemente tralasciato qualcosa..
    Quindi in pratica è impossibile affrontare un prolema di questo genere strutturandolo come volevo fare io inizialmente, oppure la tua soluzione è semplicemente la più correta ed usata? grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Johannesynt strutturandolo come volevo fare io inizialmente
    Cioè, come? Non ho capito ...

    oppure la tua soluzione è semplicemente la più correta ed usata? grazie
    Corretta è corretta ... si passa per puntatore una struttura ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Inizialmente io volevo fare una funzione che lavorasse sulla struttura, non sul puntatore ad essa;
    infatti avevo scritto:

    void stampa ( struct nodo t ) {..}

    invece di

    void stampa ( struct nodo *t ) {..}

    mi è venuto naturale provare a fare così perchè quest'argomento ci è stato spiegato in pseudocodice, e ci è stato mostarto così.

    Che la tua soluzione sia corretta non ho mai avuto dubbi, anche perchè funziona perfettamente.
    Quindi come hai detto nell'ultimo messaggio: una struttura si passa PER PUNATORE e basta, giusto?

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    una struttura si passa PER PUNATORE e basta, giusto?
    Fai prima a rispondere alla domanda : cos'è un puntatore.
    Se ti impari a memoria come vanno passate le variabili prima o poi ti scordi.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Johannesynt
    Inizialmente io volevo fare una funzione che lavorasse sulla struttura, non sul puntatore ad essa
    Puoi anche scrivere

    codice:
    void stampa (struct nodo t) 
    {
        printf("il nodo vale: %d\n", t.value);
    }
    
    ...
    
    	stampa(*n1.left);
    e passare la struttura per copia, ma potresti avere problemi specifici in particolari condizioni.

    Quello che devi comprendere è che queste cose vanno studiate nei dettagli e a seconda delle varie situazioni. Non esiste un regola sempre buona e sempre da seguire.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Quindi come hai detto nell'ultimo messaggio: una struttura si passa PER PUNATORE e basta, giusto?
    E' una questione di efficienza. Se non la passi per puntatore, verrà creata una nuova variabile all'interno della funzione che sarà la copia del parametro. Per fare una copia di un int, di un double o di chicchessia non è un problema (copia pochi byte), ma per fare una copia bit a bit di una struttura che magari conterrà molti dati capisci che non è proprio il massimo dell'efficienza.

    Così passi il puntatore e non viene copiato nulla....

  9. #9
    Ok, grazie, ho capito perfettamente. Ma tanto per curiosità, riferendosi al primo codice che ho scritto, come avrei potuto fare per passare alla funzione (che prendeva in input la struttura,non il puntatore) CIO' A CUI PUNTA LEFT NEL NODO N1 (cioè N2...ma tramite N1)?

  10. #10
    Così:
    codice:
    stampa(*(n1.left));

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.