Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АЯП лекции.doc
Скачиваний:
12
Добавлен:
03.12.2018
Размер:
634.37 Кб
Скачать

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

Аналогично добавлению при удалении рассматривается три случая:

Примечание. Все рассматриваемые ниже алгоритмы физически из памяти элементы не удаляют. Они удаляются только из списка.

1) Удаление первого элемента списка просто-напросто в адрес начала списка записываем адрес второго элемента:

n:=n^.next;

2) Удаление элемента, стоящего за элементом, обозначенным ключом

а) считаем, что начало списка – адрес «n»;

б) передвигаем указатель «p» на ключевой элемент;

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

p:=n;

while (p^.inf < > x) and (p < > nil) do

p:=p^.next;

p^.next:=p^.next^.next;

3) Удаление элемента, стоящего перед элементом, обозначенным ключом

удаление в этом случае, так же, как и при добавлении элемента, сводится к первому-второму случаю, только рассматривается не первый элемент, как в пункте 1), а второй. Отличается только условие прохождения по циклу.

if n^.next^.inf=x then

n:=n^.next

else

begin

p:=n;

while (p^.next^.next^.inf < > x) and (p < > nil) do

p:=p^.next;

if p < > nil then p^.next:=p^.next^.next;

Примечание. Особое внимание обратить на то, что в некоторых задачах ключом списка является адрес элемента списка, а в некоторых – информационная часть, т.е. содержимое списка.

Пример. Из файла целых чисел сформировать очередь, затем в ней поменять местами минимальный и максимальный элементы.

type sp=^el;

el=record

inf:integer;

next:sp;

end;

var f:file of integer;

b,min,max:integer;

n,p,q,amin,amax:sp;

begin

assign(f,’dat’);

reset(f);

read(f,b);

new(p);p^.inf:=b;

p^.next:=nil;

n:=p;

repeat

read(f,b);

new(q);

q^.inf:=b;

q^.next:=nil;

p^.next:=q;

p:=q;

until eof(f);

close(f);

max:=n^.inf;

min:=n^.inf;

amin:=n;

amax:=n;

while p < > nil do

begin

if max < p^.inf then

begin

max:=p^.inf;

amax:=p;

end;

if min > p^.inf then

begin

min:=p^.inf;

amin:=p;

end;

p:=p^.next;

end;

amin^.inf:=max;

amax^.inf:=min;

p:=n;

while p < > nil do

begin write (p^.inf,’ ‘);

p:=p^.next;

end;end.

Пример. Задан текстовый файл. Вывести слова в обратном порядке. Использовать строковую структуру – стек. Данная структура позволит за один проход по файлу достигнуть желаемого результата.

type sp=^el;

el=record

inf:string;

next:sp;

end;

var n,q,p:sp;

t:text;

zp:set of char;

c:char; st:string;

begin assign (t,’text.txt’);

reset(f);

p:=nil;

zp:=[‘.’,’,’,’:’];

repeat

st:=’’;

read(t,c);

while (not(c in zp)) and (not eof(f)) and (not eoln(f)) do

begin

st:=st+c;

read(t,c);

end;

if eoln(t) then readln(t);

if sp< >’’ then begin

new(q);

q^.inf:=st;

q^.next:=p;

p:=q;

end;

until eof(t);

n:=p;

while p < >nil do

begin writeln (p^.inf);

p:=p^.next;

end;end.

«Древовидные структуры»

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

Если адресных поля два то такое дерево называется бинарным. В общем случае можно считать список вырожденным деревом. Элементы образующие дерево называется узлами.

В бинарном дереве элемент адрес которого расположен выше называется потомком.

По наличию потомков все узлы бинарного дерева делятся на три вида:

1.Узел адрес которого является адресом начала дерева называется корнем.

2.Если элемент дерева имеет хотя бы одного потомка то это просто узел.

3.Если узел не имеет ни одного потомка, то он называется листом.

Дерево считается сбалансированным если относительно любого узла количества элементов в правом и левом поддереве равны.

В сбалансированном левостороннем дереве количество элементов левого и правого поддерева находятся в следующем соотношении:

nl = ndw2

nr = n – nl – 1

n – общее количество элементов поддерева начиная с анализируемого узла.

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

Будем рассматривать рекурсивное формирование бинарного сбалансированного дерева с заранее количеством элементов.

При построении дерева будем использовать левостороннюю ориентацию, т.е первоначально будем формировать левую ветвь, а из «остатков» правую.

Программа, содержащая функцию формирования дерева и процедуру вывода элементов дерева слева на право.

type ref =^el;

el=record

key:integer;

l,r:ref; end;

var n:integer;

root:ref;

FUNCTION TRE(n:integer):ref;

var newnode:ref;

x, nl, nr: integer;

begin

if n=0 then tree:=nil

else begin nl:=ndw2;

nr:=n-nl-1;

read(x); new(newnode);

with newnode^ do begin

key:=x;

l:=tree(nl);

r:=tree(nr); end; end;

tree:=newnode:

end;

PROCEDURE PRINTTREE(t:ref;h:integer);

Var i:integer;

begin

if t< >nil then

with t^ do begin printtree(l,h+1);

for i:=1 to h do write(‘ ‘);

writeln(key);

printtree(r,h+1);end; end;

begin readln(n);

root:=tree(n);

printtree(root,0); end.

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

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