Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двусв_Списки МУ.doc
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
195.58 Кб
Скачать

Упражнения

Указание к решению. Операции выделения и освобождения памяти не использовать, информационные поля не менять.

Замечание. Предполагается, что список не пуст и содержит не менее двух элементов.

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;