
Добавил:
Oksana
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
program newLB7;
uses crt;
{вЁЇ ®ЇЁблў ойЁ© ®б®ўлҐ Ї а ¬Ґвал ўҐаиЁл}
type RefPeak = ^TPeak;
TPeak = record
num: integer; {Ї®ап¤Є®ўл© ®¬Ґа}
wgn_num: integer; {Ї®ап¤Є®ўл© ®¬Ґа ЇаЁ 宦¤ҐЁЁ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў Ја д }
end;
{вЁЇ ®ЇЁблў ойЁ© бЇЁб®Є ўҐаиЁ}
type RefNode = ^TNode;
TNode = record
peak: RefPeak; {ўҐаиЁ }
child: RefNode; {¤®зҐапп ўҐаиЁ (ў бЇЁбЄҐ Ї®в®¬Є®ў ЁбЇ®«м§гҐвбп Є Є ббл«Є б«Ґ¤го饣® Ї®в®¬Є )}
sibling: RefNode; {б«Ґ¤гой п ўҐаиЁ (ў бЇЁбЄҐ Ї®в®¬Є®ў ЁбЇ®«м§гҐвбп Є Є ббл«Є ўҐаиЁг)}
end;
{вЁЇ ®ЇЁблў ойЁ© бвнЄ ўҐаиЁ}
type RefStack = ^TStack;
TStack = record
Node: RefNode;
Next: RefStack;
end;
var
FirstNode, CursorNode: RefNode;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
StNode: RefStack;{бвнЄ}
iter: integer; {®¬Ґа ЁвҐа жЁЁ ЇаЁ Ї®бв஥ЁЁ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў}
cycle: integer; {Џ®ап¤Є®ўл© ®¬Ґа дг¤ ¬Ґв «м®Ј® жЁЄ« }
i: integer;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
memBorrow: longint;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
{ђ Ў®в б® бвнЄ®¬ ўҐаиЁ}
{¤®Ў ў«ҐЁҐ ў бвнЄ ®ў®Ј® н«Ґ¬Ґв }
procedure addStack(var Stack: RefStack; Node: RefNode);
var
tmpStack: RefStack;
begin
new(tmpStack);
tmpStack^.Node := Node;
tmpStack^.Next := Stack;
Stack := tmpStack;
end;
{Ё§ў«ҐзҐЁҐ Ё§ бвнЄ ўҐа奣® н«Ґ¬Ґв }
procedure decStack(var Stack: RefStack);
var
tmpStack: RefStack;
begin
if Stack^.Next <> nil then begin
tmpStack := Stack;
Stack := Stack^.Next;
dispose(tmpStack)
end else Stack^.Node := nil;
end;
{ЇҐз вм н«Ґ¬Ґв®ў бвнЄ ®в ўҐаиЁл Є ЇҐаў®¬г Ё«Ё ®Ја ЁзЁў о饬г н«Ґ¬Ґвг}
procedure printStack(Stack: RefStack; limitpeak: integer);
var
tmpStack: RefStack;
begin
tmpStack := Stack;
inc(cycle);
write('–ЁЄ« ь',cycle,': ');
while (tmpStack^.Node^.Peak^.Num <> limitPeak) and (tmpStack <> nil) do begin
write('->',tmpStack^.Node^.Peak^.Num);
tmpStack := tmpStack^.Next;
end;
write('->',tmpStack^.Node^.Peak^.Num);
writeln;
end;
{Їа®жҐ¤гал ¤«п а Ў®вл б® бЇЁбЄ®¬ ЁжЁ¤Ґв®бвЁ}
{дгЄжЁп б®§¤ Ёп ®ў®© ўҐаиЁл}
function createNode(Num: integer): RefNode;
var
tmpNode: RefNode;
begin
new(tmpNode);
new(tmpNode^.peak);
tmpNode^.peak^.num := Num;
tmpNode^.peak^.wgn_num := 0;
new(tmpNode^.child);
tmpNode^.child^.Peak := nil;
tmpNode^.child^.sibling := nil;
tmpNode^.sibling := nil;
createNode := tmpNode;
end;
{Їа®жҐ¤га ®бў®Ў®¦¤ҐЁп Ї ¬пвЁ § пв®© ўҐаиЁ®©}
procedure disposeNode(var Node: RefNode);
var
tmpPeak: RefPeak;
tmpNode: RefNode;
{Їа®жҐ¤га ®бў®Ў®¦¤ҐЁп Ї ¬пвЁ § пв®© Ї®в®¬Є ¬Ё}
procedure disposeChild(var Node: RefNode);
var
tmpPeak: RefPeak;
tmpNode: RefNode;
begin
if Node^.Peak <> nil then
disposeChild(Node^.child);
tmpPeak := Node^.Peak;
tmpNode := Node^.sibling;
dispose(Node);
end;
begin
if Node^.sibling <> nil then
disposeNode(Node^.sibling);
tmpPeak := Node^.peak;
tmpNode := Node^.child;
dispose(Node);
dispose(tmpPeak);
disposeChild(tmpNode);
end;
{дгЄжЁп Ї®ЁбЄ ўҐаиЁл Ї® ®¬Ґаг}
function getNode(FirstNode: RefNode; Num: integer): RefNode;
var
CursorNode: RefNode;
begin
CursorNode := FirstNode;
while CursorNode <> nil do begin
if CursorNode^.peak^.num = Num then begin
getNode := CursorNode;
exit;
end;
CursorNode := CursorNode^.sibling
end;
end;
{Їа®жҐ¤га бўп§лў Ёп ўҐаиЁ}
procedure unitedNode(var FirstNode: RefNode; Num1,Num2: integer; ret: boolean);
var
tmpNode1, tmpNode2: RefNode;
{Їа®жҐ¤га бўп§лў Ёп ўҐаиЁ}
procedure united(Node1, Node2: RefNode);
var
tmpNode, tmpSort, tmpSort1, tmpChild: RefNode;
tmpPeak: RefPeak;
begin
{б®§¤ ЁҐ ¤®зҐаҐЈ® г§« Ё бўп§лў ЁҐ c ҐЈ® Ї®¬®ймо ¤ўге ўҐаиЁ}
tmpNode := createNode(0);
tmpPeak := tmpNode^.Peak;
tmpNode^.Peak := Node2^.peak;
tmpNode^.sibling := Node2;
tmpChild := tmpNode^.child;
tmpNode^.child := Node1^.child;
Node1^.child := tmpNode;
{®бў®Ў®¦¤ҐЁҐ Ї ¬пвЁ}
dispose(tmpChild);
dispose(tmpPeak);
end;
begin
{Ї®ЁбЄ г§«®ў}
tmpNode1 := getNode(FirstNode, Num1);
tmpNode2 := getNode(FirstNode, Num2);
{б®§¤ ЁҐ ॡа }
united(tmpNode1, tmpNode2);
if ret then united(tmpNode2, tmpNode1);
end;
{Їа®жҐ¤га Ї®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў Ја д }
procedure WGN(Node: RefNode; var Stack: RefStack; var wgn_iter: integer);
var
CursorNode: RefNode;
CursorChild: RefNode;
begin
inc(wgn_iter);
Node^.Peak^.wgn_num := wgn_iter;
addStack(Stack, Node);
CursorChild := Node^.child;
while CursorChild^.Peak <> nil do begin
if CursorChild^.Peak^.wgn_num = 0 then
WGN(CursorChild^.sibling, Stack, wgn_iter)
else if (CursorChild^.Peak^.Num <> Stack^.Next^.Node^.Peak^.Num) and (Node^.Peak^.wgn_num > CursorChild^.Peak^.wgn_num) then
printStack(Stack, CursorChild^.Peak^.Num);
CursorChild := CursorChild^.child;
end;
decStack(Stack);
end;
{Їа®жҐ¤га ЇҐз вЁ бЇЁбЄ ЁжЁ¤Ґвле ўҐаиЁ}
procedure printIncedent(FirstNode: RefNode);
var
CursorNode, CursorChild: RefNode;
begin
CursorNode := FirstNode;
while CursorNode <> nil do begin
write(CursorNode^.peak^.num);
CursorChild := CursorNode^.child;
while CursorChild^.Peak <> nil do begin
write('->',CursorChild^.peak^.num);
CursorChild := CursorChild^.child;
end;
CursorNode := CursorNode^.sibling;
writeln;
end;
end;
begin
{®зЁйҐЁҐ нЄа }
clrscr;
memBorrow := memavail;
writeln('>‘®§¤ ЁҐ бЇЁбЄ ЁжЁ¤Ґв®бвЁ...');
{б®§¤ ЁҐ ўҐаиЁ}
CursorNode := createNode(1);
FirstNode := CursorNode;
for i := 2 to 10 do begin
CursorNode^.sibling := createNode(i);
CursorNode := CursorNode^.sibling;
end;
{бўп§лў ЁҐ ўҐаиЁ}
unitedNode(FirstNode,1,4,true);
unitedNode(FirstNode,1,5,true);
unitedNode(FirstNode,2,3,true);
unitedNode(FirstNode,2,5,true);
unitedNode(FirstNode,3,6,true);
unitedNode(FirstNode,4,5,true);
unitedNode(FirstNode,4,7,true);
unitedNode(FirstNode,5,6,true);
unitedNode(FirstNode,5,8,true);
unitedNode(FirstNode,6,9,true);
unitedNode(FirstNode,7,8,true);
unitedNode(FirstNode,8,9,true);
unitedNode(FirstNode,8,10,true);
unitedNode(FirstNode,9,10,true);
{ЇҐз вм бЇЁбЄ ЁжЁ¤Ґв®бвЁ}
printIncedent(FirstNode);
writeln('>‡ пв® Їа®Ја ¬¬®©: ', memBorrow - memavail,' Ў ©в');
{ЁЁжЁ «Ё§ жЁп бвнЄ }
StNode := nil;
iter := 0;
{Ї®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў ¤«п Ја д }
cycle := 0;
writeln('>Џ®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў...');
wgn(FirstNode,StNode,iter);
writeln('€в®Ј® ©¤Ґ® ', cycle,' жЁЄ« (®ў)');
dispose(StNode);
writeln('>Ћбў®Ў®¦¤ҐЁҐ § пв®© Ї ¬пвЁ...');
disposeNode(FirstNode);
writeln('>‡ пв® Їа®Ја ¬¬®©: ', memavail - memBorrow,' Ў ©в');
Readln;
end.
uses crt;
{вЁЇ ®ЇЁблў ойЁ© ®б®ўлҐ Ї а ¬Ґвал ўҐаиЁл}
type RefPeak = ^TPeak;
TPeak = record
num: integer; {Ї®ап¤Є®ўл© ®¬Ґа}
wgn_num: integer; {Ї®ап¤Є®ўл© ®¬Ґа ЇаЁ 宦¤ҐЁЁ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў Ја д }
end;
{вЁЇ ®ЇЁблў ойЁ© бЇЁб®Є ўҐаиЁ}
type RefNode = ^TNode;
TNode = record
peak: RefPeak; {ўҐаиЁ }
child: RefNode; {¤®зҐапп ўҐаиЁ (ў бЇЁбЄҐ Ї®в®¬Є®ў ЁбЇ®«м§гҐвбп Є Є ббл«Є б«Ґ¤го饣® Ї®в®¬Є )}
sibling: RefNode; {б«Ґ¤гой п ўҐаиЁ (ў бЇЁбЄҐ Ї®в®¬Є®ў ЁбЇ®«м§гҐвбп Є Є ббл«Є ўҐаиЁг)}
end;
{вЁЇ ®ЇЁблў ойЁ© бвнЄ ўҐаиЁ}
type RefStack = ^TStack;
TStack = record
Node: RefNode;
Next: RefStack;
end;
var
FirstNode, CursorNode: RefNode;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
StNode: RefStack;{бвнЄ}
iter: integer; {®¬Ґа ЁвҐа жЁЁ ЇаЁ Ї®бв஥ЁЁ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў}
cycle: integer; {Џ®ап¤Є®ўл© ®¬Ґа дг¤ ¬Ґв «м®Ј® жЁЄ« }
i: integer;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
memBorrow: longint;{б«г¦ҐЎл© ЇҐаҐ¬ҐлҐ}
{ђ Ў®в б® бвнЄ®¬ ўҐаиЁ}
{¤®Ў ў«ҐЁҐ ў бвнЄ ®ў®Ј® н«Ґ¬Ґв }
procedure addStack(var Stack: RefStack; Node: RefNode);
var
tmpStack: RefStack;
begin
new(tmpStack);
tmpStack^.Node := Node;
tmpStack^.Next := Stack;
Stack := tmpStack;
end;
{Ё§ў«ҐзҐЁҐ Ё§ бвнЄ ўҐа奣® н«Ґ¬Ґв }
procedure decStack(var Stack: RefStack);
var
tmpStack: RefStack;
begin
if Stack^.Next <> nil then begin
tmpStack := Stack;
Stack := Stack^.Next;
dispose(tmpStack)
end else Stack^.Node := nil;
end;
{ЇҐз вм н«Ґ¬Ґв®ў бвнЄ ®в ўҐаиЁл Є ЇҐаў®¬г Ё«Ё ®Ја ЁзЁў о饬г н«Ґ¬Ґвг}
procedure printStack(Stack: RefStack; limitpeak: integer);
var
tmpStack: RefStack;
begin
tmpStack := Stack;
inc(cycle);
write('–ЁЄ« ь',cycle,': ');
while (tmpStack^.Node^.Peak^.Num <> limitPeak) and (tmpStack <> nil) do begin
write('->',tmpStack^.Node^.Peak^.Num);
tmpStack := tmpStack^.Next;
end;
write('->',tmpStack^.Node^.Peak^.Num);
writeln;
end;
{Їа®жҐ¤гал ¤«п а Ў®вл б® бЇЁбЄ®¬ ЁжЁ¤Ґв®бвЁ}
{дгЄжЁп б®§¤ Ёп ®ў®© ўҐаиЁл}
function createNode(Num: integer): RefNode;
var
tmpNode: RefNode;
begin
new(tmpNode);
new(tmpNode^.peak);
tmpNode^.peak^.num := Num;
tmpNode^.peak^.wgn_num := 0;
new(tmpNode^.child);
tmpNode^.child^.Peak := nil;
tmpNode^.child^.sibling := nil;
tmpNode^.sibling := nil;
createNode := tmpNode;
end;
{Їа®жҐ¤га ®бў®Ў®¦¤ҐЁп Ї ¬пвЁ § пв®© ўҐаиЁ®©}
procedure disposeNode(var Node: RefNode);
var
tmpPeak: RefPeak;
tmpNode: RefNode;
{Їа®жҐ¤га ®бў®Ў®¦¤ҐЁп Ї ¬пвЁ § пв®© Ї®в®¬Є ¬Ё}
procedure disposeChild(var Node: RefNode);
var
tmpPeak: RefPeak;
tmpNode: RefNode;
begin
if Node^.Peak <> nil then
disposeChild(Node^.child);
tmpPeak := Node^.Peak;
tmpNode := Node^.sibling;
dispose(Node);
end;
begin
if Node^.sibling <> nil then
disposeNode(Node^.sibling);
tmpPeak := Node^.peak;
tmpNode := Node^.child;
dispose(Node);
dispose(tmpPeak);
disposeChild(tmpNode);
end;
{дгЄжЁп Ї®ЁбЄ ўҐаиЁл Ї® ®¬Ґаг}
function getNode(FirstNode: RefNode; Num: integer): RefNode;
var
CursorNode: RefNode;
begin
CursorNode := FirstNode;
while CursorNode <> nil do begin
if CursorNode^.peak^.num = Num then begin
getNode := CursorNode;
exit;
end;
CursorNode := CursorNode^.sibling
end;
end;
{Їа®жҐ¤га бўп§лў Ёп ўҐаиЁ}
procedure unitedNode(var FirstNode: RefNode; Num1,Num2: integer; ret: boolean);
var
tmpNode1, tmpNode2: RefNode;
{Їа®жҐ¤га бўп§лў Ёп ўҐаиЁ}
procedure united(Node1, Node2: RefNode);
var
tmpNode, tmpSort, tmpSort1, tmpChild: RefNode;
tmpPeak: RefPeak;
begin
{б®§¤ ЁҐ ¤®зҐаҐЈ® г§« Ё бўп§лў ЁҐ c ҐЈ® Ї®¬®ймо ¤ўге ўҐаиЁ}
tmpNode := createNode(0);
tmpPeak := tmpNode^.Peak;
tmpNode^.Peak := Node2^.peak;
tmpNode^.sibling := Node2;
tmpChild := tmpNode^.child;
tmpNode^.child := Node1^.child;
Node1^.child := tmpNode;
{®бў®Ў®¦¤ҐЁҐ Ї ¬пвЁ}
dispose(tmpChild);
dispose(tmpPeak);
end;
begin
{Ї®ЁбЄ г§«®ў}
tmpNode1 := getNode(FirstNode, Num1);
tmpNode2 := getNode(FirstNode, Num2);
{б®§¤ ЁҐ ॡа }
united(tmpNode1, tmpNode2);
if ret then united(tmpNode2, tmpNode1);
end;
{Їа®жҐ¤га Ї®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў Ја д }
procedure WGN(Node: RefNode; var Stack: RefStack; var wgn_iter: integer);
var
CursorNode: RefNode;
CursorChild: RefNode;
begin
inc(wgn_iter);
Node^.Peak^.wgn_num := wgn_iter;
addStack(Stack, Node);
CursorChild := Node^.child;
while CursorChild^.Peak <> nil do begin
if CursorChild^.Peak^.wgn_num = 0 then
WGN(CursorChild^.sibling, Stack, wgn_iter)
else if (CursorChild^.Peak^.Num <> Stack^.Next^.Node^.Peak^.Num) and (Node^.Peak^.wgn_num > CursorChild^.Peak^.wgn_num) then
printStack(Stack, CursorChild^.Peak^.Num);
CursorChild := CursorChild^.child;
end;
decStack(Stack);
end;
{Їа®жҐ¤га ЇҐз вЁ бЇЁбЄ ЁжЁ¤Ґвле ўҐаиЁ}
procedure printIncedent(FirstNode: RefNode);
var
CursorNode, CursorChild: RefNode;
begin
CursorNode := FirstNode;
while CursorNode <> nil do begin
write(CursorNode^.peak^.num);
CursorChild := CursorNode^.child;
while CursorChild^.Peak <> nil do begin
write('->',CursorChild^.peak^.num);
CursorChild := CursorChild^.child;
end;
CursorNode := CursorNode^.sibling;
writeln;
end;
end;
begin
{®зЁйҐЁҐ нЄа }
clrscr;
memBorrow := memavail;
writeln('>‘®§¤ ЁҐ бЇЁбЄ ЁжЁ¤Ґв®бвЁ...');
{б®§¤ ЁҐ ўҐаиЁ}
CursorNode := createNode(1);
FirstNode := CursorNode;
for i := 2 to 10 do begin
CursorNode^.sibling := createNode(i);
CursorNode := CursorNode^.sibling;
end;
{бўп§лў ЁҐ ўҐаиЁ}
unitedNode(FirstNode,1,4,true);
unitedNode(FirstNode,1,5,true);
unitedNode(FirstNode,2,3,true);
unitedNode(FirstNode,2,5,true);
unitedNode(FirstNode,3,6,true);
unitedNode(FirstNode,4,5,true);
unitedNode(FirstNode,4,7,true);
unitedNode(FirstNode,5,6,true);
unitedNode(FirstNode,5,8,true);
unitedNode(FirstNode,6,9,true);
unitedNode(FirstNode,7,8,true);
unitedNode(FirstNode,8,9,true);
unitedNode(FirstNode,8,10,true);
unitedNode(FirstNode,9,10,true);
{ЇҐз вм бЇЁбЄ ЁжЁ¤Ґв®бвЁ}
printIncedent(FirstNode);
writeln('>‡ пв® Їа®Ја ¬¬®©: ', memBorrow - memavail,' Ў ©в');
{ЁЁжЁ «Ё§ жЁп бвнЄ }
StNode := nil;
iter := 0;
{Ї®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў ¤«п Ја д }
cycle := 0;
writeln('>Џ®ЁбЄ ¬®¦Ґбвў дг¤ ¬Ґв «мле жЁЄ«®ў...');
wgn(FirstNode,StNode,iter);
writeln('€в®Ј® ©¤Ґ® ', cycle,' жЁЄ« (®ў)');
dispose(StNode);
writeln('>Ћбў®Ў®¦¤ҐЁҐ § пв®© Ї ¬пвЁ...');
disposeNode(FirstNode);
writeln('>‡ пв® Їа®Ја ¬¬®©: ', memavail - memBorrow,' Ў ©в');
Readln;
end.
Соседние файлы в папке КЛП 2012 февраль. Основы алгоритмизации и языки программирования. Сафьянова