|
||||||||||||||||
Сортировка включением.. Указатели.8.1.2. Сортировка включением.
DP1 PROGRAM InsertionSort (INPUT, OUTPUT); {Сортирует символы из INPUT} CONST Max = 16; ListEnd = 0; TYPE RecArray = ARRAY [1 .. Max] OF RECORD Key: CHAR; Next: 0 .. Max; END; VAR Arr: RecArray; First, Index: 0 .. Max; Prev, Curr: 0 .. Max; Extra: CHAR; Found: BOOLEAN; BEGIN {InsertionSort} First := 0; Index := 0; WHILE NOT EOLN DO BEGIN {Помещать запись в список, если позволяет пространство, иначе игнорировать и сообщать об ошибке} Index := Index + 1; IF Index > Max THEN BEGIN READ(Extra); WRITELN('Сообщение содержит: ', Extra, '. Игнорируем.'); END ELSE BEGIN READ(Arr[Index].Key); {Включение Arr[Index] в связанный список} END END; {WHILE} {Печать списка начиная с Arr[First]} END. {InsertionSort}
DP 1.1. {Вставляем запись в связанный список} Prev := 0; Curr := First; {Найти значения Prev и Curr, если существуют такие что Arr[Prev].Key <= Arr[Index].Key <= Arr[Curr].Key}
Arr[Index].Next = Curr; IF Prev = 0 {Первый элемент в списке} THEN First := Index; ELSE Arr[Prev].Next := Index;
DP 1.1.1 {Найти значения Prev и Curr, если существуют такие что Arr[Prev].Key <= Arr[Index].Key <= Arr[Curr].Key}
Found := FALSE: WHILE (Curr <> 0) AND NOT Found DO IF Arr[Index]. Key > Arr[Curr].Key THEN BEGIN Prev := Curr; Curr := Arr[Curr].Next END ELSE Found := True;
DP 1.2 {Печать списка начиная с Arr[First]} Index := First; WHILE Index <> ListEnd DO BEGIN WRITE(Arr[Index].Key); Index := Arr[Index].Next END; WRITELN;
20.2. Указатели.
Pascal имеет специальный встроенный тип данных для поддержки процессов обработки связанных структур, меняющих во время выполнения программы размер занимаемой памяти. Тип указатель не похож на обычный тип данных, он не содержит данные непосредственно, но лишь указывает на переменную где фактически хранятся данные.
Использование указателей эффективно в тех алгоритмах, где важнее размещение значений, чем их обработка.
TYPE RefInt = ^INTEGER; VAR PInt1, PInt2: RefInt;
Операции = и <> применимы к указателям и позволяют узнать эквивалентны ли значения двух переменных типа указатель.
Для обозначения указателей не связанный с какой-либо переменной, «пустых», используется константа NIL – пустой указатель.
Переменной типа указатель может быть присвоено значение другой переменной или значение константы NIL.
Выделение памяти.
Освобождение памяти.
После выполнения DISPOSE значение переменной типа указатель становится неопределенным, для последующего использования она должна быть инициализирована.
|
||||||||||||||||
|