теория к пр з 1.pptx
- Количество слайдов: 25
Теоретический материал к практическому занятию № 1 «Списки» *Программирование и ОА ч. 2
Краткие сведения о списках
*Все переменные, которые мы использовали в предыдущих программах являлись статическими. То есть при компиляции за переменными закреплялась память на все время работы программы, хотя часть переменных могла использоваться только в части программы. Кроме того статически выделяемая память, как мы видели, ограничена. Для более экономного использования памяти и увеличения ее размера для программ используется динамическое распределение памяти. *
* В отличие от статических переменных, Динамические переменные создаются и уничтожаются во время выполнения программы. *Динамические переменные не имеют имени. Для работы с ними введены специальные ссылочные типы, или указатели. По существу указатель - это адрес, начиная с которого динамическая переменная размещена в памяти.
* Указатель связывается не с конкретной переменной, а с определенным типом данных. Для описания указателя используется знак “^”. * Пример описания Type IP = ^Integer; {тип указателя на целое} P = ^Zap; {тип указателя на запись Zap} Zap = record. . . end; Var Pointer 1 : ^Char; {указатель на Char} Pointer 2 : ^Real; {указатель на Real} Pointer 3 : IP; Pointer 4 : P;
В Турбо Паскале определена лишь одна операция над указателями - присваивание. Можно присвоить значение одного указателя другому указателю на тот же тип данных. NIL -специальное значение, обозначающее пустой указатель, который ни на что не указывает.
*Для того, чтобы выделить место в динамической памяти под динамическую переменную, используется процедура NEW. type PE = ^integer; begin. . . New(PE); . . . end.
*В приведенном примере выделяется 4 байтов и адрес начала этой области возвращается в указателе PE. Для обращения к полученной динамической переменной используется конструкция вида <имя указателя>^: PE^: =3; F : =sqr(PE^); Для освобождения динамической памяти используется процедура Dispose(PE); {освобождает 4 байтов в куче}
*Одной из областей, где необходимо использование указателей, является работа со списками, односвязными и двусвязными. Списки имеют начало и конец. Основные действия: создание, просмотр, вставка и удаление элемента в указанном месте списка. *Широкое распространение среди односвязных списков получили такие динамические структуры данных, как стеки, очереди и кольцеобразные списки. *СПИСКИ
Структура односвязного списка * Структура односвязного Список имеет начало N, конец К и текущий указатель S. списка
type tz = record inf: integer; next : tu; tu = ^ tz; var z: tz; N, S, K : tu; begin {создание не рассматриваем} S: =N; repeat writeln(S^. inf); S: = S^. next; until s=nil; * Описание и просмотр элементов списка
*Стек организован таким образом, что программе доступна лишь его вершина W: оттуда можно взять элемент или записать его туда. Таким образом, элементы можно извлечь из стека в порядке, обратном порядку их записи -"последний вошел первый вышел“ (LIFO)
W inf 3 inf 2 inf 1 ntxt nil * Структура стека
W inf 1 next nil * Стек из одного элемента
Создаем вспомогательный указатель S на запись и заносим информацию inf 2 в поле записи. S inf 2 next W * Добавление второго inf 1 элемента next nil
S inf 2 next W * inf 1 next nil
S inf 2 next W * inf 1 next nil
W inf 2 next S *Присваиваем указателю inf 1 nil next S значение nil
*Перенос вершины на первый элемент : *W: = W^. next ; inf 2 next W * inf 1 next nil
Очередь же реализует другой вариант доступа к данным - "первый вошел - первый вышел’. Новый элемент добавляется в конец очереди, а выбирается первый (FIFO). *Очередь
K N inf 1 inf 2 inf 3 next *Структура очереди nil
*Создаем элемент, как в стеке K N inf 1 inf 2 inf 3 next S inf 2 next nil * Добавление элемента
S^. next : = nil; K^. next : = S; * Вставляем в конец очереди K N inf 1 inf 2 inf 3 next S inf 2 next nil
K : = S; S: =nil; N inf 1 inf 3 next K inf 2 next nil S nil
*Если последний элемент очереди связать с первым элементом, то получится замкнутый, кольцеобразный список. В нем используется текущий указатель, можно добавлять или удалять элементы в место, где он находится. *Кольцо


