Witam,
mam nastepujacy problem:
Nie mam bladego pojecia jak sprawic, aby w procedurze tree_insert zmienna wskaznikowa x zaczela wskazywac na element right lub left zmiennej bedacej struktura, na ktora wskazuje wskaznik x. Mianowicie chcialbym zamienic bledne x:=x.left na **x:=@x</sup>.left **, ale wtedy wyskakuje blad kompilatora i nie mam pojecia, co z tym zrobic.
Wszystko jest dobrze do momentu x:=x^.left;
procedure tree_insert(var tree: array of pNode; var z: pNode);
var x,y: ^pNode; tmp:integer;
begin
new(x);
new(y);
y:=nil;
x:=@tree[0];
while (x<>nil) do
begin
y:=x;
tmp:=x^^.key;
if(z^.key<x^^.key) then
x:=x^.left
else
x:=x^.right;
end;
z^.parent:=y;
if(y=nil) then
tree[0]:=z
else
if(z^.key<y^.key) then
y^.left:=z
else
y^.right:=z;
dispose(x);
dispose(y);
end;
Oto caly program:
program AISD3;
uses dos,graph;
type pNode = ^Node;
Node = record
key: integer;
color: (RED, BLACK);
parent, left, right: pNode;
end;
function left(x:pNode):pNode;
begin
left:=x^.left;
end;
function right(x:pNode):pNode;
begin
right:=x^.right;
end;
function parent(x:pNode):pNode;
begin
parent:=x^.parent;
end;
function root(tree:array of pNode):pNode;
begin
root:=tree[1];
end;
procedure tree_insert(var tree: array of pNode; var z: pNode);
var x,y: ^pNode; tmp:integer;
begin
new(x);
new(y);
y:=nil;
x:=@tree[0];
while (x<>nil) do
begin
y:=x;
tmp:=x^^.key;
if(z^.key<x^^.key) then
x:=x^.left
else
x:=x^.right;
end;
z^.parent:=y;
if(y=nil) then
tree[0]:=z
else
if(z^.key<y^.key) then
y^.left:=z
else
y^.right:=z;
dispose(x);
dispose(y);
end;
procedure draw_tree(nod: pNode; x,y,h: word);
var txt:string;
begin
bar(x-1,y-1,x+2,y+2);
setcolor(6);
str(nod^.key,txt);
outtextxy(x-5,y+10,txt);
if (nod^.left<>nil) then
begin
draw_tree(nod^.left,x-round(getmaxx/h),y+10,h*2);
line(x,y,x-round(x/2),y+10);
end;
if (nod^.right<>nil) then
begin
draw_tree(nod^.right,x+round(getmaxx/h),y+10,h*2);
line(x,y,x+round(x/2),y+10);
end;
end;
procedure free_tree(nod: pNode);
begin
if (nod^.left<>nil) then
free_tree(nod^.left);
if (nod^.right<>nil) then
free_tree(nod^.right);
if (nod<>nil) then
freemem(nod, sizeof(pNode));
end;
procedure rb_tree;
var tree: array[0..20] of pNode;
nod: pNode;
i,k: word;
txt:string;
begin
{ new(tree[0]);
new(tree[1]);
new(tree[2]);
tree[0]^.key:=20;
tree[1]^.key:=40;
tree[2]^.key:=10;
tree[0]^.parent:=nil;
tree[1]^.parent:=tree[0];
tree[2]^.parent:=tree[0];
tree[0]^.left:=tree[1];
tree[0]^.right:=tree[2];
tree[1]^.left:=nil;
tree[1]^.right:=nil;
tree[2]^.left:=nil;
tree[2]^.right:=nil; }
randomize;
{new(nod); }
getmem(tree[0],sizeof(pNode));
tree[0]:=nil;
for i:=1 to 4 do
begin
getmem(tree[i],sizeof(pNode));
tree[i]^.key:=random(99)+1;
tree_insert(tree,tree[i]);
end;
draw_tree(tree[0],round(getmaxx/2),10,4);
readln;
free_tree(tree[0]);
for i:=1 to 4 do
begin
if (tree[i]<> nil) then
freemem(tree[i],sizeof(pNode));
end;
end;
procedure init;
var dir:string;
graph1,graph2: integer;
begin
writeln(memavail,' ',sizeof(pNode));
readln;
getdir(0,dir);
delete(dir,length(dir)-3,4);
detectgraph(graph1,graph2);
initgraph(graph1,graph2,dir+'\bgi');
setbkcolor(3);
setcolor(5);
rb_tree;
readln;
closegraph;
end;
var x: integer;
begin
randomize;
init;
end.