
- •Тема 4 Списки и их
- •Что такое список
- •Показательным примером является задача обслуживания очереди заказов на покупку товара
- •Список (list)
- •Очередь (turn)
- •Стек (stek)
- •Организация работы со списками на основе динамических массивов
- •Класс для работы со списком на основе массива
- •Работа с очередью
- •Метод Addk(c)
- •Программа Addk
- •Метод Read1(var c:Tinf)
- •Программа Read1
- •Резюме1
- •Резюме2
- •Понятие рекурсивных данных, косвенная адресация и однонаправленные списки
- •Программирование рекурсивного типа данных
- •Структура рекурсивного типа данных
- •Описываемая типом Тsel ячейка
- •однонаправленные (линейные)
- •Переход от одной записи к другой
- •Переход от одной записи к другой
- •Стек- список с одной точкой входа
- •Очередь- список с двумя точками входа
- •Класс для работы со списком (задание типа ячеек)
- •Работа с методами класса
- •Класс для работы со стеком
- •Класс для работы с очередью
- •Основные методы работы со стеком (класс TlistStk)
- •Add1- добавить в стек
- •Read1 – взять элемент из стека
- •Print – распечатать содержимое стека
- ••Не всегда очередь движется по правилам – «в конец добавили из начала взяли»
- •AddAftter – добавить элемент в стек после элемента с заданным в указателе spi
- •ReadAftter – взять и удалить из стека элемент после элемента с заданным адресом
- •AddBefore – добавить элемент в стек перед элементом с заданным адресом
- •Основные методы работы с очередью (класс TlistTrn)
- •Addk – добавить элемент в конец очереди
- •Read1 – взять первый элемент из очереди
- •Readk – взять последний элемент из очереди
- •Некоторые проблемы работы с однонаправленным списком
- •Список с меткой
- •Циклические связанные списки
- •Двухсвязные списки
- •Рекурсивный тип с двумя адресными ячейками
- •Движение по списку
- •Добавление элемента в начало
- •Добавление в начало
- •чтение последнего элемента
- •Чтение и удаление последнего
- •Добавление элемента после заданного в двухсвязный список
- •Добавление после заданного
- •Добавление элемента перед заданным
- •Чтение и удаление элемента с адресом spi
- •Контрольные вопросы
- •Задача на экзамен
- •Конец темы
чтение последнего элемента
•Procedure Tlistd.readk(var Inf:Tinf);
•begin
• |
sp:=spk; inf:=sp^.inf; |
• |
sp^.A1^.A2:=Nil; |
• |
spk:=sp^.A1; |
• |
dispose(sp); |
• |
end; |
Аналогично составляются методы добавления элемента в конец списка и удаления начального элемента
07/02/19 |
51 |

Чтение и удаление последнего
|
|
nil |
|
Inf |
sp1 |
I |
A1 A2 |
I |
spk |
nil |
А2 |
I |
A1 |
nil |
sp
07/02/19 |
52 |
Добавление элемента после заданного в двухсвязный список
•Procedure
•Tlistd.AddAfter(Inf:TInf;spi:Tseld);
• |
begin |
• |
New(sp); |
• |
sp^.Inf:=Inf; |
• |
sp^.A1:=spi; |
• |
sp^.A2:=spi.A2; |
• |
spi^.A2:=sp; |
• |
sp^.A2^.A1:=sp; |
• |
end; |
07/02/19 |
53 |

Добавление после заданного
sp1 |
I |
|
A1 A2 |
I |
spk |
nil |
А2 |
|
I |
A1 |
nil |
|
|
spi |
A1 |
A2 |
|
|
|
|
|
||
|
|
|
sp |
I |
|
Inf
07/02/19 |
54 |
Добавление элемента перед заданным
•Procedure
•Tlistd.AddBeford(Inf:TInf;spi:Tseld);
• begin
• New(sp);
• sp^.Inf:=Inf;
• sp^.A2:=spi;
• sp^.A1:=spi.A1;
• Spi^.A1:=sp;
• sp^.A1^.A2:=sp;
• end;
07/02/19 |
55 |

Чтение и удаление элемента с адресом spi
•Procedure
•Tlistd.Read(var Inf:TInf;spi:Pseld);
• begin
• Inf:=spi^.Inf;
• spi^.A1^.A2:=spi^.A2;
• spi^.A2^.A1:=spi^.A1;
• Dispose(spi);
• end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spk |
sp1 |
|
|
|
I |
|
|
|
A1 |
A2 |
|
|
|
I |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nil |
|
А2 |
|
|
|
I |
|
|
|
A1 |
|
nil |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
07/02/19 |
spi |
56 |
|
Контрольные вопросы
Что такое список, очередь, стек, для чего они нужны?
Как организовать работу со списком на основе динамического массива?
Напишите рекурсивный тип данных и объясните, как с его помощью организуется однонаправленный список.
Что такое косвенная адресация?
Опишите класс для работы со списком. Поясните особенности работы со стеком и очередью.
Напишите метод распечатки списка.
Как организуется список с меткой и когда его целесообразно использовать? Понятие циклического списка.
07/02/19 |
57 |
Задача на экзамен
Составить программу работы со списком на основе одномерного динамического массива.
oФамилию a.f и учетный номер a.k добавляемой записи читать из первой строки StringGrid1.
oСостояние текущего списка из n записей отражать в n строках StringGrid2.
oУчетный номер удаляемой записи ввести из Edit1.
В отдельном модуле написать класс, содержащий следующие методы:
oсоздание начального динамического массива
Create;
oдобавление новой записи в конец списка Аddk;
oЧтение с удалением записи из начала списка
Read1.
07/02/19 |
58 |
Конец темы
• Ваши вопросы
07/02/19 |
59 |