Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_3.doc
Скачиваний:
4
Добавлен:
12.03.2015
Размер:
1.34 Mб
Скачать

5.3.3. Слияние двух отсортированных списков в третий отсортированный список.

Пусть заданы два непустых и отсортированных по возрастанию списка h1 и h2. Получить объединенный отсортированный список за счет перекоммутации ссылок между узлами списков. Голова объединенного списка будет h1.

Procedure AddList ( Var h1, h2 :u);

Var p, t1, t2 :u;

Begin

If h1^.i > h2^.i { добиваемся, чтобы h1 указывал на первый элемент с

Then Begin t1:=h1; h1:=h2; h2:=t1; End; меньшим значением}

t1 := h1; p :=Nil; t2 := h2;

Repeat {цикл объединения списков}

While ( t1< > Nil ) And ( t1^.i <= t2^.i ) Do Begin

p :=t1; t1 := t1^.L; { продвижение по текущему списку пока не

End; нужна перекоммутация }

p1^.L := t2; t2 := t1; t1 := p^.L;{ коммутация двух узлов из разных списков }

Until t2 = Nil; { если достигли конца одного из списков – задача выполнена }

End;

5.4. Линейный двусвязный список.

Рассмотренные ЛС являются структурами с последовательным доступом. Еще их называют односвязными, поскольку связи между узлами однонаправлены и просматривать элементы списка можно только от начала к концу. В некоторых практических задачах более эффективной структурой для представления данных яв­ляются двусвязные ЛС, где каждый элемент (узел) содержит ссылку не только на следующий, но и на предыдущий элементы. Обычно их еще называют R – правой ссылкой и L – левой ссылкой. В таких ЛС можно продвигаться как в пря­мом, так и обратном направле­ниях. Далее приведены соответст­вующие основные объявления и процедуры демонстрирующие ра­боту с двусвязными ЛС.

5.4.1. Создание 2-связного списка.

Type u = ^Uzl;

Uzl = Record

i :Integer;

L, R :u;

End;

Var h :u;

Procedure Create2List ( Var h :u; n :Word ); {n – количество узлов}

Var t :u; k :Word;

Begin New(h); h^.i := Random(50); h^.L := Nil; t := h; {создали новый узел}

For k:=1 To n-1 Do Begin

New ( t^.R ); и подключили его к Rccылке предыдущего узла}

t^.R^.L := t; {в ссылочное поле нового узла записали L - ссылку }

t := t^.R; {указатель t переместили на новый узел }

t^.i := Random(50); { заполнили информационное поле нового узла }

End;

t^.R := Nil; { R - ссылка последнего узла равна Nil}

End;

5.4.2. Удаление в 2-связном списке.

Procedure Del2List ( Var h :u; a :Integer );

Var t :u;

Begin

t := h;

While t <> Nil Do

If t^.i = a

Then

If t = h Then Begin t := t^.R; Dispose ( t^ .L ); {удаление спереди}

t^.L := Nil; h:=t; Exit;

End

Else Begin t^.L^.R := t^.R; {удаление в середине}

t^.R^.L := t^.L;

Dispose( t ); Exit;

End

Else t := t^.R; { продвижение вдоль списка}

Writeln( ' нет такого элемента в списке ' );

End;