Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Itogovye_otvety_programmirovanie_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
202.75 Кб
Скачать

19. Исключение компонент из середины списка

Операция исключения компонент из середины списка будет простй тогда, когда имеется ссылка на компоненту, предшествующую исключаемой компоненте. Назовем её PREV.

prev^.next := prev^.next^.next;

Здесь также можно рассмотреть два варианта:

  1. Удаление первого объект из списка и присваивание указателя на него в переменную out.

Procedure delete_head(ver out:link); Begin Out:=head Head:=head^.next; End;

  1. Удаление из списка элемента, стоящего после prev, на который имеется ссылка, и присвоение указателю на него переменной Out происходит следующим образом.

procedure DeleteAfter (prev: link; var Out: link); begin Out := prev^.next; prev^.next := prev^.next^.next; end;

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

procedure Delete (our: link; var head: link); var cur: link; begin if out= head then head := out^.next else begin cur := head; while cur^.next<>out do cur := cur^.next; cur^.next := out^.next; end; end;

20. Рекурсивная обработка списка

Рекурсивное определение списка: список м.б. либо пустым, либо состоять из узла, содержащего ссылку на список.

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

Пр. 2 рекурсивные процедуры: 1 для чтения последовательности символов, др. для печати их в исходном порядке.

program CopyList; type link = ^node; node = record data: char; next: link end; var head: link; procedure AddToList (var p: link);

begin if p=nil then begin new(p); p^.next := nil; read(p^.data); end else AddToList (p^.next); end; procedure PrintList (p: link);

begin if p<>nil then begin write(p^.data); PrintList (p^.next) end; end; BEGIN head := nil; while not eof do AddToList (head); PrintList (head); END.

Вопрос 21

Несколько изменив структуру списка можно избавиться от неудобств связанных с необходимостью особой обработки специальных случаев. В каждой компоненте списка можно хранить две ссылки: 1 на предыдущую компоненту, а другую на следующую. Модифицированное описание списка будет выглядеть следующим образом:

Type link=record Next, Before: link; Data: datatype; End;

Next – ссылка на следующую компоненту списка (ссылка вперед)

Before – ссылка на предыдущую компоненту (ссылка назад)

Для полной симметрии можно связать 1 и последнюю компоненту списка между собой. В результате получится двусвязное кольцо.

Если мы определили пустое кольцо, как кольцо состоящее из фиктивной компоненты, ссылающейся сама на себя как на следующем рисунке, то процедура обработки кольца заметно упроститься.

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