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

Если указатель списка First равен Nil, то списка еще нет (он пуст). Значит это начальное значение списка. Для его инициализации следует записать: First:= Nil;

Следующий программный код формирует список из N узлов:

Procedure CreateOneWayList(N: Integer);

Var i: Integer;

Begin

i:= N;

While i > 0 Do Begin

New(Current);

Current^.Next:= First;

First:= Current;

With Current^ Do Begin

Key:= i;

<заполнение полей Current^.Dat>

End;

i:= i-1;

End;

End;

Под управлением процедуры CreateOneWayList список формируется в направлении «от конца к началу», т. е. последний элемент списка будет создан первым. В поля Key заносятся номера узлов. Логическая структура списка, сформированного при N=4, приводится на рисунке 6.3.

Рисунок 6.3  Структура односвязного списка, сформированного процедурой CreateOneWayList при N=4

      1. Просмотр односвязного списка

Операция просмотра списка, называемая также прохождением, заключается в переходах курсора Current от узла к узлу по структурным указателям, расположенным в поле Next всех узлов. Просмотр начинается от начала списка (от элемента First^) и производится до достижения узла, у которого в поле Next записано значение Nil.

Программный фрагмент просмотра имеет следующий вид:

Current:= First;

While Current <> Nil Do Begin

With Current^ Do Begin

<действия с полями элемента Current^>

Current:= Current^.Next;

End;

End;

      1. Вставка элемента в односвязный список

Для реализации операций вставки и удаления необходимо запрограммировать алгоритмы, предусматривающие несложные манипуляции с указателями.

Рассмотрим включение в список после текущего элемента (элемента, заданного указателем Current), когда этот текущий элемент не является ни первым и ни последним элементом списка.

На рисунке 6.4 изображена схема, иллюстрирующая первую разновидность операции включения узла с меткой 20. Для организации операции включения требуется дополни­тельный указатель G (типа PNode). Фрагмент программной реа­лизации этой операции включения может выглядеть так:

New(G); G^.Key:= 20;

G^.Next:= Current^.Next;

Current^.Next:= G;

После выполнения операторов первой строки этого фрагмента

а)  в памяти образуется ячейка, размер которой определяется типом TNode,

б)  указатель G получает направление («начинает указывать») на созданную ячейку,

в)  в поле Key этой ячейки заносится значение 20.

Результат этих действий показан на рисунке 6.4 б. Новая ячейка идентифицируется как G^.

При выполнении присваивания во второй строке в поле Next элемента G^ записывается тот же адрес, который хранится в указателе Next текущего элемента. Иначе говоря, указатель G^.Next начинает указывать на то же место в памяти, что и указатель Current^.Next, т. е. на узел с меткой 3. Это показано на рисунке 6.4 в.

Рассмотрение операции вставки можно было бы закончить, приведением логической схемы, показанной на рисунке 6.4 г. Однако эту схему можно преобразовать к более привычному виду односвязного списка, который показан на рисунке 6.5.

Рисунок 6.4  Этапы операции включения узла в односвязный список

Рисунок 6.5  Результат вставки узла с меткой 20

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

New(G);

G^.Next:= First;

First:= G;

а для добавления элемента (вставки в конец списка), когда текущим является последний элемент списка, можно использовать следующий код:

New(G);

G^.Next:= Current^.Next; // т.е. G^.Next = Nil

Current^.Next:= G;