Adres kolejnego elementu w drzewie wskanikow

0

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.
0

Dodaj nawiasy tam gdzie trzeba, bo kolejność operatorów działa inaczej niż Ci się wydaje.

0
nav napisał(a)

Dodaj nawiasy tam gdzie trzeba, bo kolejność operatorów działa inaczej niż Ci się wydaje.

A mógłbyś pokazać jakieś swoje rozwiązanie?

0

@(x.left) ? Chcesz adres .left. Domyślnie w tym co napisałeś kolejność operatorów spowoduje coś takiego: (@x).left, stąd błędy (których nawet nie raczyłeś przytoczyć, więc zgaduj zgadula).

0

Próbowałem, nie działa. Invalid qualifier przy daszku.

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