Скачать презентацию Теоретический материал к практическому занятию 1 Списки Скачать презентацию Теоретический материал к практическому занятию 1 Списки

теория к пр з 1.pptx

  • Количество слайдов: 25

Теоретический материал к практическому занятию № 1 «Списки» *Программирование и ОА ч. 2 Теоретический материал к практическому занятию № 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. *Для того, чтобы выделить место в динамической памяти под динамическую переменную, используется процедура NEW. type PE = ^integer; begin. . . New(PE); . . . end.

*В приведенном примере выделяется 4 байтов и адрес начала этой области возвращается в указателе *В приведенном примере выделяется 4 байтов и адрес начала этой области возвращается в указателе PE. Для обращения к полученной динамической переменной используется конструкция вида <имя указателя>^: PE^: =3; F : =sqr(PE^); Для освобождения динамической памяти используется процедура Dispose(PE); {освобождает 4 байтов в куче}

*Одной из областей, где необходимо использование указателей, является работа со списками, односвязными и двусвязными. *Одной из областей, где необходимо использование указателей, является работа со списками, односвязными и двусвязными. Списки имеют начало и конец. Основные действия: создание, просмотр, вставка и удаление элемента в указанном месте списка. *Широкое распространение среди односвязных списков получили такие динамические структуры данных, как стеки, очереди и кольцеобразные списки. *СПИСКИ

Структура односвязного списка * Структура односвязного Список имеет начало N, конец К и текущий Структура односвязного списка * Структура односвязного Список имеет начало N, конец К и текущий указатель S. списка

type tz = record inf: integer; next : tu; tu = ^ tz; var 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: оттуда можно взять *Стек организован таким образом, что программе доступна лишь его вершина W: оттуда можно взять элемент или записать его туда. Таким образом, элементы можно извлечь из стека в порядке, обратном порядку их записи -"последний вошел первый вышел“ (LIFO)

W inf 3 inf 2 inf 1 ntxt nil * Структура стека W inf 3 inf 2 inf 1 ntxt nil * Структура стека

W inf 1 next nil * Стек из одного элемента W inf 1 next nil * Стек из одного элемента

Создаем вспомогательный указатель S на запись и заносим информацию inf 2 в поле записи. Создаем вспомогательный указатель 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

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 inf 2 next S *Присваиваем указателю inf 1 nil next S значение nil

*Перенос вершины на первый элемент : *W: = W^. next ; inf 2 next *Перенос вершины на первый элемент : *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 *Структура очереди nil

*Создаем элемент, как в стеке K N inf 1 inf 2 inf 3 next *Создаем элемент, как в стеке K N inf 1 inf 2 inf 3 next S inf 2 next nil * Добавление элемента

S^. next : = nil; K^. next : = S; * Вставляем в конец 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 K : = S; S: =nil; N inf 1 inf 3 next K inf 2 next nil S nil

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