- •Методические указания
- •Рассмотрено на заседании кафедры Утверждено на заседании кафедры
- •Зав.Кафедрой, к.Т.Н., доцент ___________________________с.В.Краснов
- •1. Работа с динамическими структурами данных.
- •1.1.Переменные – указатели.
- •1.2.Операции с указателями.
- •2. Динамические переменные.
- •2.1. Односвязные списки
- •2.2.Двусвязные списки.
- •2.3.Бинарные деревья.
2. Динамические переменные.
2.1. Односвязные списки
Динамическими называют переменные, память для которых выделяется и освобождается во время работы программы. Динамические переменные можно объединять в связанные динамические структуры.
Для организации связей между элементами динамической структуры, каждый элемент должен содержать информационное значение и указатель.

Описание такой структуры:
type
ps = ^ spisok;
Запись,
состоящая из информационной части и
указателя.
end;
var
p: ps;
…
Тип указателя на элемент динамической структуры должен быть описан перед описанием этого элемента.
Информационная часть динамической переменной может иметь и более сложную структуру.
type
pstud =^ stud;
-информационная
часть.
link: pstud; - указатель.
end;
var
p: pstud;
….
Рассмотренная динамическая структура называется односвязным списком. Односвязные списки можно формировать в виде:
очереди: (новый элемент добавляется в конец очереди; а удаляется элемент из начала очереди);
стека: (добавлять и удалять элемент можно только с одного конца списка, который называется вершиной стека).
При работе с очередью применяют указатели на начало (begp) и на конец (endp) очереди.

2. При создании динамической структуры в виде стека – используют указатель на начало стека – top.

Основные операции над односвязными списками:
переход от элемента к элементу;
включение нового элемента;
исключени элемента из списка;
сортировка элементов.
Ниже в методических указаниях приведены примеры программ, в которых реализованы основные операции над односвязными списками.
Задача: составить программу, формирующую односвязный список в виде стека о товарах некоторого склада и выдает список тех товаров, которые пролежали на складе более 3-х лет.
top – указатель на начало списка; p – указатель на текущий элемент.
Ввод прекращается, если вместо названия товара вводят <ENTER>.
program spisok;
type
t = ^ tovar;
tovar = record
name: string [20];
g, z: integer;
link: t;
end;
var
top, p: t;
begin
{ определение вершины стека }
top: = nil;
repeat
{ выделение памяти под элемент списка }
new (p);
write (‘Введите название товара’); readln (p^.name);
if length (p^.name) <> 0 then
begin
write (‘Введите год’); readln (p^.g);
write (‘Введите цену’); readln (p^.z);
{подключение очередного элемента к началу списка}
p^.link: = top;
{перемещение вершины стека на этот элемент}
top: = p;
end;
until length (p^.name) = 0;
while top <> nil do
begin
if 1999 – p^.g > 3 then writeln (p^.name);
{текущий указатель на начало стека}
p: = top;
{перемещение указателя начала стека}
top: = p^.link;
{освобождение динамичекой памяти, занимаемой текущим элементом}
dispose (p);
end;
end.
Задача: ввод и сортировка элементов односвязного списка.
top, p, t, n – указатели на вершину, предыдущий, текущий и новый элемент
списка соответственно
program sortirovka;
type
ps = ^spisok;
spisok = record
name: string [20];
l: ps;
end;
var
top, p, t, n: ps; name: string [20];
begin
top: = nil;
repeat
write (‘Введите Ф.И.О.’); readln (name);
if length(name) <> 0 then
begin
{выделение памяти под новый элемент}
new (n);
n^.name: = name; n^.l: = nil;
t: = top;
p: = nil;
while (name > t^.name) and (t <> nil) do
{поиск места для нового элемента}
begin
p: = t; t: = t^.l;
end;
if p = nil then
{вставка элемента в начало списка}
begin
n^.l: = top; top: = n;
end
else
{вставка элемента в середину или конец списка}
begin
n^.l: = p^.l; p^.l: = n;
end;
end;
until length (name) = 0;
t: = top;
writeln (‘Список’); {печать отсортированного списка}
while t <> nil do begin
writeln (t^.name);
t: = t^.l;
end;
end.
Задача: фрагмент удаления элемента из односвязного списка.
name – элемент, который необходимо удалить;
top, t, p – указатели на вершину, текущей и предыдущий элемент соответственно;
f – флаг.
.

readln (name);
p: = nil;
t: = top;
f: = 0;
while (f=0) and (t <> nil) do
begin
if t^.name = name then
{удаление элемента из списка}
begin
if p=nil then
{удаление элемента, стоящего на первом месте в списке}
top: = t^.l
else
{удаление среднего или последнего элемента}
p^.l: = t^.l;
dispose (t);
f: = 1;
end
else
{переход к следующему элементу списка}
begin
p: = t;
t: = t^.l;
end;
end;
if f=0 then writeln (‘Элемент не найден’)
else writeln (‘Элемент удален’);
. . .
