- •Тема 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
- •Контрольные вопросы
- •Задача на экзамен
- •Конец темы
Add1- добавить в стек
• Procedure TlistStk.Add1(Inf:TInf);
• begin
• New(sp);
• sp^.Inf:=Inf;
• sp^.A:=sp1;
• sp1:=sp;
• end;
•end;
New(sp) 
sp1
07/02/19
sp1






sp 








Inf
31
Read1 – взять элемент из стека
•Procedure TlistStk.Reаd1(var
•begin
•Inf:=sp1^.Inf;
•sp:=sp1;
•sp1:=sp1^.A;
•Dispose(sp);
•end;
Inf
sp1

sp1
Inf:Tinf);
sp1
sp 
|
|
|
|
|
|
|
|
|
|
sp1 |
|
|
|
|
|
sp |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
07/02/19 |
32 |
||||||||||||||
Print – распечатать содержимое стека
•Procedure TlistStk.Print(memo:Tmemo);
•var k:word;
•begin
• |
sp:=sp1; k:=0; |
• |
While sp <> Nil do |
• |
begin k:=k+1; |
• |
Memo.Lines.Add(‘k=‘,IntTostr(k)); |
• |
Memo.Lines.Add(‘I1=‘,sp^.Inf.I1); |
• |
Memo.Lines.Add(‘key=‘,sp^.Inf.key); |
• |
sp:=sp^.A; |
• |
end; |
•end;
07/02/19 |
33 |
•Не всегда очередь движется по правилам – «в конец добавили из начала взяли»
Есть блатные покупатели, которых нужно передвинуть в очереди
Имеются отказники, которых надо удалить из середины очереди.
•Поэтому надо уметь вставить новую запись внутрь списка или удалить запись из середины списка.
•Это довольно просто сделать, если имеется указатель на запись, после которой нужно вставить или удалить запись
07/02/19 |
34 |
AddAftter – добавить элемент в стек после элемента с заданным в указателе spi адресом
Procedure TlistStk.AddAfter(spi:Tsel,Inf:TInf);
• begin
• New(sp);
• sp^.Inf:=Inf;
• sp^.A:=spi^.A;
• spi^.A:=sp;
• end;
spi
sp1


sp
07/02/19 |
Inf |
35 |
|
ReadAftter – взять и удалить из стека элемент после элемента с заданным адресом
• Procedure
• Tlist.ReadAfter(spi:Tsel;var Inf:TInf);
• begin
•sp:=spi^.A;
•Inf:=sp^.Inf;
•spi^.A:=sp^.A;
•Dispose(sp);
• end;
Inf
spi |
sp |
sp1



07/02/19 |
36 |
AddBefore – добавить элемент в стек перед элементом с заданным адресом
• Procedure Tlist.AddBefore(spi:Psel;Inf:Tinf);
•begin
• AddAfter(spi,spi^.Inf);//копируем
spi^.Inf:=Inf;
•end;
Inf
spi
sp1



07/02/19 |
37 |
Основные методы работы с очередью (класс TlistTrn)
Метод Addk – добавить элемент в очередь
Метод Read1 – взять элемент из очереди
Метод Readk – взять последний элемент из очереди
07/02/19 |
38 |
Addk – добавить элемент в конец очереди
•Procedure TlistTrn.Addk(Inf:TInf);
•begin
•New(sp);
•sp^.A:=Nil;
•sp^.Inf:=inf;
•if sp1=Nil then begin
• |
spk:=sp; sp1:=sp; |
• |
end |
• |
else |
• |
begin spk^.A:=sp; spk:=sp; end; |
•end;
|
|
|
|
spk |
sp1 |
I1 A1 |
…. |
Ik-1 Ak-1 |
Ik nil |
sp1
spk
Inf nil
|
sp |
07/02/19 |
39 |
Read1 – взять первый элемент из очереди
• |
Procedure TlistTrn.Reаd1(var Inf:Tinf); |
• |
begin |
• |
Inf:=sp1^.Inf; |
• |
sp:=sp1; |
• |
sp1:=sp1^.A; |
• |
if sp1=Nil then spk:=Nil; |
• |
Dispose(sp); |
• |
end; |
Этот метод отличается от аналогичного для стека только тем, что поддерживается вторая точка входа spk (оператор if).
Проверка того, пуста ли очередь перед выборкой элемента оставляется на усмотрение программиста
07/02/19 |
40 |
