Peppyno89
29-01-2015, 11:18
Salve a tutti.
Sto avendo un problema con questo esercizio universitario.
Dato in input un tot di elementi che si vanno ad inserire in un array, attraverso l'algoritmo di ricerca binaria dovrei costruirmi questo "BST". Ma il programma mi crasha gia al primo while della funzione "Creaalbero".
#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));
while(i < dim-1)
{
pt->valore = Array[i+1];
corr = *radice;
/* QUI IL PROGRAMMA MI CRASHA */
while(pt->valore <= corr->valore && corr->sinistro != "NULL")
{
corr = corr->sinistro; /* IPOTIZZO IL PROBLEMA STIA NEL COPIARE IL NODO FIGLIO AL NODO PADRE */
}
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);
}
}
Ho fatto gia altri esercizi con liste linkate e con alberi generici e binari ma questi passaggi mi creano ancora problemi.
Ringrazio chiunque possa darmi una dritta! :help: :help: :help:
Sto avendo un problema con questo esercizio universitario.
Dato in input un tot di elementi che si vanno ad inserire in un array, attraverso l'algoritmo di ricerca binaria dovrei costruirmi questo "BST". Ma il programma mi crasha gia al primo while della funzione "Creaalbero".
#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));
while(i < dim-1)
{
pt->valore = Array[i+1];
corr = *radice;
/* QUI IL PROGRAMMA MI CRASHA */
while(pt->valore <= corr->valore && corr->sinistro != "NULL")
{
corr = corr->sinistro; /* IPOTIZZO IL PROBLEMA STIA NEL COPIARE IL NODO FIGLIO AL NODO PADRE */
}
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);
}
}
Ho fatto gia altri esercizi con liste linkate e con alberi generici e binari ma questi passaggi mi creano ancora problemi.
Ringrazio chiunque possa darmi una dritta! :help: :help: :help: