
- •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.2. Вывод списка
Вывод значений информационных полей на экран производится процедурой:
Procedure PrintList ( h :u );
Begin Writeln;
While h <> Nil Do { пока не достигнут конец списка }
Begin Write( h^.i:3); {вывод значения текущего элемента на экран}
h := h^.L; {переход к следующему элементу(узлу)}
End;
End;
Замечание. Переменная h в процедуре является локальной (в параметрах она указана без слова Var), поэтому ее изменения не будут касаться глобальной переменной h – головы списка.
5.3.2. Удаление элемента из списка.
Удаление заданного элемента из списка сводится к трем возможным случаям:
а) удаление спереди (удаление первого элемента списка);
б) удаление в середине;
в) нет удаляемого элемента.
Все варианты удаления реализованы в процедуре DelList.
Procedure DelList (Var h :u; a :integer); {a – значение удаляемого элемента}
Var p, t :u;
{ p, t – указатели соответственно на предыдущий и текущий узлы }
Begin
p := Nil; t := h; {встали на начало списка}
While t < > Nil Do {цикл просмотра списка}
If t^.i = a {если удаляемый элемент найден,
Then If p = Nil и если он первый в списке, то удаляем
Then Begin h := t^.L; Dispose(t); Exit; End как первый,
Else Begin p^. L := t^.L; Dispose(t); Exit; End иначе удаляем
как в середине}
Else Begin p := t; t := t^.L; End; {иначе продвижение вдоль списка}
Writeln( 'значения ', a:3, ' нет в списке' ); {удаляемый элемент не найден}
End;
5.3.2. Вставка в отсортированный список.
Вставка заданного элемента в отсортированный список сводится к четырем возможным случаям:
а) вставка в начало списка (вставка элемента списка как первого);
б) вставка в середину списка;
в) вставка в конец списка;
г) вставка в пустой список.
Все варианты вставки реализованы в процедуре InsList.
Procedure InsList (Var h :u; a :integer); {a – значение вставляемого элемента}
Var p, t ,s :u; { p,t,s – указатели соответственно на предыдущий,
текущий и вставляемый узлы }
Begin
New(s); { создали новый узел, ссылка на него в s }
s^.i := a; { a в новый узел }
t := h; {встали на начало списка}
p := Nil; { p - указатель на предыдущий узел}
{ Цикл поиска и вставки узла в надлежащее место списка }
While t < > Nil Do { пока не достигнут конец списка }
If t^.i > a { поиск места вставки }
Then { если место вставки найдено }
If p = Nil { и если р не успел измениться ,то}
Then Begin s^.L := h; h := s; Exit; End { вставка в начало списка}
Else Begin s^.L := t; p^.L := s; Exit; End { вставка в середину списка }
Else Begin p := t; t := t^.L; End;{ место вставки не найдено и переход к след. узлу }
{ конец цикла While }
If h = Nil Then Begin h := s; s^.L := Nil; End { вставка в пустой список }
Else Begin s^.L := Nil; p^.L := s; End; { вставка в конец списка }
End;
Процедуру InsList удобно использовать для создания отсортированного списка. Действительно, начав с пустого списка, каждое очередное значение аi вставляется и коммутируется в надлежащее в ему место в списке.
Procedure CreateSortList (Var h :u; k :integer); {k – длина списка}
Var j :Integer;
Begin
h := Nil;
For j := 1 To k Do InsList ( h, Random(50) );
End;
Для того, чтобы упростить алгоритмы операций вставки и удаления и свести их к однотипным операциям часто список снабжают дополнительным узлом, например, в начале списка - его называют заглавным узлом (звеном). В информационном поле заглавного узла может помещаться, например, количество узлов в списке или некоторая другая информация. Ниже приведены процедуры удаления и вставки, по ним видно - на сколько упрощается логика алгоритмов этих операций со списком.
Procedure DelListZ( h :u; a :Integer);
Var p,t :u;
Begin
p:=h; t:=h^.L;
While t <> Nil Do
If t^.i = a Then Begin p^.L := t^.L; Dispose(t); Exit; End
Else Begin p := t; t := t^.L; End;
Writeln('такого элемента нет');
End;
Procedure InsListZ( h :u; a :Integer);
Var p, t, s :u;
Begin
New(s); s^.i := a;
p:=h; t:=h^.L;
While (t<>Nil) And (t^.i <= a) Do
Begin p := t; t := t^.L; End;
p^.L := s; s^.L := t;
End;