Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
175 Кб
Скачать
☆

Циклические списки.

Операция включения элемента в циклический список аналогична операции включения элемента в линейный список.

p <> LST – условие прохождения по списку.

При удалении элементов из списка проверить, не является ли список пустым. Если список пуст, вывести сообщение «Пусто».

Соединение двух циклических списков в один.

procedure concatLst(var L1, L2: List);

var p: List;

begin

if L1 = nil then exit;

if L2 = nil then begin

L2 := L1;

exit;

end;

p := L1.^next;

L1^.next := L2^.next;

L2^.next := p;

end;

Задание: выбирается число n и одно из имён. При заданном порядке расположения солдат в круге, известном числе n и известном солдате, с которого начинается счёт, окружить солдата, который поедет за подмогой.

1) Формируется циклический список. Окончание ввода имён – ввод пустой строки.

2) Ввод числа n и имени солдата, с которого начинать счёт.

Далее идёт проход по циклическому списку с целью нахождения узла, где содержится введённое имя. Если солдата с таким именем в списке нет, вывести сообщение и запросить новое имя. Если имя есть, реализовать задачу удаления солдата из списка. После этого счёт продолжается до следующего узла, и так до тех пор, пока не останется 1 узел.

Также вывести имена удалённых солдат.

Пример использования списков.

Циклический список можно использовать для сложения длинных целых положительных чисел.

45,9763,4972,1069,8463

Функция просматривает оба списка с одновременным формированием четырёхзначных сумм.

CARRY = SUM div 10000

SUM – сумма четырёхзначных чисел.

Двунаправленные связанные списки.

Каждый узел такого списка имеет два указателя. Один указатель ссылается на следующий элемент, второй – на предыдущий.

type LISTELEM = … ;

List2 = ^LINK;

LINK = record

elem: LISTELEM;

predc, next: List2;

end;

Удаление из списка.

q := p^.predc;

pq := p^.next;

q^.next := pq;

pq^.predc := q;

dispose(q);

Включение в список.

new(q);

q^.next := p^.next;

p^.next := q;

pq := q^.next;

pq^.predc := q;

q^.predc := p;

Реализация очередей.

Очередью называется упорядоченный набор элементов

Извлечение которых возможно с одного конца, называемого началом очереди, а добавлением в другой конец.

Таким образом очередь это динамическая структура данных реализованная по принципу первым пришел первым ушел

FIFO (first in first out)

Для работы с очередью необходимы следующие операции

1) создать пустую очередь или очистить очередь

2) является ли очередь пустой

3) поместить элемент в конец очереди

4) удалить из очереди первый элемент

Очередь можно реализовать тремя способами.

Первый способ - реализация очереди с помощью массива.

>>для очереди отводится массив из n компонентов

В котором элементы очереди занимают группу соседних компонентов

Когда очередь при такой реализации достигает правого края массива,все её элементы сдвигаются к левому краю

Const

N= ;

Type

TE= ;

Turn=record

Begt,endt:0..N; {начало и конец}

Mas:array[1..N] of TE

End;

Операция создании пустой очереди

Procedure delque(var Q:turn);

Begin

Q.begt:=1;

Q.endt:=0;

End;

Function empty(var Q:turn):Boolean;

Begin

Q.endt:=Q.endt=0

End;

Операция постановки в очередь.

Элемент в очередь можно поместить тлько в её конец

Но надо сначала проверить,незаполнена ли она (иначе сместить её по левому краю)

Procedure insert_in_Q(var Q:turn;X:TE);

Var i:integer;

Begin

With Q do begin

If endt=n then

If begt=1 then begin writeln(‘очередь переполнена’); exit

Else {сдвиг очереди к левому краю}

Begin

For i:=begt to endt do

Mas[i-begt+1]:=mas[i];

Begt:=1;

Endt:=endt-begt+1;

End;

Endt:=endt+1;

Mas[endt]:=x

End;

End;

Удаление первого элемента очереди.

Procedure remove(var Q:turn; var X:TE);

If empty(Q) then begin writelen(‘очередь пуста’); exit end;

With Q do begith

X:=mas[begth];

If begt=endt then delque(Q) else begt:=begt+1

End;

End;