Удаление элемента из списка.

Вывод списка

Begin

Создание ЛС.

Замечания.

1. На практике редко требуются все эти операции в самом общем виде.

2. Операции 1, 2, 3 для специальных случаев i=1 и i=n особо выделяются, поскольку проще получить доступ к первому и последнему узлам, чем к произвольному узлу.

3. Очень часто встречаются ЛС, в которых операции «включение», «исключение» и «получить доступ», почти всегда применяются к первому или последнему узлам. В этом смысле различают «стек», «очередь» и «дек» (см. ниже).

4. ЛС – структура с последовательным доступом, элементы которой связаны ссылками, поэтому операции вставки и удаления элементов сводятся к перекоммутации соответствующих ссылок между элементами.

Примеры работы с линейным списком приведены ниже.

Исходные данные для информационных полей узлов считываются из текстового файла.

 

Procedure List (Var f :Text; Var h :u);

Var t :u;

Begin Reset(f); New(h); Read ( f, h^.i ); {создали первый узел}

t:=h; {t – указатель на текущий узел, вначале указывает на первый }

While Not Eof( f ) Do Begin

New( t^.L); {создали новый узел и подключили его к предыдущему узлу}

t:=t^.L; {перешли на новый узел и

Read(f, t^.i); заполнили его информационную часть}

End;

t^.L:=Nil; {ссылка из последнего узла равна Nil}

Close(f);

End;

 

Более изящно выглядит рекурсивный вариант создания списка.

 

Function ListR ( k :Integer) :u;

Var t :u;

Ifk=0 ThenListR:=Nil {ссылочное поле последнего узла есть Nil }

Else Begin{создание очередного узла}

New(t); Read ( f, t^.i ); {создали новый узел и

t^.L := ListR (k - 1); подключили его к следующему узлу}

ListR:=t;

End;

End;

Вызов: …..h:=ListR(FileSize(f)); …..

Вывод значений информационных полей на экран производится процедурой:

 

Procedure PrintList ( h :u );

Begin Writeln;

While h <> Nil Do { пока не достигнут конец списка }

Begin Write( h^.i:3); {вывод значения текущего элемента на экран}

h := h^.L; {переход к следующему элементу(узлу)}

End;

End;

Замечание. Переменная h в процедуре является локальной (в параметрах она указана без слова Var), поэтому ее изменения не будут касаться глобальной переменной h – головы списка.

Удаление заданного элемента из списка сводится к трем возможным случаям:

 

а) удаление спереди (удаление первого элемента списка);

б) удаление в середине;

в) нет удаляемого элемента.

Все варианты удаления реализованы в процедуреDelList.

 

Procedure DelList (Var h :u; a :integer); {a – значение удаляемого элемента}

Var p, t :u;

{ p, t – указатели соответственно на предыдущий и текущий узлы }