Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Программа формирования динамического списка

Читайте также:
  1. I. РАБОЧАЯ ПРОГРАММА
  2. I. РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ
  3. II. Порядок формирования экспертных групп, организация экспертизы заявленных на Конкурс проектов и регламент работы Конкурсной комиссии
  4. III. Программа проведения
  5. III. Учебная программа
  6. V. Конкурсная программа
  7. V. ПРОГРАММА СОРЕВНОВАНИЙ

Program Dinlist;

Type p_stud =^student;

student =record

fam: string[20];

next: p_stud;

End;

Var head: p_stud; {указатель на первый элемент}

curr: p_stud; {указатель на текущий элемент}

s: string[20];

Begin

Repeat

Write (‘vvod fam_’);

Readln (s);

If Length (s) < > 0 then

Begin

new (curr); {создание нового элемента, указатель curr

получает адрес свободной ячейки дин. памяти}

curr ^. fam: = s; {информационное поле fam

принимает знач. s}

curr ^. next: = head; {указатель нового элемента принимает

значение указателя head}

head: = curr; {head принимает значение адреса нового

элемента}

End;

Until length (s) = 0;

writeln (‘vvedenii spisok:’);

curr: = head; { curr принимает значение указателя начала}

while curr < > nil do

Begin

writeln (curr ^. fam); {печатается информационное поле

ячейки по адресу текущего указателя}

curr: = curr ^. next; {текущий указатель принимает значение

адреса следующего элемента}

End;

Readln;

End.

Рассмотрим подробно один шаг цикла формирования списка, т.е. добавления, например, второго элемента в начало списка: в списке есть Иванов, добавляем Петрова.

New (curr);

head
Создание нового элемента, указатель curr получает адрес свободной ячейки динамической памяти.

 

 
 

 


2. curr ^. fam: = s;

Информационное поле fam по новому адресу принимает значение введенной с клавиатуры фамилии (Петров).

curr ^. next: = head;

Указатель нового элемента принимает значение указателя head, т.е. указывает на ячейку, на которую указывает head.

 

head

 
 

 


3. head: = curr; – head указывает на адрес нового элемента

 
 

 

 


Рассмотрим результат работы этой программы на экране.

vvod fam - Ivanov

vvod fam - Petrov

vvod fam - Sidorov

vvod fam –

vvedenii spisok: Sidorov

Petrov

Ivanov

 

Стек

 

Стек – структура переменной длины, в которой добавление новых элементов и удаление существующих производятся с одного конца, называемого вершиной стека.

 

LIFO

 

Занесение данных в стек производится аналогично вставке нового элемента в начало списка. Для извлечения элемента из стека некоторой переменной нужно присвоить значение первого элемента с вершины стека. После этого должно быть изменено значение указателя на вершину стека.

Пример: Создать стек для хранения целых чисел. Предусмотреть создание стека, т.е. добавление новых элементов по порядку. Затем организовать доступ к вершине стека и удаление элементов из стека. Вывести на экран их значения по порядку.

Условимся называть verh - указатель на вершину стека;

у – указатель текущего элемента при создании стека;

х – указатель текущего элемента при извлечении данных из стека;

а – переменная для ввода чисел с клавиатуры;

b – переменная для вывода чисел на экран.

 

Program st;

Type

Pstack = ^ stack;

Stack = record

Data: integer;

Next: pstack;

End;

Var

x, y, verh: pstack;

a, b, i, n: integer;

Begin

verh: = nil; {стек пуст}

writeln (‘n=’);

Readln (n);

for I:= 1 to n do

Begin

new (y); { создание нового элемента стека – у получает адрес

свободной ячейки}

writeln (‘a=’); readln (a); { ввод с клавиатуры числа}

y^. data: = a; {информационная часть получает значение а, т.е. по

этому адресу в поле data записывается а }

y^. next: = verh; {адресная часть принимает значение указателя

вершины стека}

verh:= y; {указатель вершины принимает значение

адреса нового элемента}

End;

writeln (‘элементы стека:’);

for i: = 1 to n do

Begin

b: = verh ^. data; { b принимает значение информационного поля

верхнего элемента}

writeln (‘b =’, b);

x: = verh; { указателю х присвоено значение указателя вершины

стека}

verh: = verh ^. next; {указатель вершины принимает значение

адреса следующего элемента стека}

dispose (x); {уничтожение указателя х, после чего ячейки,

содержавшие значение х ^ становятся свободными}

End;

Readln;

End.

При выполнении программы указатель verh вначале получает значение nil – стек пуст. Затем в цикле вводятся значения а: 1, 2, 3, 4. Эти значения заносятся в поле data элементов стека. Поле next при этом получает значение, на которое указывает verh.

verh
verh
1) 2)

 
 

 


3)

 

 

При занесении новых элементов в стек указатель verh меняет свое значение и указывает каждый раз на только что введенный элемент.

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

 

Очередь

Очередь – структура переменной длины, в которой добавление новых элементов производится в конец, а удаление существующих – из начала структуры.

FIFO

 

 

Для описания элемента типа очередь нужны две переменные-указатели начала и конца очереди. Определим их как х1 и х2, тогда описание имеет вид:

Type poc = ^ oc;

Oc = record

Data: integer;

Next: poc;

End;

Var x1, x2: poc;

 

Над очередью определены 2 операции:

1) занесение элемента в конец очереди;

2) извлечение элемента из начала очереди.

Так как очередь может быть представлена списком, то занесение элемента в очередь соответствует занесению элемента в конец списка.

Опишем процедуру занесения элемента в конец очереди.

Procedure Write0 (var x1, x2: poc; c: integer); {здесь х1 и х2 – формальные параметры-переменные-указатели начала и конца очереди, с – новое значение}.

Var u: poc;

Begin

New(u); {указатель u получает адрес свободной ячейки

динамической памяти }

u ^. data: = c; {информационное поле получает значение с }

u ^. next: = nil; {адресная часть получает значение указателя

конца очереди}

If x1 = nil

then x1: = u {если очередь пуста, то указатель начала

х1 принимает значение нового адреса u }

Else

x2 ^. next: = u; {иначе элемент заносится в конец очереди по

адресу указателя х2 конца, далее х2 получает

значение адреса последнего элемента u }

x2: = u;

End;

Процедура извлечения элемента из очереди аналогична извлечению элементов из начала списка.

Т.к. извлечение элемента из пустой очереди осуществить нельзя, то сначала проверяем, есть ли элементы в очереди, т.е. задаем вопрос х1 = nil?

Procedure ReadO (var x1, x2: poc; var c: integer);

Var u: poc;

Begin

If x1 = nil then writeln (‘oсhered pusta’)

Else

Begin

c: = x1^. data;

u: = x1;

x1: = x1^. next;

Dispose(u);

End;

В процедуре ReadO для непустой очереди в статической переменной с сохраняется значение удаленного элемента х1 ^.data. Элемент удаляется из очереди сверху. Для этого переменная-указатель u получает значение х1 – адреса начала очереди; х1 становится значением указателя следующего элемента очереди, т.е. следующий элемент будет теперь в вершине очереди. Из динамической памяти удаляется элемент ранее находившийся в начале очереди, dispose(u).

Задача: создать очередь, содержащую целые числа. Удалить первый элемент из очереди и вывести его значение на экран.

В данной задаче мы будем вводить элементы до тех пор, пока элемент не будет равен нулю.


Дата добавления: 2015-12-08; просмотров: 60 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.016 сек.)