Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ ЛР.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
128 Кб
Скачать

Работа 2. Списки. Реализация с помощью динамических переменных

Данное задание отличается от первого тем, что необходимо использовать размещение элементов связанного списка в динамической памяти.

Пример реализации задания:

program ds_02;

uses ds_unit;

var first: plist;

len: integer;

procedure lst_len(lst:plist; var len:integer);

{ Входы: lst - указатель списка;

Выходы: len - длина списка;

Гл. имена: plist - тип указателя на список;

link - поле связи элемента списка;

Функция: Определение длины len списка lst.

}

var p: plist;

begin

p:=lst; len:=0;

while p<>nil do

begin

len:=len+1;

p:=p^.link;

end;

end; {lst_len}

begin

rdlist(first);

wrlist(first);

lst_len(first,len);

writeln('Len: ',len);

wrlist(first);

escwait;

end.

Варианты индивидуальных заданий:

1. Включение элемента с заданным значением в список, упорядоченный по возрастанию значений его элементов.

2. Слияние двух упорядоченных по возрастанию списков в один упорядоченный.

3. Реверс списка.

4. Разбиение списка на два в соответствии с заданным пороговым значением. Элементы с значениями, меньшими порогового, должны попасть в один список, остальные - в другой.

5. Даны два списка. Проверить, может ли быть получен второй список в результате циклического сдвига элементов первого списка.

6. Даны два множества, представленные списками. Проверить, является ли первое множество подмножеством второго.

7. Определение разности двух множеств, представленных списками.

Работа 3. Списки. Рекурсивный алгоритм обработки

Используются списки представленные с помощью динамических переменных. Рекурсия заключается в вызове процедуры/функции внутри ней самой.

Пример реализации задания:

program ds_03;

uses ds_unit;

var first: plist;

len: integer;

function lst_len(lst:plist):integer;

{ Входы: lst - указатель списка;

Выходы: lst_len - длина списка;

Гл. имена: plist - тип указателя на список;

link - поле связи элемента списка;

Функция: Определение длины len списка lst.

}

begin

if lst=nil then

lst_len:=0

else

lst_len:=lst_len(lst^.link) + 1; {рекурсивный вызов функции lst_len()}

end; {lst_len}

begin

rdlist(first);

wrlist(first);

len:=lst_len(first);

writeln('Len: ',len);

wrlist(first);

escwait;

end.

Варианты индивидуальных заданий:

1. Сортировка списка простыми вставками.

2. Сортировка слиянием.

3. Сортировка Хоара.

4. Расщепление списка на минимальный элемент и список из остальных элементов.

5. Расщепление списка на максимальный элемент и список из остальных элементов.

6. Разбиение списка на два в соответствии с заданным пороговым значением. Элементы с значениями, меньшими порогового, должны попасть в один список, остальные - в другой.

7. Объединение двух множеств, представленных списками.

Работа 4. Бинарные деревья. Итеративный алгоритм обработки

Дерево – это структура, состоящая из элемента, называемого корнем, и, возможно, из одного или нескольких поддеревьев. Поддерево – это дерево и в частном случае может быть пустым (без корня и поддеревьев). Структура – это граф, в котором отсутствуют циклические связи. Граф – система взаимосвязанных элементов, причем связи могут образовывать циклы. В дереве на каждый элемент допускается не более одного указателя. Бинарное дерево состоит из двух поддеревьев: левого и правого.

В зависимости от задания используется один из трех вариантов прохождения по дереву: прямой порядок (обращение к корню, к левому поддереву, к правому поддереву); обратный порядок (обращение к левому поддереву, к корню, к правому поддереву); концевой порядок (обращение к левому поддереву, к правому поддереву, к корню).

В данной работе предлагается использовать итерационный алгоритм прохождения по дереву. В качестве вспомогательного элемента используется стек.

Пример реализации задания:

program ds_04;

uses ds_unit;

var t: ptree;

cnt: integer;

procedure cnt_node(t:ptree; var cnt:integer);

{ Входы: t - бинарное дерево;

Выходы: cnt - кол. элементов в дереве;

Гл. имена: ptree - тип указателя на дерево;

llink,rlink - поля связи элемента дерева;

Функция: Определение кол. эл-тов cnt в дереве t.}

const m=32; { Размер стека }

var st: array[1..m] of ptree; { Стек }

sp: integer; { Указатель стека }

p: ptree; { Указатель текущего эл-та }

empty: Boolean; { Индикатор "Стек пуст" }

begin

cnt:=0; sp:=0; p:=t;

repeat

while p<>nil do

begin

inc(sp); st[sp]:=p;

p:=p^.llink;

end;

empty:=sp=0;

if empty then exit;

p:=st[sp]; dec(sp);

inc(cnt);

p:=p^.rlink;

until false;

end; {cnt_node}

begin

gentree(t);

puttree(t);

cnt_node(t,cnt);

writeln('Количество элементов в дереве: ',cnt);

escwait;

end.

Варианты индивидуальных заданий:

1. Определение количества листьев дерева.

2. Поиск элемента в упорядоченном дереве.

3. Включение элемента в упорядоченное дерево на уровне листа.

4. Преобразование дерева в список в соответствии с симметричным порядком прохождения.

5. Проверка эквивалентности двух деревьев.

6. Удаление дерева, т.е. помещение всех его элементов в список свободного пространства.

7. Генерация дерева по его описанию.