- •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.4.2. Вставка заданного элемента в отсортированный 2-связный список.
Procedure Ins2List ( Var h :u; a :Integer );
Var t, s :u;
Begin t := h; New (s ); s^.i := a;
While t <> Nil Do Цикл поиска и вставки узла в надлежащее место списка}
If a <= t^.i
Then
If t = h { если место вставки найдено }
Then Begin s^.L := Nil; s^.R := h; { вставка в начало списка }
t^.L := s; h := s; Exit;
End
Else Begin s^.L := t^.L; t^.L := s; { вставка в середину списка }
s^.R := t; s^.L^.R := s; Exit;
End
Else If t^.R = Nil {если t указывает на последний элемент,
Then Break { то выход,
Else t := t^.R; иначе продвигаемся вперед}
{ конец цикла While }
If h = Nil
Then Begin h := s; s^.L := Nil; s^.R := Nil; End{ вставка в пустой список }
Else Begin s^.L := t; s^.R := Nil; t^.R := s; End; { вставка в конец списка }
End;
Замечания.
1. Обратите внимание, что Pascal допускает многократное применение операции ^(разыменование) в одном выражении, что позволяет, имея указатель на какой-либо узел, обращаться к полям нескольких соседних узлов, продвигаясь по ссылкам. Такая «косвенная адресация» к различным элементам списка является удобным средством обработки.
2. Часто для ускорения доступа к элементам 2-связного списка его снабжают еще одним указателем h2 на конец списка.
3. В операциях с 2-связными списками удается избавиться от рабочего указателя p на предыдущий элемент.
4. На основе рассмотренных операций над списками можно сделать простые и важные выводы. Если имеется последовательность элементов одного типа, то представление ее в виде списка особенно удобно в тех ситуациях, когда часто должны выполняться операции удаления и/или вставки произвольных элементов последовательности и когда используется прохождение всего списка. Массивы и файлы, безусловно, хуже списков, если рассматривать операции удаления и/или вставки произвольных элементов. Для массивов требуется смещение элементов, а для файлов — перезапись. Последовательная обработка массивов происходит несколько быстрее, чем последовательная обработка списков, а последовательная обработка файлов — медленнее. Массивы имеют определенные преимущества перед списками при произвольном доступе к элементам, особенно эффективен поиск определенного элемента в упорядоченном массиве. Этот тип поиска в случае списков относится к очень медленному и требует в среднем п/2 обращений к элементам списка и сравнений. Если ожидается, что элементы будут выбираться из середины или конца списка, то не требуется его последовательно просматривать, а нужно хранить несколько указателей на эти части списка.