Referencja na wskaźnik z C++ do C

0

Cześć Wam,
byłbym wdzięczny za pomoc z następującym problemem: mam w C++ funkcję (jedną z kilku służących do równoważenia drzewa binarnego w programie dot. drzew AVL), a chciałbym ją zapisać w [C]. Jednak nie wiem jak dokładnie działa referencja na wskaźnik i jak to przenieść na C (i czy da się jakoś sensownie w ogóle)... Czy można po prostu usunąć symbol '&'?

Dzekuję!

 struct AVLNode
{
  AVLNode * up, * left, * right;
  int key, bf;
};
 void RL(AVLNode * & root, AVLNode * A)
{
  AVLNode * B = A->right, * C = B->left, * p  = A->up;

  B->left = C->right;
  if(B->left) B->left->up = B;

  A->right = C->left;
  if(A->right) A->right->up = A;

  C->left = A;
  C->right = B;
  A->up = B->up = C;
  C->up = p;

  if(p)
  {
    if(p->left == A) p->left = C; else p->right = C;
  }
  else root = C;

  if(C->bf == -1) A->bf =  1; else A->bf = 0;
  if(C->bf ==  1) B->bf = -1; else B->bf = 0;

  C->bf = 0;
}
1

W C - trzeba użyć "podwójnego wskaźnika" czyli wskaźnik na wskaźnik.

0

Więc zamiast '&' wstawiam drugą '*' i mechanizm działania jest taki sam?

0

Nie, inny sposób odwołania, inny sposób przekazywania.

0

W porządku, ale zmieniając tylko ampersanda na gwiazdkę, pozostawiając resztę kodu taką samą program będzie działał w [C] prawidłowo?

1

Nie, nawet się nie skompiluje, co mogłeś sprawdzić w kilka sekund.

0

Nie będzie. Chcesz zmieniać to, na co pokazuje wskaźnik, więc przy przypisaniu musisz mieć wszędzie *xxx = yyy.

W zasadzie musisz zmienić tylko to: else *root = C;.

0

Kompilator nie pokazał błędu czemuś ;s
Przy jakim przypisaniu, Endrju?

edit:
A, już rozumiem.

Finalne funkcja C będzie taka?

struct AVLNode
{
  AVLNode * up, * left, * right;
  int key, bf;
};

 void RL(AVLNode ** root, AVLNode * A)
{
  AVLNode * B = A->right, * C = B->left, * p  = A->up;
 
  B->left = C->right;
  if(B->left) B->left->up = B;
 
  A->right = C->left;
  if(A->right) A->right->up = A;
 
  C->left = A;
  C->right = B;
  A->up = B->up = C;
  C->up = p;
 
  if(p)
  {
    if(p->left == A) p->left = C; else p->right = C;
  }
  else *root = C;
 
  if(C->bf == -1) A->bf =  1; else A->bf = 0;
  if(C->bf ==  1) B->bf = -1; else B->bf = 0;
 
  C->bf = 0;
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1