2009-12-31 12 views
1

J'étudiais les arbres et tout semble aller bien jusqu'à ce que je commence un arbre avl, ce qui nécessite une rotation. Je construit un algorithme de rotation qui fonctionne bien jusqu'à ce que 2 ou 3 rotation, l'algorithme, il est le suivant:Problème de pointeur au pointeur

static void _nodeRotateRight(avl_tree* t, avl_tree_node** n) { 
avl_tree_node* node = (*n)->left; 

// refresh parents before rotate 
if (node->right) 
    node->right->parent = (*n); 

if ((*n) == t->top) { 
    t->top = node; 
    node->parent = NULL; 
} 
else { 
    (*n)->parent->right = node; 
    node->parent = (*n)->parent; 
} 

(*n)->parent = (*n)->left; 

// rotate nodes (pointers) 
(*n)->left = node->right; 
node->right = (*n); 
(*n) = node; 

// refresh heights 
(*n)->right->height -= 2; 

}

l'erreur est: (* n) -> parent-> droite = nœud;

fonctionne réellement, mais sur la rotation de 3º a un comportement étrange, assignant une nouvelle valeur à "droite" change réellement (_n) au lieu de droit lui-même. Il est évident que ( _n) -> parent-> right pointe vers (_n), mais si j'affecte une nouvelle valeur à droite, je ne peux pas changer ( _n) car ce sont des pointeurs différents avec des adresses différentes ... Une solution à ce problème?

+1

Laissez les identificateurs commençant par un trait de soulignement à votre implémentation du compilateur/bibliothèque. –

+1

est ce devoir? – Anna

+0

@Anna - Non, ce n'est pas le cas. @ pau.estelella - j'ai déjà essayé ... en fait j'ai eu un problème il y a quelques jours à cause de ça, ça me rendait fou jusqu'à ce que quelqu'un me le dise, et ça a tout réglé, mais pas ce cas ... –

Répondre

1

Vous devez mettre en cache la valeur de *n.

avl_tree_node *n1 = *n; 

Maintenant, quelle que soit la façon dont vous changez *n, n1 continuera pointant vers le nœud d'origine.