
- •Тема 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
- •Контрольные вопросы
- •Задача на экзамен
- •Конец темы

Переход от одной записи к другой
|
|
|
|
|
|
|
|
sp2 |
|
sp3 |
|
sp4 |
|
||||||
|
sp1 |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
I1 |
|
A1 |
|
|
I2 |
A2 |
|
|
I3 |
A3 |
|
|
I4 |
nil |
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
sp:=sp1; |
|
// текущий указатель установили в начало списка |
|||||||||||||
|
sp |
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp2 |
|
|
|
|
|
|
sp3 |
|
|
|
|
|
sp4 |
|
|
|
||||||||||||
|
sp1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
I1 |
A1 |
|
|
|
|
|
I2 |
|
|
A2 |
|
|
|
|
I3 |
A3 |
|
|
|
|
|
I4 |
nil |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp:=sp^.A; |
//теперь в sp находится sp2 |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
sp |
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
sp2 |
|
|
|
|
|
|
sp3 |
|
|
|
|
|
sp4 |
|
|
|
||||||||||||
|
sp1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
I1 |
|
A1 |
|
|
|
I2 |
|
|
A2 |
|
|
|
I3 |
|
A3 |
|
|
|
|
|
|
I4 |
|
nil |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
sp:=sp^.A^.A; //теперь в sp находится sp4 |
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
sp |
|
|
|
|
|||||||||||||||||||||||||||||
|
|
07/02/19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |

Переход от одной записи к другой
|
|
|
|
|
sp2 |
|
|
sp3 |
|
sp4 |
|
||||||
sp1 |
|
|
|
|
|
|
|
|
|||||||||
|
|
I1 |
A1 |
|
|
|
I2 |
A2 |
|
|
I3 |
A3 |
|
|
I4 |
nil |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
sp
•sp:=sp1; // указатель установили в начало списка
•sp:=sp^.A; //теперь в sp находится sp2
•sp:=sp^.A^.A; //теперь в sp находится sp4
•Write(sp^.Inf); //вывод информации Inf4
•В обратную сторону передвигаться нельзя!
•Поэтому список и называется однонаправленный.
•Для многих практически важных задач такая организация
списка оказывается эффективной
07/02/19 |
22 |

Стек- список с одной точкой входа
sp1 |
|
|
|
|
|
|
|
|
|
|
…. |
|
|
|
|
|
|
|
|
I1 |
A1 |
|
|
I2 |
A2 |
Ik-1 |
Ak-1 |
|
|
Ik |
nil |
||||||||
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Программисту известен только один указатель sp1, который назовем вершиной стека
Доступ к ячейкам стека возможен только через этот указатель, в котором расположен адрес первой ячейки.
sp1
07/02/19 |
23 |

Очередь- список с двумя точками входа
sp1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
spk |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
…. |
|
|
|
|
|
|
|
|
|
|
|
|
I1 |
A1 |
|
|
I2 |
A2 |
|
|
|
Ik-1 |
Ak-1 |
|
|
|
Ik |
nil |
|
|
|
|
|
|
|
|
|
Программисту известны два указателя sp1, spk
Доступ к ячейкам стека возможен только через эти указатели, в которых расположены адрес первой и адрес последней ячеек
В конец очереди через spk добавляют новые ячейки, из начала очереди через sp1 удаляют ячейки.
sp1 |
spk |
||
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
07/02/19 |
24 |
Класс для работы со списком (задание типа ячеек)
•Type
•Tinf=record; // конкретизация типа данных,
• |
I1:TI1; // содержащихся в ячейках списка |
• |
I2:TI2; |
• |
... |
• |
Key:Tkey; //ключ |
•end;
• Tsel=^sel;
•sel=Record
• |
Inf:TInf;// информация об элементе списка |
• |
A:Tsel;//Адрес ячейки такого же типа |
•end;
07/02/19 |
25 |
|
Класс для работы со списком |
|
(поля и методы) |
• |
Type Tlist=class(Tobject) |
• |
sp1,spk,sp:psel; |
• |
constructor create; |
• |
procedure Add1(Inf:Tinf); |
• |
procedure Addk(Inf:Tinf); |
• |
procedure Read1(Inf:Tinf); |
• |
. . . . . . . . . . . . . |
• |
procedure Print; |
• |
end; |
• |
constructor Tlist.create; |
• |
begin |
• |
inherited create; |
• |
sp1:=nil; spk:=nil; |
• |
end; |
07/02/19 |
26 |
Работа с методами класса
•Var stec,st1,turn,tr1:Tlist; inf:Tinf;
•Begin
•stec:=Tlist.create;
•stec.Add1(inf);
•. . . . . . . .
•stec.print;
•. . . . . . .
•stec.free;
Методы работы с очередью немного отличаются от методов работы со стеком – при работе с очередью необходимо поддерживать вторую точку входа spk
Поэтому более удобно написать два класса – один для работы со стеком, другой с очередью
07/02/19 |
27 |
Класс для работы со стеком
• |
Type TlistStk=class(Tobject) |
• |
sp1,sp:psel; |
• |
constructor create; |
• |
procedure Add1(Inf:Tinf); |
• |
procedure Read1(Inf:Tinf); |
• |
. . . . . . . . . . . . . |
• |
procedure Print; |
• |
end; |
• |
constructor TlistStk.create; |
• |
begin |
• |
inherited create; |
• |
sp1:=nil; |
• |
end; |
07/02/19 |
28 |
Класс для работы с очередью
• |
Type TlistTrn=class(Tobject) |
• |
sp1,spk,sp:psel; |
• |
constructor create; |
• |
procedure Add1(Inf:Tinf); |
• |
procedure Addk(Inf:Tinf); |
• |
procedure Read1(Inf:Tinf); |
• |
. . . . . . . . . . . . . |
• |
procedure Print; |
• |
end; |
• |
constructor TlistTrn.create; |
• |
begin |
• |
inherited create; |
• |
sp1:=nil; spk:=nil; |
• |
end; |
07/02/19 |
29 |
Основные методы работы со стеком (класс TlistStk)
Метод Add1 – добавить элемент в стек
Метод Read1 – взять элемент из стека
Метод Print – распечатать содержимое стека
Метод AddAftter – добавить элемент в стек после элемента с заданным адресом
Метод AddBefore – добавить элемент в стек перед элементом с заданным адресом
Метод ReadAftter – взять из стека элемент расположенный после элемента с заданным адресом
07/02/19 |
30 |