- •1.Файловая система. Директория, файл, путь.
- •2. Основные команды операционной системы для работы с файлами.
- •8.7. Удаление подкаталогов - команда rmdir (rd)
- •3. Физические носители данных. Их классификация, характеристики и назначение.
- •4.Статическая и динамическая области оперативной памяти. Их назначение и использование
- •Память типа rom
- •Память типа dram
- •Оперативная память sdram
- •Оперативная память ddr sdram
- •Оперативная память rdram
- •5.Указатель. Размещение данных в динамической области оперативной памяти.
- •Динамические структуры данных. Статические и динамические переменные. Адреса. Указатели и их объявление.
- •Присвоение значений указателю. Оператор @ с переменной. Оператор @ с параметром процедуры, переданным по значению. Оператор @ с параметром процедуры, переданным по ссылке.
- •6.Типы данных (целые и вещественные числа). Размер используемой памяти, пределы изменения и точность представляемых данных.
- •7.Приоритеты выполнения операций при вычислении значений арифметических и логических выражений .
- •8.Структурированные типы данных. Назначение и способы реализации.
- •9.Алгоритм, его свойства и формы представления. Типовые структуры алгоритма.
- •10.Линейная структура и ее свойства. Ввод и вывод данных. Оператор присваивания.
- •11.Циклическая структура. Назначение и основные элементы.
- •12.Цикл с явно заданным количеством повторений. Основные элементы и варианты реализации.
- •13.Цикл с неявно заданным количеством повторений. Основные элементы и варианты реализации.
- •14.Типовая структура-разветвление. Основные элементы и варианты реализации.
- •15.Процедуры. Назначение, варианты реализации.
- •16.Функции. Назначение, варианты реализации.!
- •17.Формальные и фактические параметры. Назначение, варианты реализации.
- •18.Линейный список. Реализация с использованием массивов. Реализация многомерного массива.
- •19.Линейный список. Реализация с использованием связных списков. Примеры применения.
- •20.Поиск в линейном списке. Назначение и варианты реализации. Бинарный поиск
- •Последовательный поиск
- •21.Сортировка данных в линейном списке. Назначение и варианты реализации. Упорядочивание списка. Вставление элемента в середину списка.
- •22.Стек и очередь. Назначение, варианты реализации и примеры применения.
- •Стек. Отличия стека от списка. Основные операции со стеком.
- •Очереди. Основные операции над очередью.
- •23.Дерево. Назначение, варианты реализации и примеры применения.
- •Представление деревьев. Основные операции над деревом.
- •24.Текстовые и типизированные файлы. Обмен данных с внешними носителями.
- •Типы файлов Турбо Паскаль
- •Стандартные процедуры и функции
- •Работа с типизированными файлами
- •Работа с текстовыми файлами
- •Работа с нетипизированными файлами
19.Линейный список. Реализация с использованием связных списков. Примеры применения.
В стеки или очереди компоненты можно добавлять только в какой либо один конец структуры данных, это относится и к извлечению компонент.
Связный (линейный) список является структурой данных, в произвольно выбранное место которого могут включаться данные, а также изыматься оттуда.
Каждая компонента списка определяется ключом. Обычно ключ - либо число, либо строка символов. Ключ располагается в поле данных компоненты, он может занимать как отдельное поле записи, так и быть частью поля записи.
Основные отличия связного списка от стека и очереди следующие:
-для чтения доступна любая компонента списка;
-новые компоненты можно добавлять в любое место списка;
-при чтении компонента не удаляется из списка.
Над списками выполняются следующие операции:
-начальное формирование списка (запись первой компоненты);
-добавление компоненты в конец списка;
-чтение компоненты с заданным ключом;
-вставка компоненты в заданное место списка (обычно после компоненты с заданным ключом);
-исключение компоненты с заданным ключом из списка.
Для формирования списка и работы с ним необходимо иметь пять переменных типа указатель, первая из которых определяет начало списка, вторая - конец списка, остальные- вспомогательные.
Описание компоненты списка и переменных типа указатель дадим следующим образом:
type PComp= ^Comp; Comp= record D:T; pNext:PComp end; var pBegin, pEnd, pCKey, pPreComp, pAux: PComp;
где pBegin - указатель начала списка, pEnd - указатель конца списка, pCKey, pPreComp, pAux - вспомогательные указатели.
Начальное формирование списка, добавление компонент в конец списка выполняется так же, как и при формировании очереди.
Для чтения и вставки компоненты по ключу необходимо выполнить поиск компоненты с заданным ключом:
pCKey:=pBegin; while (pCKey<>NIL) and (Key<>pCKey^.D) DO pCKey:=pCKey^.pNext;
Здесь Key - ключ, тип которого совпадает с типом данных компоненты. После выполнения этих операторов указатель pСKey будет определять компоненту с заданным ключом или такая компонента не будет найдена. Пусть pCKey определяет компоненту с заданным ключом. Вставка новой компоненты выполняется следующими операторами:
Для удаления компоненты с заданным ключом необходимо при поиске нужной компоненты помнить адрес предшествующей:
pCKey:=pBegin; while (pCKey<>NIL) and (Key<>pCKey^.D) do begin pPreComp:=pCKey; pCKey:=pCKey^.pNext end;
Здесь указатель pCKey определяет компоненту с заданным ключом, указатель pPreComp содержит адрес предидущей компоненты.
Удаление компоненты с ключом Key выполняется оператором:
pPreComp^.pNext:=pCKey^.pNext;
20.Поиск в линейном списке. Назначение и варианты реализации. Бинарный поиск
Для упорядоченных линейных списков существуют более эффективные алгоритмы поиска, хотя и для таких списков применим последовательный поиск. Бинарный поиск состоит в том, что ключ V сравнивается со средним элементом списка. Если эти значения окажутся равными, то искомый элемент найден, в противном случае поиск продолжается в одной из половин списка.
Нахождение элемента бинарным поиском осуществляется очень быстро. Max бинарного поиска равен log2(N), и при одинаковой частоте использования каждого элемента Avg бинарного поиска равен log2(N). Недостаток бинарного поиска заключается в необходимости последовательного хранения списка, что усложняет операции добавления и исключения элементов.
Пусть, например, во входном потоке задано 101 число, К1,К2,...,К100, V - элементы списка и ключ. Известно, что список упорядочен по возрастанию, и элемент V в списке имеется. Составим программу для ввода данных и осуществления бинарного поиска ключа V в списке К1,К2,...,К100.
/* Бинарный поиск */
#include
main()
{
int k[100],v,i,j,m;
for (i=0;i<100;i++)
scanf("%d",&k[i]);
scanf("%d",&v);
i=0; j=100; m=50;
while (k[m]!=v)
{
if (k[m] < v) i+=m;
else j=m-i;
m=(i+j)/2;
}
printf("%d %d",v,m);
}
2.3.3. М-блочный поиск
Этот способ удобен при индексном хранении списка. Предполагается, что исходный упорядоченный список B длины N разбит на M подсписков B1,B2,...,Bm длины N1,N2,...,Nm, таким образом, что B=B1,B2,..,Bm.
Для нахождения ключа V, нужно сначала определить первый из списков Bi, i=1,M, последний элемент которого больше V, а потом применить последовательный поиск к списку Bi.
Хранение списков Bi может быть связным или последовательным. Если длины всех подсписков приблизительно равны и M= N, то Max М-блочного поиска равен 2 N. При одинаковой частоте использования элементов Avg М-блочного поиска равен N.
Описанный алгоритм усложняется, если не известно, действительно ли в списке имеется элемент, совпадающий с ключом V. При этом возможны случаи: либо такого элемента в списке нет, либо их несколько.
Если вместо ключа V имеется упорядоченный список ключей, то последовательный или М-блочный поиск может оказаться более удобным, чем бинарный, поскольку не требуется повторной инициализации для каждого нового ключа из списка V.
