Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
10.12.2013
Размер:
714.24 Кб
Скачать

2. Динамические переменные.

2.1. Односвязные списки

Динамическими называют переменные, память для которых выделяется и освобождается во время работы программы. Динамические переменные можно объединять в связанные динамические структуры.

Для организации связей между элементами динамической структуры, каждый элемент должен содержать информационное значение и указатель.

Описание такой структуры:

type

ps = ^ spisok;

Запись, состоящая из информационной части и указателя.

end;

var

p: ps;

Тип указателя на элемент динамической структуры должен быть описан перед описанием этого элемента.

Информационная часть динамической переменной может иметь и более сложную структуру.

type

pstud =^ stud;

-информационная часть.

link: pstud; - указатель.

end;

var

p: pstud;

….

Рассмотренная динамическая структура называется односвязным списком. Односвязные списки можно формировать в виде:

  • очереди: (новый элемент добавляется в конец очереди; а удаляется элемент из начала очереди);

  • стека: (добавлять и удалять элемент можно только с одного конца списка, который называется вершиной стека).

  1. При работе с очередью применяют указатели на начало (begp) и на конец (endp) очереди.

2. При создании динамической структуры в виде стека – используют указатель на начало стека – top.

Основные операции над односвязными списками:

  • переход от элемента к элементу;

  • включение нового элемента;

  • исключени элемента из списка;

  • сортировка элементов.

Ниже в методических указаниях приведены примеры программ, в которых реализованы основные операции над односвязными списками.

Задача: составить программу, формирующую односвязный список в виде стека о товарах некоторого склада и выдает список тех товаров, которые пролежали на складе более 3-х лет.

top – указатель на начало списка; p – указатель на текущий элемент.

Ввод прекращается, если вместо названия товара вводят <ENTER>.

program spisok;

type

t = ^ tovar;

tovar = record

name: string [20];

g, z: integer;

link: t;

end;

var

top, p: t;

begin

{ определение вершины стека }

top: = nil;

repeat

{ выделение памяти под элемент списка }

new (p);

write (‘Введите название товара’); readln (p^.name);

if length (p^.name) <> 0 then

begin

write (‘Введите год’); readln (p^.g);

write (‘Введите цену’); readln (p^.z);

{подключение очередного элемента к началу списка}

p^.link: = top;

{перемещение вершины стека на этот элемент}

top: = p;

end;

until length (p^.name) = 0;

while top <> nil do

begin

if 1999 – p^.g > 3 then writeln (p^.name);

{текущий указатель на начало стека}

p: = top;

{перемещение указателя начала стека}

top: = p^.link;

{освобождение динамичекой памяти, занимаемой текущим элементом}

dispose (p);

end;

end.

Задача: ввод и сортировка элементов односвязного списка.

top, p, t, n – указатели на вершину, предыдущий, текущий и новый элемент

списка соответственно

program sortirovka;

type

ps = ^spisok;

spisok = record

name: string [20];

l: ps;

end;

var

top, p, t, n: ps; name: string [20];

begin

top: = nil;

repeat

write (‘Введите Ф.И.О.’); readln (name);

if length(name) <> 0 then

begin

{выделение памяти под новый элемент}

new (n);

n^.name: = name; n^.l: = nil;

t: = top;

p: = nil;

while (name > t^.name) and (t <> nil) do

{поиск места для нового элемента}

begin

p: = t; t: = t^.l;

end;

if p = nil then

{вставка элемента в начало списка}

begin

n^.l: = top; top: = n;

end

else

{вставка элемента в середину или конец списка}

begin

n^.l: = p^.l; p^.l: = n;

end;

end;

until length (name) = 0;

t: = top;

writeln (‘Список’); {печать отсортированного списка}

while t <> nil do begin

writeln (t^.name);

t: = t^.l;

end;

end.

Задача: фрагмент удаления элемента из односвязного списка.

name – элемент, который необходимо удалить;

top, t, p – указатели на вершину, текущей и предыдущий элемент соответственно;

f – флаг.

.

. .

readln (name);

p: = nil;

t: = top;

f: = 0;

while (f=0) and (t <> nil) do

begin

if t^.name = name then

{удаление элемента из списка}

begin

if p=nil then

{удаление элемента, стоящего на первом месте в списке}

top: = t^.l

else

{удаление среднего или последнего элемента}

p^.l: = t^.l;

dispose (t);

f: = 1;

end

else

{переход к следующему элементу списка}

begin

p: = t;

t: = t^.l;

end;

end;

if f=0 then writeln (‘Элемент не найден’)

else writeln (‘Элемент удален’);

. . .

Соседние файлы в папке Лекции