Пятница, 18.07.2025, 13:55
 

Меню сайта

Форма входа
Друзья сайта
Статистика
Наш опрос
Нужен ли нашему потоку сайт?
Всего ответов: 87
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
РАБОТА С ДРЕВОВИДНЫМИ СТРУКТУРАМИ ДАННЫХ
AdminДата: Вторник, 25.11.2008, 20:11 | Сообщение # 1
General Admin
Группа: Администраторы
Сообщений: 502
Награды: 0
Статус: OffLine
1.Условие задачи:
Разработать программу реализующую заданную древовидную структуру данных. Заданные действия (инициализация, создание структуры данных, и т. п.) должны быть оформлены в виде отдельных процедур или функций. Память под очередной элемент дерева должна выделяться динамически. Выполнение действий по обслуживанию древовидной структуры должно осуществляться в режиме диалога с пользователем.
Вариант структурной схемы списочной структуры приведен ниже.

Задание

Вариант структуры / тип данных C4 / integer
Создание пустого дерева +
Добавление вершины к указанной вершине дерева +
Вывод элементов дерева на дисплей (или принтер) +
Запись дерева в файл +
Чтение (восстановление) дерева из файла +


Умное лицо - это еще не признак ума. Все глупости в мире совершаются именно с этим выражением лица... Улыбайтесь господа, улыбайтесь!
 
AdminДата: Вторник, 25.11.2008, 20:11 | Сообщение # 2
General Admin
Группа: Администраторы
Сообщений: 502
Награды: 0
Статус: OffLine
ПРОГРАММА

Unit TreeOb;
Interface
Uses crt;
Type
NodeP=^Node;
NodePV=array[1..3] of NodeP;
Node=record
key: char;
D: integer;
num: integer;
Parent: NodeP;
Child: NodePV;
end;
TTree=object
Public
start, cur: NodeP;
nElem:integer;
Constructor InitEmptyTree;
Destructor Done;
Function NewElem : NodeP;
Procedure FindElem( aKey: char; np: nodeP; indP, indC, find: integer);
Procedure InsRoot;
Procedure InsElem(parentKey: char);
Procedure DeleteElem( np: nodeP; indP, indC: integer);
Procedure DisplayTree( np: nodeP; level: word );
end;

Implementation

Constructor TTree.InitEmptyTree;
Begin
start := NIL;
cur := NIL;
nElem := 0;
End;
Function TTree.NewElem:NodeP;
Var
nnp: NodeP; {NewNodePoint}
i: integer;
begin
new( nnp );
writeln('vvedite letter - key of node');
readln(nnp^.key);
writeln('vvedite integer - data of node');
readln(nnp^.D);
nnp^.num := 1;
nnp^.Parent :=cur;
for i:=1 to 3 do
nnp^.Child[i] := NIL;
NewElem := nnp;
end;
Procedure TTree.FindElem( aKey: char; np: nodeP; indP, indC, find: integer);
begin
if find =0 then
begin
if np = NIL then
begin
writeln( 'Node ', aKey, ' is not found');
cur:=NIL;
end
else
begin
cur := np;
if cur^.key = aKey then
find := 1
else
begin
if indC < cur^.num -1 then
FindElem( aKey, cur^.Child[indC+1], indP, 0, find )
else
begin
if ( cur^.Parent =start ) then
FindElem( aKey, cur^.Parent, indP+1, indP+1, find )
else
FindElem( aKey, cur^.Parent, indP, indC+1, find )
end;
end;
end;
end;
End;
Procedure TTree.InsRoot;
Begin
start:=NewElem;
nElem := nElem+1;
End;
Procedure TTree.InsElem(parentKey: char);
Var
nnp: NodeP;
tempChild: NodePV;
i: integer;
Begin
FindElem( parentKey, start, 0, 0, 0 );
nnp := NewElem;
if cur <> NIL then
begin
if cur^.num > 1 then
begin
for i:=1 to cur^.num-1 do
tempChild[i] :=cur^.Child[i];
end;
tempChild[cur^.num] :=nnp;
cur^.num :=cur^.num+1;
cur^.Child := tempChild;
nElem := nElem + 1;
end;
End;
Procedure TTree.DeleteElem( np: nodeP; indP, indC: integer);
Var
i: integer;
Begin
cur :=np;
if cur <> NIL then
begin
if cur^.num = 1 then
begin
cur :=cur^.Parent;
dispose( np );
np := NIL;
cur^.Child[indP+1] := NIL;
if cur^.Parent =start then
DeleteElem( cur, indP+1, indP+1 )
else
DeleteElem( cur, indP, indC+1)
end
else
begin
if indC < cur^.num -1 then
DeleteElem( cur^.Child[indC+1], indP, 0 )
else
begin
for i:=1 to cur^.num - 1 do
cur^.Child[i] :=NIL;
cur := cur^.Parent;
dispose( np);
np:=NIL;
DeleteElem( cur, indP+1, indC+1 );
end;
end;
end;
End;

Destructor TTree.Done;
begin
if start <> Nil then
DeleteElem( start, 0, 0 )
End;

Procedure TTree.DisplayTree( np: nodeP; level: word);
Var
S: array[1..32] of Char;
S_: array[1..28] of Char;
S1: array[1..16] of Char;
S1_: array[1..12] of Char;
S2: array[1..8] of Char;
S2_: array[1..4] of Char;
i: integer;
begin
FillChar(S, 32, ' ');
FillChar(S1, 16, ' ');
FillChar(S2, 8, ' ');
FillChar(S_, 28, ' ');
FillChar(S1_, 12, ' ');
FillChar(S2_, 4, ' ');
if np <> NIL then
begin
if level = 0 then begin
Writeln(S, np^.key,'(',np^.D,')');
Readln;
end;
if (np^.num > 1) and (level = 0) then
begin
case np^.num - 1 of
1: Writeln(S, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
2: begin
Write(S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Writeln(S_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
end;
3: begin
Write(S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Write(S1_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
Writeln(S1_, np^.Child[3]^.key,'(',np^.Child[3]^.D,')');
end;
end;
Readln;
end
else if (np^.num > 1) and (level = 1) then
begin
case np^.num - 1 of
1: Writeln(S1,S1,S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
2: begin
Write(S,S2_,S2_, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Writeln(S1_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
end;
end;
Readln;
end;
if np^.num > 1 then
begin
for i := 1 to np^.num -1 do
begin
if np^.Child[i]^.num > 1 then
DisplayTree(np^.Child[i], level+1);
end;
end;
end;
End;
End.

-----------------------------------------Программа-------------------------------
Program lab6;
uses crt, Treeob;
Var
MyTree:TTree;
i:integer;
Begin
Clrscr;
MyTree.InitEmptyTree;
MyTree.InsRoot;
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('D');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('D');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.Done;
End.


Умное лицо - это еще не признак ума. Все глупости в мире совершаются именно с этим выражением лица... Улыбайтесь господа, улыбайтесь!
 
  • Страница 1 из 1
  • 1
Поиск:




Администратор сайта - Алена © 2025

Ваш
IP: 216.73.216.170