Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Все Разделы.docx
Скачиваний:
17
Добавлен:
21.09.2019
Размер:
607.75 Кб
Скачать
      1. Удаление элемента из односвязного списка

Для удаления простейшим вариантом является удаление элемента, находящегося после текущего узла. В этом случае необходимо установить, чтобы указатель Next текущего узла, указывавший до удаления на удаляемый элемент, стал указывать на элемент, расположенный после удаляемого. Если стартовая структура такая же, как изображенная на рисунке 6.4 а, то для удаления элемента с меткой 3 можно использовать следующий программный код:

G:= Current^.Next;;

Current^.Next:= G^.Next;

Dispose(G);

Процесс и результат выполнения операторов этого фрагмента, показан на рисунке 6.6

Рисунок 6.6  Процесс удаления узла в односвязном списке:

а – «переброска» структурного указателя текущего узла, к узлу с меткой 4, расположенному после удаляемого узла; б – уничтожение элемента с меткой 3

Код операции удаления первого элемента списка может выглядеть следующим образом:

Current:= First^.Next;;

Dispose(First);

First:= Current;

а с помощью фрагмента, приведенного ниже, удаляется последний элемент односвязного списка, если именно этот последний элемент адресуется курсором Current:

G:= First;

While G^.Next <> Current Do

G:= G^.Next;

G^.Next:= Nil;

Dispose(Current); Current:= G;

Здесь в While-цикле курсор G перемещается к предпоследнему элементу. Затем в поле структурного указателя элемента G^ записывается значение Nil, в результате чего этот элемент становится последним в списке. Удаляемый элемент Current^ уничтожается, и текущим становится новый последний элемент.

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

Односвязный список обеспечивает возможность продвижения лишь в одном направлении  от начала к концу  при просмотре списка. Линейный двусвязный список (linear double-linked list) дает возможность двигаться в одном из двух направлений. Он отличается от односвязного тем, что каждый его элемент содержит два логических указателя, один из которых, прямой указатель (direct pointer), адресует, как и в односвязном списке, следующий справа элемент, а другой, обратный указатель (backward роinter), адресует предыдущий элемент списка. Логическая структура линейного двусвязного списка (ЛДС) представлена на рисунке 6.7. Начало и конец такого списка логически эквивалентны, так как доступ к любому элементу может быть осуществлен с любого конца. Поэтому вместо терминов «начало» и «конец» списка используются термины «левый конец» и «правый конец».

Рисунок 6.7  Два варианта изображения логической структуры линейного двухсвязного списка

В кольцевом двухсвязном списке прямой указатель самого правого узла ссылается на самый левый элемент, и обратный указатель самого левого узла адресует самый правый в логической структуре узел. Логическая структура кольцевого двухсвязного списка представлена на рисунке 6.8

Рисунок 6.8  Кольцевой двухсвязный список

      1. Структура элемента двухсвязного списка

Структура узла двухсвязного списка, в общем случае, и, в частности, линейного двухсвязного списка, может задаваться следующими описаниями:

Type

PNodeDList = ^TNodeDList;

TNodeDList = Record

Key: Integer;

Dat: <идентификатор типа данных>;

Dir, Back: PNodeDlist;

End;

Тип TNodeDList  это самоадресующийся тип. Он предусматривает наличие в элементе двухсвязного списка двух структурных указателей: поле Dir предназначено для размещения указателя на следующий правый элемент, поле Back  на следующий элемент, расположенный в логической структуре слева. Поле Key введено с целью облегчения дальнейших пояснений.

Для иллюстрации операций в ЛДС нам потребуется описание некоторых переменных-курсоров:

Var Left, Right, Current, G: PNodeDList;