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

Переход от одной записи к другой

 

 

 

 

 

 

 

 

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