SVNiko ha scritto:
Ti dispiace postare il codice con le definizioni dei dati.
Eh è un bel po' complesso, perchè in realtà sto facendo un inserimento in heap che dev'essere implementato con un albero binario puntato (per l'implementazione con array c'è un altra libreria che ho già scritto).. La funzione di ricerca mi serve a trovare il padre a cui agganciare il nuovo nodo.
((i vari commenti e printf sono per fare le correzioni))
dall'header file
typedef struct binarytree * TREE;
typedef struct node * NODE;
typedef struct binarytree{
int size;
struct node * element;
}binarytree;
typedef struct node{
void *data;
int priority;
struct node * parent;
struct node * sx;
struct node * dx;
}node;
void * treeInsert (void * T, void * k)
{//il prototipo non può cambiare rispetto a quello dell'array altrimenti non va bene per le callback
TREE t=(TREE)T;
NODE last=t->element;
NODE nuovo=(node*)malloc(sizeof(node));
nuovo->data=k;
nuovo->priority=t->size;
nuovo->sx=NULL;
nuovo->dx=NULL;
if(last==NULL)
{
nuovo->parent=NULL;
t->element=nuovo;
}
else
{
last=searchParent(last, t->size);
printf("last=%d, key %d\n",(int)last->data,(int)k);
nuovo->parent=last;
if(last->sx==NULL)
{last->sx=nuovo; last=last->sx;}
else {last->dx=nuovo; last=last->sx;} //last diventa il nodo inserito
while(last->data>last->parent->data)
{//aggiornamento ordine heap
last=treeSwap(last, last->parent);
last=last->parent;
}
}
t->size=t->size+1;
return t;
NODE searchParent (NODE n, int size)
{
if(((size-1)/2) == n->priority)
{printf("TROVATO %d\n",(int)n->data);
return n;}
if(n->sx!=NULL)
n=searchParent(n->sx,size);
if(n->dx!=NULL)
n=searchParent(n->dx,size);
}
In effetti la ricerca deve andare per forza a buon fine, non può ritornare null perchè il nodo che cerco c'è per forza in quanto è un calcolo matematico sulla priorità, ma il problema resta sempre che la ricerca non va mai a destra. Nell'inserimento sicuramente ci sono altri errori ma ancora ci devo arrivare a correggerli in quanto la ricerca non va a buon fine, per cui mi aggiunge appunto solo a sinistra.