- •Методические указания
- •Рассмотрено на заседании кафедры Утверждено на заседании кафедры
- •Зав.Кафедрой, к.Т.Н., доцент ___________________________с.В.Краснов
- •1. Работа с динамическими структурами данных.
- •1.1.Переменные – указатели.
- •1.2.Операции с указателями.
- •2. Динамические переменные.
- •2.1. Односвязные списки
- •2.2.Двусвязные списки.
- •2.3.Бинарные деревья.
2.2.Двусвязные списки.
Двусвязными называются списки, в которых каждый элемент списка имеет указатель не только на последующий, но и на предыдущий элемент списка.
Описание двусвязных списков:
type
ps=^spisok;
spisok = record
inf: real; - информационная часть
l, r:ps; - указатели (l- левый, r -правый)
end;
Основные операции над двусвязными списками:
- переход от элемента к элементу;
- сортировка элементов;
- подключение элемента к списку;
- исключение элемента из списка.
Для реализации основных операций над двусвязными списками, можно использовать изложенные выше примеры программ работы с односвязными списками.
Задача: фрагмент удаления элемента из двусвязного списка.
name – элемент, который необходимо удалить;
top, p, t, k – указатели на начало, предыдущий, текущий и последующий элементы
соответственно;
f
.. .
readln (name);
p: = nil;
t: = top;
f: = 0;
while (f=0) and (t^.r <> nil) do
begin
if t^.name = name then
{удаление элемента из списка}
begin
if p=nil then
{удаление элемента, стоящего на первом месте в списке}
top: = t^.r
else
{удаление среднего или последнего элемента}
begin
p^.r: = t^.r;
k: = t^.r;
k^.l: = p;
end;
dispose (t);
f: = 1;
end
else
{переход к следующему элементу списка}
begin
p: = t;
t: = t^.r;
end;
end;
if f=0 then writeln (‘Элемент не найден’)
else writeln (‘Элемент удален’);
. . .
2.3.Бинарные деревья.
Бинарное дерево - это структура в которой:
- есть только один узел, в который не входит ни одного ребра (этот узел называется вершиной);
- в каждый узел, кроме вершины, входит только одно ребро;
- из каждого узла исходит не более 2-х ребер.
Пусть дана последовательность: 100, 20, 120, 130, 50, 15, 30, 35, 25, 55, 60, 110.
От каждого узла влево-вниз - ставится меньший, а вправо-вниз - больший элемент. Бинарные деревья позволяют осуществить быстрый поиск данных.
Описание бинарного дерева:
type
pd=^der;
der = record
inf: real; - информационная часть
l, r: pd; - указатели
end;
l - указатель на узел, стоящий влево-вниз;
r - указатель на узел, стоящий вправо-вниз.
Задача: создание бинарного дерева, отсортированного в алфавитном порядке по полю “name”.
top, t, n – вершина дерева, текущий и новый узлы дерева соответственно.
program derevo;
type pd = ^der;
der = record
name: string [20];
l, r: pd;
end;
var top, t, n: pd;
f: integer;
name: string [20];
begin
readln (name); new (top);
top^.name: = name;
top^.l: = nil; top^.r: = nil;
writeln (‘Вершина - ’, top^.name);
repeat
readln (name);
if length(name) <> 0 then
begin
t: = top; f: = 0;
while f = 0 do
begin
if name > t^.name then
if t^.r <> nil then t: = t^.r {вправо вниз по дереву}
else
{ найдено место вправо вниз от текущего узла}
begin new(n);
writeln (‘Справа – вниз от’, t^. name);
n^.name: = name;
n^.l: = nil; n^.r: = nil;
t^.r: = n; f: = 1;
if top^.r = nil then top^.r = t.r;
end;
if name < t^.name then
if t^.l <> nil then t: = t^.l {влево вниз по дереву}
else
{ найдено место влево вниз от текущего узла}
begin new(n);
writeln (‘Слева – вниз от’, t^. name);
n^.name: = name;
n^.l: = nil; n^.r: = nil;
t^.l: = n; f: = 1;
if top^.l = nil then top^.l = t.l;
end;
if name=t^.name then
begin new(n); {вправо вниз от равного}
n^.name:=name; n^.l:=t^.l; n^.r:=t^.r;
t^.r:=n; t^.l:=nil; f:=1;
end;
end;
end;
until length (name) = 0;
end.
Задача: сортировка записей бинарного дерева
top, t – вершина, текущий узел дерева соответственно
В данной задаче использованы следующие подпрограммы:
readrec – формирование бинарного дерева, отсортированного по полю fam;
insertrec – вставка новой записи в дерево;
writerec – распечатка отдельного узла бинарного дерева;
outrec – обход бинарного дерева.
В подпрограммах insertrec и outrec использованы рекурсивные алгоритмы (когда подпрограмма обращается сама к себе).
Program tree;
type
pd = ^dan;
dan = record
fam: string;
adr, nom: string;
l, r: pd;
end;
var
top, t: pd;
s: char;
procedure readrec (var t: dan);
{читает запись в переменную - t}
begin
with t do
begin
write (‘Введите фамилию ’); readln (fam);
write (‘Введите адрес ’); readln (adr);
write (‘Введите телефон ’); readln (nom);
end;
end;
procedure insertrec (n: pd; var top: pd);
{вставляет запись в дерево}
begin
if top = nil then begin
top: = n;
n^.r: = nil; n^.l: = nil;
end
else
if n^.fam < top^.fam then insertrec (n, top^.l)
else insertrec (n, top^.r);
end;
procedure writerec (t: dan);
{распечатка узла бинарного дерева}
begin
with t do
begin
writeln (fam);
writeln (adr);
writeln (nom);
end;
end;
procedure outrec (top: pd);
{обход отсортированного дерева}
begin
if top^.l <> nil then outrec (top^.l);
write (‘Нажмите ENTER’);
readln;
writerec (top^);
if top^.r <> nil then outrec (top^.r);
end;
{головная программа}
begin
top: = nil;
repeat
new (t);
readrec (t^);
insertrec (t, top);
write (‘Есть ли еще записи?’);
readln (s);
until (s = ‘n’) or (s = ‘N’);
outrec (top);
writeln (‘все записи изображены’);
end.
Составитель:
ст. преподаватель _______________ Д.М.Ахмедханлы
Зав.кафедрой ИиСУ _______________ С.В.Краснов
Декан ФИиТ _______________ С.В.Краснов