procedure Right_Rotate(var Root : TLink;var X : TLink);
var
Aid : TLink;
begin
if Empty(Root) then exit;
if X^.Left = nil then exit;
[COLOR="Red"]Aid := X^.Left;[/COLOR]
X^.Left := Aid^.Right;
if Aid^.Right <> nil then
Aid^.Right^.Parent := X;
Aid^.Parent := X^.Parent;
if X^.Parent = nil then Root := Aid
else
if X = X^.Parent^.Right then
X^.Parent^.Right := Aid
else
X^.Parent^.Left := Aid;
Aid^.Right := X;
X^.Parent := Aid;
end;
Потеря указателей.
Впервые - при работе с красно-черными деревьями. Имелся набор типов для реализации:
[highlight=Delphi]
TData = Integer;
TRBColor = (Black,Red);
TLink = ^TSummit;
TSummit = record
Data : TData;
Color : TRBColor;
Left : TLink;
Right : TLink;
Parent : TLink;
end;
[/highlight]
и процедура вращения:
Код:
После выполнения помеченной строчки значение указателя X теряется и дальнейшая работа с ним невозможна. Проблема решалась изменением заголовка на:
[highlight=Delphi]
procedure Right_Rotate(var Root : TLink; X : TLink);
[/highlight]
Во втором случае имеется матрица, с которой работает несколько объектов. Каждому из них передан указатель на нее. Проблема аналогична - после первого чтения указатель теряется.
Долго разбирался, но так и не смог понять, почему такое происходит. Если кто-то знает - подскажите.