Visualizzazione dei risultati da 1 a 6 su 6

Visualizzazione discussione

  1. #5
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Il problema credo ke sia sempre qui:

    while(pt->valore <= corr->valore && corr->sinistro != NULL)
    {
    corr = corr->sinistro;
    }

    while(pt->valore >= corr->valore && corr->destro != NULL)
    {
    corr = corr->destro;
    }


    Per inserire ad esempio i valori 5,6,7 fino al 6 il programma non mi da problemi, inserendo 5 come radice e 6 come
    nodofiglio destro di radice. Il problema è quando inserisce il valore 7, che dovrebbe posizionarsi come figlio
    destro del figlio destro di radice ma il programma non passa corr->destro in corr...

    Questa è la versione aggiornata con alcune modifiche consigliate da voi...
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct nodo{
        int valore;
        struct nodo *sinistro;
        struct nodo *destro;
    };
    
    typedef struct nodo NODO;
    
    void CreaAlbero(int Array[], int dim, void **);
    void PREORDER(void **);
    void INORDER(void **);
    void POSTORDER(void **);
    
    void main()
    {
        int dim;
    
        printf("Inserire la dimensione dell'array (numero elementi albero binario):\n");
        scanf("%d",&dim);
    
        int Array[dim];
    
        int i;
        for(i=0; i<dim; i++)
        {
            printf("Inserire un valore numerico: ");
            scanf("%d",&Array[i]);
        }
    
        NODO *radice;
        radice = malloc(sizeof(NODO));
        radice->valore = Array[0];
    
        system("cls");
        printf("Creazione albero...\n\n");
    
        CreaAlbero(Array, dim, (void **)&radice);
    
        INIZIO:
        printf("\n");
        int selezione;
    
        printf("Digitare:\n");
        printf("0 per la visita preorder\n");
        printf("1 per la visita inorder\n");
        printf("2 per la visita postorder\n");
    
        scanf("%d",&selezione);
    
        switch(selezione)
        {
    
            case 0:
            {
                printf("\nVisita dell'albero in ordine Preoder\n");
                PREORDER((void **)&radice);
            }
            break;
    
            case 1:
            {
                printf("\nVisita dell'albero in ordine Inorder\n");
                INORDER(radice);
            }
            break;
    
            case 2:
            {
                printf("\nVisita dell'albero in ordine Postorder\n");
                POSTORDER(radice);
            }
            break;
        }
    
        system("pause");
        system("cls");
        goto INIZIO;
    
        _getch();
    }
    
    
    void CreaAlbero(int Array[], int dim, void **radice)
    {
        int i = 0;
    
        NODO *pt;
        pt = malloc(sizeof(NODO));
    
        NODO *corr;
        corr = malloc(sizeof(NODO));
        corr = *radice;
        corr->sinistro = malloc(sizeof(NODO));
        corr->sinistro = NULL;
        corr->destro = malloc(sizeof(NODO));
        corr->destro = NULL;
    
        while(i < dim-1)
        {
            pt->valore = Array[i+1];
    
            while(pt->valore <= corr->valore && corr->sinistro != NULL)
            {
                corr = corr->sinistro;
            }
    
            while(pt->valore >= corr->valore && corr->destro != NULL)
            {
                corr = corr->destro;
            }
    
            if(pt->valore <= corr->valore)
            {
                corr->sinistro = pt;
            }
            else
            {
                corr->destro = pt;
            }
    
            i++;
        }
    }
    
    
    void PREORDER(void **radice)
    {
        NODO *nodo;
        nodo = *radice;
    
        if(nodo != NULL)
        {
            printf("%d\n", nodo->valore);
            PREORDER( nodo->sinistro );
            PREORDER( nodo->destro );
        }
    }
    
    
    void INORDER(void **radice)
    {
        NODO *nodo;
        nodo = *radice;
    
        if(nodo != NULL)
        {
            INORDER( nodo->sinistro );
            printf("%d\n", nodo->valore);
            INORDER( nodo->destro );
        }
    }
    
    
    void POSTORDER(void **radice)
    {
        NODO *nodo;
        nodo = *radice;
    
        if(nodo != NULL)
        {
            POSTORDER( nodo->sinistro );
            POSTORDER( nodo->destro );
            printf("%d\n", nodo->valore);
        }
    }
    Ultima modifica di Peppyno; 29-01-2015 a 20:53

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.