Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
10.12.2013
Размер:
714.24 Кб
Скачать

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.

Составитель:

ст. преподаватель _______________ Д.М.Ахмедханлы

Зав.кафедрой ИиСУ _______________ С.В.Краснов

Декан ФИиТ _______________ С.В.Краснов

18

Соседние файлы в папке Лекции