Вставка элемента перед заданным (но не первым) элементом A

Исходный список

Вставить элемент после заданного (см. выше), затем поменять местами значения полей inf заданного и нового элементов.

Удаление заданного (но не первого) элемента

Исходный список Список после удаления элемента

Выполнить проход (c) по списку с двумя указателями в поисках заданного элемента А.

Если элемент найден, выполнить:

pred^.next:=p^.next;//Изменение поля ссылки в предшествующем элементе для обхода удаляемого

Dispose(p); //Освобождение памяти, которую занимал удаляемый элемент

p:=nil

Вставка элемента в конец списка

Исходный список Список после вставки

Выполнить проход (b) по списку с проверкой наличия элемента, следующего за текущим, затем:

new(q);

q^.inf:=x;

q^.next:=nil;//Новый элемент никуда не ссылается

p^.next:=q; //Установка ссылки бывшего последнего элемента на новый элемент

Вставка элемента перед последним

Исходный список Список после вставки

Вставить элемент в конец списка (см. выше), затем поменять местами значения полей inf последнего и нового элементов.

Удаление последнего элемента

Исходный список Список после удаления

Выполнить проход (d) по списку с двумя указателями и с проверкой

наличия элемента, следующего за текущим, затем:

pred^.next:=nil;{Предпоследний элемент становится последним}

Dispose(p); {Освобождение памяти, которую занимал последний элемент}

p:=nil;

Операции над каждым элементом односвязного линейного списка

Cумма элементов списка

p :=Head;

Sum:=0;

while p<>nil do

begin

Sum:=Sum+p^.inf;

p:=p^.next

end;

Поиск максимального элемента списка

p :=Head;

pmax:=p; //Первый элемент полагаем максимальным

while p<>nil do

begin

if (p^.inf > pmax^.inf) then pmax:=p;

p := p^.next

end; //На выходе указатель pmax ссылается на элемент с максимальной информационной частью

Вывод элементов списка в прямом порядке

procedure PrintList(p: ref);{Параметр p указывает на начало списка}

const str=' -> '; //Стрелка для отделения элементов списка при выводе

begin

while (p <> Nil) do

begin

write(str, p^.inf); //Вывод поля inf текущего элемента

p := p^.next

end;

writeln

end;

Вывод списка на экран в строку в обратном порядке рекурсивно

procedure RevPrintList(p:ref);{Параметр p указывает на начало списка}

const str=' <- '; //Стрелка для отделения элементов списка при выводе

begin

if (p <> nil) then

begin

RevPrintList(p^.next);

write(p^.inf, str) //Вывод поля inf текущего элемента на рекурсивном возврате

end;

Пример.

Создать односвязный линейный список с включением новых элементов в начало списка, вывести элементы списка в прямом и в обратном порядке

function NewElem(p: ref; x: integer): ref; {Создание нового элемента.

Параметр p указывает на начало списка}

var q: ref;

begin

new(q); {Выделение в динамической памяти места для нового элемента}

q^.inf:=x; {Заполнение поля данных}

q^.next:=p; {Заполнение поля ссылки}

Result:=q; {Результат функции – ссылка на новый элемент}

end;

begin

Head:= nil; {Создание пустого списка}

repeat

write('Элемент='); readln(x); {Ввод очередного числа}

if (x<>0) then

Head:=NewElem(Head, x);{Создание элемента и присоединение к голове списка}

until (x=0);

PrintList(Head); {Вывод списка от начала к концу}

RevPrintList(Head); {Рекурсивный вывод списка от конца к началу}

writeln;

end.

Стеки

Стек – динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека.

По определению, элементы извлекаются из стека в порядке, обратном их добавлению, т.е. действует принцип «последним пришёл – первым вышёл» (LIFO – Last In First Out).

Основные операции над стеком:

• Занесение в стек (принято называть Push);

• Выборка из стека (принято называть Pop);

Дополнительные операции:

• Создание пустого стека (DoTop);

• Проверка, пуст ли стек (IsEmpty);

• Просмотр элемента в вершине стека без удаления (InTop);

• Перемена местами двух элементов в вершине стека (Swap).