- •Лекция 1. Структура программы на языке Turbo Pascal
- •Лекция 2. Процедуры ввода-вывода. Некоторые встроенные функции Турбо-Паскаля.
- •Лекция 3. Операторыусловного выполнения.
- •1. Оператор if.
- •2. Оператор выбора (case)
- •Лекция 4. Операторыциклов в Паскале
- •1. Цикл с постусловием (Repeat)
- •2. Цикл с предусловием (While)
- •3. Цикл со счетчиком (For)
- •Лекция 5. Символьные и строковые переменные
- •1. Символьный тип
- •2. Строковый тип
- •Лекция 6. Перечисляемый и ограниченный типы
- •1. Перечисляемый тип
- •2. Ограниченный тип
- •Лекция 7.Массивы
- •1. Понятие массива. Одномерные массивы
- •2. Многомерные массивы
- •3. Сортировка и поиск
- •Лекция 8. Тип запись
- •Лекция 9. Процедуры и функции
- •Лекция 10. Модуль crt
- •1. Управление экраном
- •2. Работа с клавиатурой
- •3. Другие возможности
- •Лекция 11. Графика в Турбо Паскале
- •1. Включение и выключение графического режима.
- •2. Построение элементарных изображений
- •3. Вывод текстовой информации.
- •Лекция 12. Текстовые файлы
- •1. Объявление файловой переменной и привязка к файлу на диске
- •2. Чтение данных из файла
- •3. Записьданных в файл
- •Лекция 13. Двоичные файлы
- •1. Типизированные файлы
- •2. Нетипизированные файлы
- •Лекция 14. Модули в Турбо Паскале
- •Лекция 15. Динамические переменные
- •Динамические структуры данных
- •Лекция 16. Динамические переменные: другие виды списков, стек и очередь.
- •1. Другие виды списков
- •2. Стек и очередь
- •Лекция 17. Деревья и поиск в деревьях
- •Лекция 18. Таблицы и простейшие алгоритмы поиска.
- •1. Определения и описания структур данных
- •1. Массив
- •2. Список
- •3. Дерево
- •2. Алгоритмы
- •1. Линейный поиск в массиве
- •2. Двоичный поиск
- •3. Линейный поиск в списке
- •Лекция 19. Перемешанные таблицы
Динамические структуры данных













Прямоугольники на этой схеме –динамические переменные типа запись,Data – поле (или поля), содержащие полезную информацию (например фамилии и номера телефонов), поле, которое изображено нижеData–это указатель на следующую запись. ПеременнаяList также является указателем на запись. Жирная точка в поле «следующий элемент» в самой последней записи означает, что там лежит значениеnil, чтобы показать, что эта запись–последняя в списке.
Для описания списка на Паскале достаточно описать тип указателя на запись и тип самой записи. Выглядит всё это так:
typetItemPtr = ^tItem; {указатель на элемент}
tItem = record
Data: tData; {полезные данные}
Next: tItemPtr; {указатель на следующий элемент списка}
end;
В первой строке этого объявления бросается в глаза использование неопределённого типа tItem. Такое исключение из правил в Турбо Паскале сделано умышленно, в противном случае не было бы возможности строить списки и другие связанные структуры из динамических переменных.
Объявить сам список можно как указатель на элемент: var List : tItemPtr; пока наш список пуст, вList следует положить значениеnil. При создании первого элемента будем выполнять действияNew(List); List^.Next:=nil.
В списках всегда хранится ровно столько элементов, сколько нужно; если какой-либо элемент данных потерял свою ценность, то его всегда можно удалить из списка;если появились новые данные, то можно добавить новый элемент.
Напишем теперь модуль для работы со списками. В нём содержатся процедуры первоначальной подготовки списка; добавления элемента в начало списка; удаления элемента, следующего за указанным; нахождения элемента с заданным номером; подсчета элементов и очистки списка.
unitLists;
interface
typetData =record
Name: string[50];
Phone: longint;
end;
tItemPtr = ^tItem;
tItem = record
Data: tData;
Next: tItemPtr;
end;
procedureInitList(varl: tItemPtr);
procedureAddItemToHead(varl: tItemPtr; d: tData);
functionDeleteItemAfter(varl: tItemPtr; num: word): boolean;
functionCount(l: tItemPtr): word;
functionGetItem(l: tItemPtr; num: word; var d: tData): boolean;
procedureClearList(varl: tItemPtr);
{---------------------------------------------------------------}
implementation
procedureInitList(varl: tItemPtr);
beginl:=nilend;
procedureAddItemToHead(varl: tItemPtr; d: tData);
varp: tItemPtr;
begin
new(p);
p^.data:=d;
p^.next:=l;
l:=p;
end;
functionDeleteItemAfter(varl: tItemPtr; num: word): boolean;
varp,q: tItemPtr;
i: word;
begin
i:=1;
p:=l;
while(i<>num)and(p<>nil)do begin
i:=i+1;
p:=p^.next;
end;
ifp<>nilthen begin
ifp^.next<>nilthen begin
q:=p^.next^.next;
dispose(p^.next);
p^.next:=q;
DeleteItemAfter:=true;
end
elseDeleteItemAfter:=false; {íå óäàë¸í}
end
elseDeleteItemAfter:=false;
end;
functionCount(l: tItemPtr): word;
varp: tItemPtr;
i: word;
begin
i:=0;
p:=l;
whilep<>nil do begin
i:=i+1;
p:=p^.next;
end;
count:=i;
end;
functionGetItem(l: tItemPtr; num: word;vard: tData): boolean;
varp: tItemPtr;
i: word;
begin
i:=1;
p:=l;
while(i<>num)and(p<>nil)do begin
i:=i+1;
p:=p^.next;
end;
ifp<>nil then begin
d:=p^.data;
GetItem:=true;
end
elseGetItem:=false;
end;
procedureClearList(varl: tItemPtr);
varp: tItemPtr;
begin
while(l<>nil)do begin
p:=l^.next;
dispose(l);
l:=p;
end;
end;
end.
