- •4. Динамические структуры
- •4.1. Данные динамической структуры
- •4.2. Линейные связанные структуры данных
- •5.3.1. Создание лс.
- •5.3.2. Вывод списка
- •5.3.2. Удаление элемента из списка.
- •5.3.2. Вставка в отсортированный список.
- •5.3.3. Слияние двух отсортированных списков в третий отсортированный список.
- •5.4. Линейный двусвязный список.
- •5.4.1. Создание 2-связного списка.
- •5.4.2. Удаление в 2-связном списке.
- •5.4.2. Вставка заданного элемента в отсортированный 2-связный список.
- •5.5. Стек.
- •5.6. Пример вычисления арифметического выражения с помощью стеков.
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 ); и подключили его к R – ccылке предыдущего узла}
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;