PDA

Visualizza la versione completa : [C] Creare un albero binario di ricerca con puntatore a puntatore


mame83
17-01-2011, 18:42
Ciao. ho difficolta a creare un albero binario di ricerca con i puntatori a puntatori. Con il singolo puntatore ci sono riuscito. qualcuno saprebbe dirmi dove sbaglio in questo codice?



typedef struct nodo
{
int info;
struct nodo *sinistro;
struct nodo *destro;
}nod;

int vuoto(nod **rad)
{
if((*rad))/*rad == NULL*/
return 0;/*albero vuoto*/
else
return 1;/*albero non vuoto*/
}

void inserisci(nod **punt,int numero)
{
if (vuoto(punt))/*se punt==NULL*/
{
punt=(nod**)malloc(sizeof(nod));/*inserimento valore*/
(*punt)->info=numero;
(*punt)->sinistro=NULL;
(*punt)->destro=NULL;
}
else
{
if (numero>(*punt)->info)/*scorriamo a destra*/
inserisci(&(*punt)->destro,numero);
else /*scorriamo a sinistra*/
inserisci(&(*punt)->sinistro,numero);
}

}
nod **crea_albero()
{
int val;
nod **p;
*p=NULL;
do
{
printf("INSERIRE VALORE : \n");
scanf("%d", &val);
if (val!=0) /*possiamo inserire il valore*/
inserisci(p,val);
}
while (val!=0);
return p;
}

int main()
{
nod **rad;
printf("creazione ALBERO \n");
rad=crea_albero();
}


il programma appena lo lancio va subito in loop.

mame83
18-01-2011, 15:03
ragazzi non so più che fare mi aiutate???? :dhò: :dhò:

Laikius91
18-01-2011, 15:21
Originariamente inviato da mame83



typedef struct nodo
{
int info;
struct nodo *sinistro;
struct nodo *destro;
}nod;

int vuoto(nod **rad)
{
if((*rad))/*rad == NULL*/
return 0;/*albero vuoto*/
else
return 1;/*albero non vuoto*/
}


il programma appena lo lancio va subito in loop.


Mmm premetto che non ho mai lavorato con questo tipo di dati... però un paio di cose posso azzardarle..

Per comodità non ti converrebbe fare un nuovo typedef ? Qualcosa tipo:


typedef nod* node

Forse aiuterebbe a fare un po' di chiarezza :)

Poi non so, non mi convince molto la funzione vuoto.. La prima condizione (per verificare se sia vuoto) non converrebbe esplicitarla:


if ((*rad) == NULL)

??

Se ti va in loop ci deve essere qualche ciclo che non termina, con il debugger non arrivi a nessuna conclusione?

mame83
18-01-2011, 16:33
facendo diversi test va in loop appena vede l istruzione *p=NULL.
ho provato a fare quest altra versione con void.



#include <stdio.h>
#include <malloc.h>
typedef struct nodo
{
int info;
struct nodo *sinistro;
struct nodo *destro;
}nod;

int vuoto(nod **rad)
{
if((*rad))/*rad == NULL*/
return 0;/*albero vuoto*/
else
return 1;/*albero non vuoto*/
}

void inserisci(nod **punt,int numero)
{
if (vuoto(punt))/*se punt==NULL*/
{
punt=(nod**)malloc(sizeof(nod));/*inserimento valore*/
(*punt)->info=numero;
(*punt)->sinistro=NULL;
(*punt)->destro=NULL;
}
else
{
if (numero>(*punt)->info)/*scorriamo a destra*/
inserisci(&(*punt)->destro,numero);
else /*scorriamo a sinistra*/
inserisci(&(*punt)->sinistro,numero);
}

}
void crea_albero(nod **p)
{
int val;

do
{
printf("INSERIRE VALORE : \n");
scanf("%d", &val);
if (val!=0) /*possiamo inserire il valore*/
inserisci(p,val);
}
while (val!=0);
}
int main()
{
nod **rad;
printf("creazione ALBERO \n");
*rad=NULL;
printf("chiamo la funzione \n");
crea_albero(rad);
}

mi va in loop subito dopo la printf("creazione albero \n");
:dhò:
spero mi aiutate

Laikius91
18-01-2011, 16:59
So che magari sparo anche cavolate ma vado anche io un po' a tentativi :zizi:

Nel main, rad è già un puntatore a puntatore a nod, giusto?
Quindi quando lo inizializzi a NULL, perchè non provi a scrivere solo rad invece che *rad?
E poi in che senso va in loop? Schermata bianca che non fa niente o segmentation fault?

mame83
18-01-2011, 18:20
si blocca . ed esce la finestra di microsft windows dicendomi il programma ha smesso di funzionare. il problema è che non riesco a capire come si fa a inizializzare un puntatore a puntatore a null? nel puntatore singolo si faceva punt=NULL.

kafley
18-01-2011, 18:29
tanto per iniziare la funzione vuoto riporta i valori al contrario

mame83
18-01-2011, 18:30
ho messo p=NULL e si blocca dopo quando vado ad inserire il valore.

kafley
18-01-2011, 18:39
sicuro che hai letto quello che ho scritto?

Laikius91
18-01-2011, 19:18
Originariamente inviato da kafley
tanto per iniziare la funzione vuoto riporta i valori al contrario

Sinceramente anche a me sembrava così... però, in pseudocodice, quello che ha scritto lui equivale a: se la l'elemento puntato da rad (che è a sua volta un puntatore) ha senso, ritorna FALSE (non è vuoto!), altrimenti ritorna TRUE (è vuoto!). E potrebbe tornare, anche se la condizione per stabire che l'albero sia vuoto io la espliciterei con un bel


if (*rad == NULL)

Poi si, togliendo che non sono sicuro che vada bene come l'ha scritta lui, ha anche invertito i commenti :stordita:

Loading