Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] implementazione albero con puntatori

    Salve a tutti,
    ho scritto il seguente semplice programma per la creazione di un albero tramite puntatori:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct nodo
    { 
        int info;
        struct nodo *left;
        struct nodo *right;
    };
    
    struct nodo *r;
    
    struct nodo *inserimento(struct nodo *, char, int);
    
    int main ()
    {
        
        r = inserimento(r, 'X', 0);
        
        return 0;
    }
    
    
    struct nodo *inserimento(struct nodo *p, char pos_figlio, int padre){
        char command;
        
        if (pos_figlio == 'X') {
            p = (struct nodo *) malloc(sizeof(struct nodo));
            printf("Inserisci valore radice: ");
            scanf("%d", &p->info);
            p->left = NULL;
            p->right = NULL;
            p->left = inserimento(p->left, 'S', p->info);
            p->right = inserimento(p->right, 'D', p->info);
        }
        else {    
            printf("Vuoi inserire il figlio %c di %d? ", pos_figlio, padre);
            scanf("%c", &command);
            if (command == 's'){
                p = (struct nodo *) malloc(sizeof(struct nodo));
                printf("Inserisci valore del figlio %c di %d: ", pos_figlio, padre);
                scanf("%d", &p->info);
                p->left = NULL;
                p->right = NULL;
                p->left = inserimento(p->left, 'S', p->info);
                p->right = inserimento(p->right, 'D', p->info);    
            }
        }
        
        return(p);
    }
    In fase di compilazione non ottengo nessun errore; ma in fase di esecuzione, dopo aver generato il nodo radice, il programma non attende la chiamata di input per sapere se voglio o meno inserire dei figli per il relativo nodo: praticamente ignora la chiamata scanf("%c", &command); e ciò che segue.
    Potreste aiutarmi?

    Grazie mille in anticipo.

  2. #2
    Ciao 19pino87,

    Premetto che non è da molto tempo che mi cimento con i BST,ma se il mio modesto parere può esserti utile mi pare che tu nel main abbia fatto un'unica invocazione della function di insert di 'X'.Una volta inserito la root o nodo padre è probabile che il tuo programma non attenda la richiesta di input al figlio perchè il tuo frammento di codice giace in un else,quindi l'istruzione viene letta dal programma come alternativa all'if,di conseguenza una volta che il programma inserisce 'X' come radice vede 'else'(altrimenti,oppure---->inserisci figlio),pertanto la logica del compilatore gli suggerisce di "non lavorare":Ho inserito 'X'??Sì,quindi nn devo chiedere se vuole il figlio(perchè la printf di figlio sta in else,quindi è un'alternativa alla prima istruzione non viene passata è intesa come istruzione necessaria).
    Ribadisco forse non è questo il problema o io nn ho inteso bene la domanda,in caso contrario spero che il mio suggerimento ti sia d'aiuto.
    Buona fortuna

  3. #3
    Il programma esegue correttamente ciò che è contenuto all'interno dell' if (pos_figlio == 'X')!!
    Anzi "troppo velocemente": nel senso che tra le due istruzioni
    codice:
    ...
    p->left = inserimento(p->left, 'S', p->info);
    p->right = inserimento(p->right, 'D', p->info);
    la seconda non aspetta che la prima termini.
    Penso sia un problema legato alla ricorrenza, ma non riesco a capire nè quale sia nè dove sia.

    Ti ringrazio in ogni caso Frank88

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Praticamente siccome scanf legge le informazioni da stdin (lo stream di input), il ciclo viene eseguito velocemente e la scanf legge i valori vecchi che avevi inserito.
    Se sei in un ciclo e usi tante scanf,per pulire il buffer ti conviene usare la fflush:
    codice:
    // esempio
    while(...)
    {
    scanf(...);
    ...
    fflush(stdin);  // pulisci il buffer
    }
    Questo sotto windows, altrimenti:
    codice:
    while(getchar()!=10)
        ;                             // istruzione vuota, dice di aspettare finchè non
                                      // legge il carattere invio
    Comunque ci sono funzioni più comode per prendere dati in input senza complicazioni, la scanf è pericolosa perchè se non gli dai il tipo di dato che chiedi rischi di entrare in un loop infinito.Consiglio di usare fgets per prendere una stringa, per poi eventualmente convertirla in un intero con atoi (o con atof se ti serve un double), senza bisogno di pulire il buffer.

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.