Удаление элемента из списка.
Вывод списка
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 – указатели соответственно на предыдущий и текущий узлы }