- •1 Линейные двусвязные списки
- •2 Основные операции над списком
- •2.1 Добавление элемента в список
- •2.2 Удаление элемента из списка
- •2.3 Вставка элемента внутри списка
- •3 СоЗдание, просмотр и уничтожение списка
- •Упражнения
- •4 Поиск элемента в списке
- •5 Перемещение элементов списка
- •Упражнения
- •6 Примеры обработки списка
- •Упражнение
- •Упражнение
- •Упражнения
- •Литература
Упражнения
Указание к решению. Операции выделения и освобождения памяти не использовать, информационные поля не менять.
Замечание. Предполагается, что список не пуст и содержит не менее двух элементов.
5.1 Переместить первый элемент в конец списка.
5.2 Поменять местами первый и последний элементы списка, используя в процедуре обмена только один дополнительный указатель.
6 Примеры обработки списка
Пример 6.1 Вставить в список после каждого элемента с заданным значением x новый элемент с заданным значением y .
procedure DInsert_1(first:link; var last:link;
x,y:integer);
var q:link; {указатель на новый элемент}
begin
while first<>nil do
if first^.inf=x then
begin
new(q); q^.inf:=y;
q^.prev:=first;
q^.next:=first^.next;
if first^.next = nil then
last:=q
else
first^.next^.prev:=q;
first^.next:=q;
first:=q^.next {переход к элементу, следующему за новым}
end
else first:=first^.next {переход к следующему элементу}
end;
Контрольные примеры
1) Список (значения информационных полей списка): 1 3 7 1 3 5 1
а) x =1, y =0
Результат:
просмотр от первого до последнего элемента : 1 0 3 7 1 0 3 5 1 0
просмотр в обратном порядке : 0 1 5 3 0 1 7 3 0 1
б) x =2, y =0
Результат:
просмотр от первого до последнего элемента : 1 3 7 1 3 5 1
просмотр в обратном порядке : 1 5 3 1 7 3 1
2) Список из одного элемента: 1
x =1, y =0
Результат:
просмотр от первого до последнего элемента : 1 0
просмотр в обратном порядке : 0 1
Пример 6.2 Вставить в список после первого от начала списка элемента с заданным значением x новый элемент с заданным значением y .
Решение оформлено в виде функции, которая возвращает значение true , если элемент со значением x был найден и новый элемент вставлен в список, и значение false , если среди элементов списка нет элемента со значением x .
function DInsert_2(first:link; var last:link;
x,y:integer):boolean;
var q:link; {указатель на новый элемент}
fl:boolean; {признак отсутствия элемента x в списке}
begin
fl:=true;
while (first<>nil)and fl do
if first^.inf=x then fl:=false
else first:=first^.next;
if not fl then
begin
new(q); q^.inf:=y;
q^.prev:=first; q^.next:=first^.next;
if first^.next = nil then last:=q
else first^.next^.prev:=q;
first^.next:=q; first:=q^.next
end;
DInsert_2:=not fl
end;
Контрольные примеры
1) Список (значения информационных полей списка): 1 3 7 1 3 5
а) x =1, y =0 Результат – true
просмотр от первого до последнего элемента : 1 0 3 7 1 3 5
просмотр в обратном порядке : 5 3 1 7 3 0 1
б) x =7, y =0 Результат – true
просмотр от первого до последнего элемента : 1 3 7 0 1 3 5
просмотр в обратном порядке : 5 3 1 0 7 3 1
в) x =5, y =0 Результат – true
просмотр от первого до последнего элемента : 1 3 7 1 3 5 0
просмотр в обратном порядке : 0 5 3 1 7 3 1
г) x =2, y =0 Результат – false
просмотр от первого до последнего элемента : 1 3 7 1 3 5
просмотр в обратном порядке : 5 3 1 7 3 1
2) Список из одного элемента: 1
а) x =1, y =0 Результат – true
просмотр от первого до последнего элемента : 1 0
просмотр в обратном порядке : 0 1
б) x =7, y =0 Результат – false
Результат просмотров от первого до последнего элемента и в обратном порядке – список из одного элемента со значением информационного поля равным 1.
Пример 6.3 Продублировать первый отрицательный элемент списка.
В процедуре дублирования используются процедура DAdd_last1 добавления в конец непустого списка и процедура DInsert_next вставки после элемента с заданным адресом (см. раздел 2 ).
procedure Dubl(first:link; var last:link);
var fl: boolean; {признак отсутствия отрицательного элемента}
begin
fl:=true;
while (first<>nil)and fl do {поиск отрицательного элемента}
if first^.inf <0 then fl:= false
else first:=first^.next;
if not fl then {отрицательный элемент найден}
begin
if first^.next=nil then {отрицательный элемент – последний}
DAdd_last1(last, first^.inf)
else {отрицательный элемент – не последний}
DInsert_next(first, first^.inf)
end
end;