Per il passaggio di radice alla funzione, posso provare come dici tu ma ho gia costatato che il valore radice viene passato correttamente nella funzione e anche alla cariabile corr con delle printf subito dopo i passaggi.
Il crash l'ho risolto inserendo le allocazioni di memoria dei nodi figli.
corr->sinistro = calloc(1, sizeof (struct nodo));
corr->destro = calloc(1, sizeof (struct nodo));
Ho modificato anke tutte le altre allocazioni di memoria da malloc a calloc.
Con malloc ad ogni ciclo while mi tornava la copia dell'indirizzo di memoria, adesso mi torna il valore 0 sempre.
Questo è il codice aggiornato
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 = calloc(1, sizeof (struct 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;
printf("\n");
NODO *pt;
pt = calloc(1, sizeof (struct nodo));
while(i < dim-1)
{
pt->valore = Array[i+1];
NODO *corr;
corr = calloc(1, sizeof (struct nodo));
corr = *radice;
corr->sinistro = calloc(1, sizeof (struct nodo));
corr->destro = calloc(1, sizeof (struct nodo));
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++;
printf("\n");
}
}
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);
}
}