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

Удаление элемента из дерева

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

В упорядоченном дереве удаление элемента упрощается так как используется алгоритм переноса информационной части на место удаляемого элемента из соответствующего листа и удаляется этот лист.

Вирт доказал:

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

Procedure delete(x:integer; var p:ref);

Var Q:ref;

Procedure del(var r:ref);

Begin

if r^.r^< >nil then del(r^.r)

else begin Q^.key:=r^.key; Q:=r; r:=r^.l; end; end;

begin

if p< >nil then

if x<p^.key then delete(x,p^.l)

else if x>p^.key then delete(x,p^.r)

else Q:=p;

if Q.r=nil then p:=Q^.l

else if Q^.l=nil then p:=Q^.r

else del(Q^.l); end.

Самоупорядочивающийся список

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

type sp=^el;

el=record

inf:string;

next:sp; end;

var n,p,q:sp;

t:text;

c:char;

st:string;

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

reset(t);

st:=’ _ ‘; read(t,c);

while (c< >’_ ‘) and (not eof(t)) and(not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t);

new(p); p^.inf:=st; p^.next:=nil; st:=’ _ ‘; read(t,c);

while (c< >’_ ‘) and (not eof(t)) and (not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t); new(q); q^.inf:=st; q^.next:=nil;

if p^.inf<q^.inf then begin

n:=p^; p^.next:=q; end;

else begin n:=q; q^.next:=p; end;

repeat read(t,c); st:=’_’;

while (c< >’_ ‘) and (not eof(t)) and (not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t);

if st< >’_ ‘ then begin

if n^.inf >st then begin

new(p); p^.inf:=st; p^.next:=n; n:=p; end;

else begin p:=n;

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

p:=p^.next; new(q); q^.inf:=st; q^.next:=p^.next;

p^.next:=q; end;

until eof(t);

p:=n;

while p< >nil do begin

writeln(p^.inf); p:=p^.next; end; end.

Частотный словарь

Задан текстовый файл. Вывести слова из этого файла с частотой их встречаемости.

type sp=^el;

el=record

inf:string;

next:sp; end;

var n,p,q:sp;

t:text;

c:char;

st:string;

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

reset(t);

st:=’ _ ‘; read(t,c);

while (c< >’_ ‘) and (not eof(t)) and(not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t);

new(p); p^.inf:=st; n:=p; p^.count:=1; p^.next:=nil;

while st:=p^.inf do begin p^.count:=p^.count+1;

st:=’ _ ‘; read(t,c);

while (c< >’_ ‘) and (not eof(t)) and(not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t); end;

new(q); q^.inf:=st; q^.count:=1; q^.next:=nil;

p^.next:=q;

repeat

st:=’ _ ‘; read(t,c);

while (c< >’_ ‘) and (not eof(t)) and(not eoln(t)) do begin

st:=st+c; read(t,c); end;

if eoln(t) then readln(t);

p:=n;

while (p^.next < > nil) and (p^.inf < > st) do p:=p^.next;

if p^.inf=st then p^.count:= p^.count+1

else begin new(q);

q^.inf:=st; q^.count :=1; p^.next:=q; q^.next:=nil; end;

Until eof(t);

p:=n;

while p< >nil do begin

writeln(p^.inf,’_ ‘,p^.count);

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

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