Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilety_po_AiP.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.1 Mб
Скачать
  1. Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.

Удаление элемента this из списка

procedure StrikeOff(var head:reference; this:reference);

var p:reference;

begin

if this=head then

head:=this^.next

else

begin

p:=head;

while p^.next<>this do

p:=p^.next;

p^.next:=this^.next;

end;

dispose(this);

end;

Уничтожение списка

Процедура во время прохождения по списку освобождает память

поэлементно, начиная с головы.

procedure DestroyList(head:reference);

var p:reference;

begin

while head <> nil do

begin

p:=head^.next;

dispose(next);

head:=p;

end;

end;

Поиск элемента в списке

function Search (head: reference; x: integer):reference;

var run:Boolean;

begin

run:=true;

while (head<>nil) and run do

if head^.inf=x then run:=false

else head:=head^.next;

Search:=head;

end;

Рекурсивный вариант процедуры не требует вспомогательной

переменной:

function SearchR (head: reference; x: integer):reference;

begin

if head=nil then SearchR:=nil

else

if head^.inf<>x then

SearchR:=SearchR(head^.next,x)

else SearchR:=head;

end;

Сравнение списков:

Задача решается синхронным проходом по двум линейным спискам и сравнением информационных полей элементов разных списков, находящихся на одинаковом расстоянии от начала. Если какая-то пара не совпадает или списки имеют разную длину, то они считаются различными.

function CompList (head1,head2:reference):Boolean;

var run:Boolean;

begin

run:=true;

while(head1<>nil)and(head2<>nil) and run do

if head1^.inf<>head2^.inf then run:=false

else

begin

head1:=head1^.next;

head2:=head2^.next;

end;

CompList:= (head1=nil)and(head2=nil) and run

end;

  1. Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.

Дерево состоит из элементов, обычно называемых вершинами или узлами, и связей между вершинами, называемыми дугами или ссылками.

Дерево имеет два свойства:

• оно связно: из корня нужно пройти по дугам к каждой вершине;

• оно не содержит циклов, т.е. замкнутых последовательностей

вершин и дуг.

Бинарное (двоичное) дерево - это дерево, каждая

вершина которого имеет не более двух поддеревьев (левое и правое).

В двоичном дереве поиска для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.

Тип данных:

type refnode=^node;

node=record inf:integer;

left, right: refnode

end;

Вставка элемента в дерево

Procedure Include(var root : refnode; x : integer);

Begin

if root = nil then

Begin

new(root);

With root^ do

Begin

left := nil;

right := nil;

inf := x;

end;

end

else if x< root^.inf then Include(root^.left, x)

else if x> root^.inf then Include(root^.right, x);

{Иначе ничего не делаем, т.к. значение х уже

существует}

End;

Обходы дерева:

Прямой обход дерева

- вывести значение, находящиеся в корне

- аналогичным образом пройти левое поддерево

- аналогичным образом пройти правое поддерево

Procedure Browser1 (root : refnode);

Begin

if root<> nil then

Begin

Write(root^.inf);

Browser1 (root^.left);

Browser1 (root^.right)

End;

End;

Обратный обход дерева

Левое->корень->правое

Procedure Browser2 (root:refnode);

Begin

if root<> nil then

Begin

Browser2 (root^.left);

Write(root^.inf);

Browser2 (root^.right)

End;

End;

Концевой обход дерева

Левое – правое – корень

Procedure Browser3 (root :

refnode);

Begin

if root<> nil then

Begin

Browser3 (root^.left);

Browser3 (root^.right)

Write(root^.inf);

End;

End;

Подсчет числа вершин + удовлетворяющих условию

С помощью прямого обхода найдем общее количество вершин в переменной i и количество вершин кратных 2 в переменной j. i и j объявлены вне процедуры.

var i,j:integer;

Procedure Browser1 (root : refnode);

Begin

if root<> nil then

Begin

inc(i);

if root^.inf mod 2=0 then inc(j);

Browser1 (root^.left);

Browser1 (root^.right)

End;

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]