Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_23_24_ДинамическиеСписки.ppt
Скачиваний:
22
Добавлен:
11.05.2015
Размер:
232.45 Кб
Скачать

Тема 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