Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

31. Динамическая структура кольцо, ее создание и использование.

Koльцо - это вид связанного списка, в котором указатель последнего элемента ссылается на первый элемент.

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

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

Опишем кольцо на языке программирования:

Type

TypeCircle = ^K;

K = record

Data : integer;

Next : TypeCircle;

End;

Var

Circle1 : TypeCircle;

Формирование кольца

Рассмотрите процедуру формирования кольца. Для работы этой процедуры заводятся две локальные переменные типа TypeCircle для хранения адресов промежуточного и завершающего звена списка, последним оператором преобразуемого в кольцо.

Procedure FofmK(Var u : TypeCircle);

Var

x, y : TypeCircle;

i, N, d : integer;

Begin

write('Введите количество звеньев кольца: ');

readln(N);

for i := 1 to N do

begin

new(x); {выделяем память для хранения нового элемента кольца}

write('Введите данные в звено: ');

readln(d);

x^.Data := d; {заносим информацию в поле данных}

if u=nil {если кольцо еще не создано}

then

u := x {то указатель первого элемента ставим на новый элемент}

else

y^.Next := x; {присоединяем новый элемент к последнему элементу}

y := x; {переносим указатель у на последний элемент}

end;

x^.Next := u; {преобразуем получившийся список в кольцо}

End;

Над кольцом определены три операции: занесение элемента в кольцо, извлечение элемента из кольца и обход кольца.

Задание. Составьте программу, содержащую две процедуры: процедуру занесения элемента в кольцо и процедуру извлечения элемента из кольца по какому-либо условию. (Можно воспользоваться текстом предыдущей программы.)

Обход кольца

Для того чтобы обойти кольцо и вывести на экран содержащуюся в нем информацию, необходимо в локальной переменной типа TypeCircle запомнить адрес первого выводимого элемента. В этом случае можно избежать повторения и зацикливания программы. Вывод данных можно начинать с любого элемента кольца; это зависит от адреса первого элемента, переданного в процедуру обхода.

Рассмотрите процедуру обхода кольца.

Procedure PrintК(u : TypeCircle);

Var

x : TypeCircle;

Begin

x := u;

repeat

write(x^.Data,' ');

x := x^.Next;

until x = u;

readln;

End;

34. Алгоритмы генерирования перестановок

Рассмотрим алгоритм генерирования перестановок в антилексикографическом порядке.

Нашу последовательность можно разделить на блоки. Первые n-1 позиций блока, содержащих элемент p в последней позиции определяет последовательность перестановок множества.

Uses

Crt;

Var

i, n : Integer;

p : Array [1..10] of Integer;

procedure Revers ( m: Integer);

var

i, j, pow : Integer;

begin

i:=1;

j:=m

while i < j do

begin

pow:= p[i];

p[i]:= p[j];

p[j]:= pow;

i:= i+1;

j:= j-1;

end;

end;

procedure Antilex (m : Integer);

var

i, pow : Integer;

begin

if m =1 then

begin

for i:=1 to n do

Write ( p[i], ‘ ‘);

Writeln;

end

else

for i:=1 to m do

begin

Antilex (m-1);

if i < m then

begin

pow:= p[i];

p[i]:= p[m];

p[m]:= pow;

Revers (m-1);

end;

end;

Begin

ClrScr;

Write (‘Введите n’);

Readln (n);

for i:=1 to n do

p[i]:=i;

Antilex (n);

ReadKey;

End.