Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

Вставка элемента после заданного элемента

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

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

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

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

new(q);

q^.inf:=x;

q^.next:=p^.next; //Установка ссылки в новом элементе на элемент, который следовал за элементом А

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

end;

Вставка элемента перед заданным (но не первым) элементом 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;

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

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;

21.2.4.Пример.

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

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]