
- •1 Рекурсия
- •2 Рекурсия и Итерация
- •3 Линейный поиск
- •4 Поиск делением пополам (двоичный поиск)
- •5 Сортировка
- •6 Сортировка простыми включениями.
- •7 Сортировка бинарными включениями
- •8 Сортировка простым выбором.
- •9 Сортировка простым обменом (метод пузырька)
- •10 Шейкер сортировка.
- •11 Сортировка включениями с убывающими приращениями (сортировка Шелла).
- •12 Сортировка с разделением (быстрая сортировка).
- •13 Ссылочные типы.
- •14 Динамические структуры данных
- •15 Создание и уничтожение динамических переменных
- •16. Связанные списки
- •17. Связанные списки. Создание очередного элемента. Просмотр списка
- •18. Добавление компонент в середину списка
- •19. Исключение компонент из середины списка
- •20. Рекурсивная обработка списка
- •Вопрос 21
- •22 Деревья.
- •23 Двоичные деревья.
- •24 Двоичное дерево поиска.
- •25 Добавление узла к двоичному дереву.
- •26 Поиск в двоичном дереве.
- •28 Удаление из дерева.
- •29 Деревья общего вида.
- •30 Становление ооп
- •Абстрагирование
- •Иерархия
- •31 Основные концепции
- •2 Наследование
- •3 Индивидуальность объекта.(Про это у меня вообще ничего нет)
- •32 Абстрактные типы данных
- •37 Виртуальные методы.
- •38 Позднее связывание.
- •39 Полиморфизм
- •40 Расширенная совместимость типов.
- •42 Динамические объекты
- •45 Необходимость виртуальных методов.
19. Исключение компонент из середины списка
Операция исключения компонент из середины списка будет простй тогда, когда имеется ссылка на компоненту, предшествующую исключаемой компоненте. Назовем её PREV.
prev^.next := prev^.next^.next;
Здесь также можно рассмотреть два варианта:
Удаление первого объект из списка и присваивание указателя на него в переменную out.
Procedure delete_head(ver out:link); Begin Out:=head Head:=head^.next; End;
Удаление из списка элемента, стоящего после 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 и последнюю компоненту списка между собой. В результате получится двусвязное кольцо.
Если мы определили пустое кольцо, как кольцо состоящее из фиктивной компоненты, ссылающейся сама на себя как на следующем рисунке, то процедура обработки кольца заметно упроститься.