
- •Билет 2 Лексическая структура языка Pascal.
- •Билет 3 Структура Pascal-программы. Составной оператор. Константы. Переменные.
- •Билет 4. Концепция переменной языка паскаль.
- •Билет 5 Концепция типа данных языка Pascal.
- •Билет 6 Простые типы.
- •Билет 7 Стандартные типы языка Pascal.
- •Билет 8 Тип Boolean
- •Билет 9 Перечисляемый тип.
- •Билет 10. Ограниченные типы (диапазоны).
- •Билет 11 Условный оператор
- •Билет 12 Оператор варианта
- •Билет 13 Оператор цикла с постусловием
- •Билет 14 Оператор цикла с предусловием
- •Билет 15 Оператор цикла с параметром
- •Билет 16 Составные типы
- •Билет 17 Массивы, примеры использования
- •Билет 18 Записи, примеры использования
- •Билет 19 Оператор сцепления
- •Билет 20 Записи с вариантами
- •Билет 21 Множества (определение, примеры, операции).
- •Билет 22 Представления множеств, примеры использования.
- •Билет 22. Представления множеств.
- •Билет 23 Файловые типы
- •Билет 24 Операции с файлами
- •Билет 25 Текстовые файлы
- •Билет 26 Типизированные файла
- •Билет 27 Нетипизированные файлы
- •Билет 28 Процедуры и функции
- •Билет 29 Описание процедур и функций
- •Билет 30 Локальные и глобальные переменные
- •Билет 31 Параметры процедур и функций
- •Билет 32 открытые параметры.
- •Билет 33. Нетипизированные параметры.
- •Билет 34. Необходимость и преимущества модульного программирования. Структура модуля в языке Pascal.
- •Билет 35. Процедурный тип. Передача процедур и функций в качестве параметра.
- •Билет 36. Рекурсия.
- •Билет 37. Рекурсия и итерация.
- •Билет 38. Линейный поиск.
- •Билет 39. Поиск делением пополам.
- •Билет 40. Сортировка.
- •Билет 41. Сортировка простыми включениями.
- •Билет 42. Сортировка бинарными включениями
- •Билет 43. Сортировка простым выбором.
- •Билет 44. Сортировка простым обменом(пузырек).
- •Билет 45. Шейкер-сортировка.
- •Билет 46. Сортировка шелла.
- •Билет 47. Сортировка с разделением(быстрая сортировка).
- •Билет 48. Ссылочные типы.
- •Билет 49. Динамические структуры данных.
- •Билет 50. Создание и уничтожение динамических переменных.
- •Билет 51. Связные списки.
- •Билет 52. Связные списки. Создание очередного элемента. Просмотр списка.
- •Билет 53. Добавление компонента в середину списка.
- •Билет 54. Исключение компонент из середины списка.
- •Билет 55. Рекурсивная обработка списка.
- •Билет 56. Двусвязные кольца.
- •Билет 57. Деревья. Двоичные деревья. Двоичные деревья поиска.
- •Билет 58. Добавление узла к двоичному дереву поиска.
- •Билет 59. Поиск в двоичном дереве.
- •Билет 60. Просмотр двоичного дерева.
- •Билет 61. Удаление из дерева.
- •Билет 62. Деревья общего вида.
Билет 55. Рекурсивная обработка списка.
Рекурсивное определение списка: список м.б. либо пустым, либо состоять из узла, содержащего ссылку на список. Структура рекурсивных процедур обработки списков будет соответствовать определению в том смысле, что процедура будет содержать условный оператор, одна ветвь которого соответствует обработке пустого списка, а другая обрабатывает информацию, содержащуюся в одиночном узле. Для обработки оставшейся части списка процедура рекурсивно обращается сама к себе.
Пр. 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.
Билет 56. Двусвязные кольца.
изменив структуру списка, можно избавится от неудобств, связанных с необходимостью особой обработки специальных случаев. В каждой компоненте списка можно хранить две ссылки. Одна на предыдущую компоненту, а другая на следующую. Описание такого списка будет выглядеть следующим образом.
type link = record
next, before: link; {ссылки на следующую и предыдущую компоненты}
data: datatype end;
Для полной симметрии можно связать первую и последнюю компоненты списка между собой. В результате получается двусвязное кольцо.
Если мы определим пустое кольцо, как кольцо, состоящее из фиктивной компоненты, ссылающейся сама на себя, процедура обработки кольца заметно упростится.
Вставка объекта NewNode после объекта OldNode.
procedure InsertAfter (NewNode, OldNode: link);
begin NewNode^.Next:= OldNode^.Next;
NewNode^.Before:= OldNode;
OldNode^.Next^.Before:= NewNode;
OldNode^.Next:= NewNode
end;
Вставка объекта NewNode перед объектом OldNode.
procedure InsertBefore (NewNode, OldNode: link);
begin NewNode^.Next:= OldNode;
NewNode^.Before:= OldNode^.Before;
OldNode^.Before^. Next:= NewNode;
OldNode^.Before:= NewNode
end;
Удаление из списка узла CurNode.
procedure DeleteNode (CurNode: link);
begin NewNode^.Next:= OldNode;
NewNode^.Before:= OldNode^.Before;
OldNode^.Before^. Next:= NewNode;
OldNode^.Before:= NewNode
end;
Эти процедуры работают во всех случаях, и в них не используется значение переменной, начала (head), исходной точки кольца. Это делается не бесплатно. В них появилась вторая ссылка, и сами процедуры стали медленнее, т.к. в них обрабатывается большее количество ссылок.
Однако в целом, двусвязное кольцо – это более элегантная структура, чем списки. Простые операции над кольцами не требуют последовательных просмотров, а также не возникает необходимости обработки случайных случаев, т.к. мы не можем встретиться с пустой ссылкой, имеющей значение nil.
Просмотр кольца несколько отличается от просмотра списка, необходимо только помнить то место, откуда мы начали.
Пример. Cur:=Start^.Next;
While Cur<>Start do
begin Smth {оператор}
………
Cur:=Cur^.Next
end;
Оператор Smth будет выполнятся по одному разу для каждой компоненты кольца. В момент выполнения оператора переменная Cur будет указывать на текущую компоненту. Оператор Smth не будет выполняться если кольцо пусто. Если вместо переменной Next использовать переменную Before, просмотр кольца будет идти в обратном направлении.