
- •8. Работа с массивами...............................................................................38
- •19. Обработка исключительных ситуаций................................87
- •20. Основные классы и общие свойства компонентов...93
- •28. Динамические библиотеки...........................................................136
- •4. Базовые элементы delphi
- •4.1. Алфавит среды Delphi
- •4.2. Константы
- •4.3. Переменные
- •4.4. Основные типы переменных
- •4.5. Операции над переменными и константами
- •5. Стандартные функции и подпрограммы
- •5.1. Математические функции
- •5.2. Функции преобразования
- •5.3. Дополнительные системные подпрограммы и функции
- •8. Работа с массивами
- •9. Работа со строками
- •9.1. Процедуры работы со строками
- •9.2. Функции работы со строками
- •12. Модуль unit
- •14. Работа с файлами
- •14.1. Текстовые файлы
- •14.2. Типированные файлы
- •14.3. Нетипированные файлы
- •16. Динамические переменные и структуры данных
- •16.1. Динамические переменные
- •16.2. Работа со стеком
- •16.3. Работа со списками или очередями
- •16.4. Работа с деревьями
- •17. Основы объектно–ориентированного программирования
- •17.1. Объекты и классы
- •17.2. Области видимости класса
- •17.3. Свойства (Property) и инкапсуляция
- •17.4. Методы, наследование и полиморфизм
- •17.5. События (Events)
- •18. Выделение памяти под объект и прародитель всех классов – tobject
- •18.1. Выделение памяти под объект
- •18.2. Описание класса tObject
- •18.3. Операторы приведения типов классов
- •19. Обработка исключительных ситуаций
- •19.1. Два вида оператора Try
- •19.2. Программное создание исключительной ситуации
- •19.3. Основные исключительные ситуации
- •20. Основные классы и общие свойства компонентов
- •20.1. Класс tList
- •20.2. Класс tStrings
- •20.3. Общие свойства компонентов
- •22. Визуальные компоненты delphi
- •22.1. Компонент tBitBtn
- •22.2. Компоненты tDrawGrid и tStringGrid
- •22.3. Компонент tPageControl
- •22.4. Компонент tTimer
- •22.5. Компонент tGauge
- •22.6. Компонент tСolorGrid
- •24. Форма, приложение и глобальные объекты
- •24.2. Объект Application
- •24.3. Глобальные объекты
- •Объект ClipBoard
- •Объект Screen
- •Объект Printer
- •28. Динамические библиотеки
- •28.1. Создание dll
- •28.2. Использование dll
- •28.3. Пример написания dll
16.3. Работа со списками или очередями
Очередь – это структура данных, работающая по принципу: первый вошел, первый вышел. Образно такую структуру можно представить в виде открытой с двух сторон трубку – c одной стороны мы можем закатывать шарики, а из другого конца их извлекать:
Списки могут быть односвязными, когда в элементе списка есть указатель на предыдущий элемент списка, или двухсвязными, когда в одном элементе есть указатель на предыдущий элемент списка и указатель на последующий элемент списка.
Для односвязного списка можно определить тип записи следующим образом:
Type TpL=^TL;
TL=Record
Inf:Tinf;
PL:TpL;
End;
Он в принципе ни чем не отличается от записи стека.
Для двухсвязного списка тип записи уже будет следующим:
Type TpL=^TL;
TL=Record
Inf:Tinf;
PL1,PL2:TpL;
End;
Здесь PL1 указывает на предшествующий элемент очереди, а PL2 – на стоящий за ним элемент очереди. Графически это можно представить следующим образом:
Рис.16.2. Структура очереди
Двухсвязный список очень легко позволяет продвигаться как вперед, так и назад по списку. Его легче редактировать. Рассмотрим несколько процедур работы с двухсвязными списками.
Процедура добавления нового элемента в виде строки в конец очереди:
Procedure Addl(var p:TPL; s:String);
Var Pt:TPL;
Begin
New(Pt); // Выделяем память под новый элемент
Pt^.inf:=s; // Записываем значение строки в новый элемент очереди
Pt^.PL2:=nil;// За последним элементом нет других элементов очереди
If p=nil then Pt^.PL1:=nil else Begin // Если это первый элемент очереди,
Pt^.PL1:=p; // то запоминаем указатель на предыдущий элемент очереди
P^.PL2:=Pt; // В предыдущем элементе записываем указатель на новый
End;
P:=Pt; // Возвращаем указатель на новый конец очереди
End;
Приведем теперь пример подпрограммы, которая удаляет из очереди элемент с заданным значением строки:
Procedure Dell(var p:TPL;var s:String);
// При выходе строка S должна быть пустой, если был удален элемент очереди
Var Pt:TPL;
Begin
Pt:=p; // Запоминаем конец очереди
While p<> nil do Begin // Открываем цикл прохода по очереди
If s=p^.inf then Begin // Нашли элемент для удаления
If p^.PL2=nil then Begin // Удаляем первый элемент с конца очереди
If p^.PL1<>nil then begin // Впереди есть элемент
// Следующий элемент очереди становится последним
p^.PL1^.PL2:=nil;
p:=p^.PL1; // Запоминаем указатель на новый последний элемент
end else p:=nil; // Удаляем единственный элемент очереди
dispose(pt); // Освобождаем память
s:=’’; // Очищаем строку поиска
P
Inf3
PL13
PL23=Nil
Inf2
PL12
PL22
Inf1
PL11=Nil
PL21
End else If p^.PL1=nil then Begin // Удалять нужно последний элемент
P^.PL2^.PL1:=nil;
// Второй элемент очереди теперь не должен иметь впереди стоящего
Dispose(P); // Освобождаем память
P:=pt; // Возвращаем указатель на конец очереди
S:=’’; // Строку поиска полагаем равной пустой строке
End else Begin // Удалять нужно средний элемент очереди
p^.PL2^.PL1:=p^.PL1; // В сзади стоящем элементе очереди записыва–
// ем указатель на впереди стоящий элемент
p^.PL1^.PL2:=p^.PL2; // Во впереди стоящем элементе записываем
// указатель на новый, сзади стоящий элемент очереди
dispose(p); // Освобождаем память
s:=’’; // Очищаем строку поиска
p:=pt; // Возвращаем указатель на конец очереди
end;
End; // Закончили блок удаления элемента очереди
// Выходим из процедуры, если был удален элемент очереди
If s:=’’ then exit;
P:=p^.PL1; // Переходим на просмотр впереди стоящего элемента очереди
End; // Конец цикла просмотра элементов очереди
End;