
- •Тема 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
- •Контрольные вопросы
- •Задача на экзамен
- •Конец темы
Тема 4 Списки и их
программная реализация
Что такое список, стек, очередь
Организация работы со списками на основе динамических массивов
Понятие рекурсивных данных и однонаправленные списки
Начальное формирование, добавление и удаление элементов однонаправленного списка
Разновидности связанных списков
07/02/19 |
1 |
Что такое список
В практике программирования довольно часто встречается задача обработки набора однотипных данных
Inf1, Inf2, ...... Infn,
количество которых n меняется в зависимости от ситуации
Их надо разместить в оперативной памяти и по мере надобности с ними работать: добавлять новые данные в список, освобождаться от старых данных, выдавать информацию о количестве данных, находить нужную информацию
Такой набор программисты называют СПИСКОМ
07/02/19 |
2 |
Показательным примером является задача обслуживания очереди заказов на покупку товара
Inf1, Inf2, ...... Infn
Данные Infi могут содержать информацию о заказчике:
ФИО, адрес, финансовые возможности и др.
По мере появления новых заказчиков их дописывают в конец
очереди (Infn+1, Infn+2, ....), по мере поступления товара, и
обслуживания заказчиков из начала очереди данные Inf1, Inf2,...
об этих заказчиках стираются.
При решении подобных задач программисты вводят понятие списка
07/02/19 |
3 |
Список (list)
Это последовательность однотипных элементов (данных), с которыми надо работать в оперативной памяти: добавлять новые элементы, удалять использованные, сортировать, находить нужные
В процессе работы список может возрастать и уменьшаться
Наибольшее распространение получили две формы работы со списком
|
– очередь |
|
- стек. |
07/02/19 |
4 |

Очередь (turn)
это список с двумя точками входа. С одной стороны последовательности данные добавляются в список (в конец очереди), с другой стороны списка данные удаляются из него (из начала очереди)
Таким образом реализуется принцип – «первым пришел – первым вышел»
Наглядный пример – трубка, заполняемая шариками, имеющими
диаметр, равный диаметру трубки. С одной стороны трубки шарики добавляются в нее, с другой вынимаются.
07/02/19 |
5 |

Стек (stek)
это список с одной точкой входа.
Данные добавляются в список и удаляются из него только с одной стороны последовательности
(вершины стека)
Таким образом реализуется принцип – «последний пришел –
первым вышел»
Наглядный пример – трубка, запаянная с одного конца и заполняемая
шариками, имеющими диаметр, равный диаметру трубки. С одной стороны трубки шарики добавляются в нее и вынимаются
07/02/19 |
6 |

Организация работы со списками на основе динамических массивов
Простейшая форма организации списка – это динамический массив данных. Данные, размещенные в массиве имеют свои номера (индексы) и это придает эффект «видимости» каждому элементу.
a: |
a1 |
a2 |
a3 |
a4 |
……….. |
an |
|
|
|
|
|
|
Мы уже научились некоторым приемам работы с массивами и оценили их эффективность.
Рассмотрим как организуется работа со списками на
основе динамического массива a переменного размера n.
07/02/19 |
7 |
Класс для работы со списком на основе массива
•type
•Tinf = <тип элементов>;
•mas=array[1..1] of Tinf;
• |
Tmas=^mas; |
//указатель на массив |
•Tlist=Class(Tobject)
•a,a1:Tmas; n,mt:word;
•constructor create;
•procedure Addk(с:Tinf);//добавить
•procedure Read1(var с:Tinf);//удалить
•procedure sort;
•end;
• |
constructor Tlist.create; |
• |
begin |
• |
Inherited create; |
• |
n:=0; mt:= sizeof(Tinf); a:=Nil; |
• |
end; |
07/02/19 |
8 |
Работа с очередью
•var turn:Tlist; с1,c2:Tinf;
•begin
•turn:=Tlist.create; //создадим новую очередь
•//введем в нее сохраненный ранее список
•Read(m);
•for i:=1 to m do
• |
begin Read(Fl,c1); turn.Addk(c1) end; |
•.................//далее работаем с очередью:
• |
turn.Addk(c1); |
//добавляем элементы |
•. . . . . . . . . .
•turn.Read1(c2); //читаем и удаляем элементы
•. . . . . . . . . .
•turn.Free; //освобождаем память от списка
07/02/19 |
9 |

Метод Addk(c)
При реализации метода Addk добавления нового элемента в список необходимо
выделить в куче память на 1 элемент большую,
затем скопировать старый список в новый раздел памяти,
добавить в конец массива еще 1 элемент, после чего освободить ранее выделенную память и установить указатель a на новый раздел памяти:
a: |
|
a1 |
|
a2 |
a3 |
… |
an |
|
|
|
|
|
|||||
|
|
|
|
|
c |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a1: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dispose(a) |
|
|
|
1 |
|
|
2 |
|
3 |
|
… |
|
n |
|
n+1 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a:=a1 n:=n+1 |
|
|
07/02/19 |
|
|
|
|
|
|
|
|
|
|
10 |