Вы находитесь на странице: 1из 11

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение


высшего образования
Дальневосточный федеральный университет

ИНСТИТУТ МАТЕМАТИКИ И КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ

Департамент программной инженерии и искусственного интеллекта

ОТЧЕТ
по лабораторной работе №1.1
дисциплина «Фундаментальные структуры данных и алгоритмы»

Студент гр. Б9122-09.03.04прогин


А.В. Романченко
(подпись)

Руководитель
ст. преподаватель
О.А. Крестникова
(подпись) (И.О. Фамилия)

г. Владивосток
2023
1 Неформальная постановка задачи
Реализовать пакет подпрограмм для работы с односвязным кольцевым
списком, в котором элементы – целые числа.
Основные операции:
1. Инициализация
2. Освобождение памяти
3. Добавление элемента в начало списка
4. Удаление элемента перед каждым вхождением заданного числа
5. Поиск заданного элемента по значению
6. Печать
7. Объединение двух списков
2 Описание типа + спецификация подпрограмм + тесты
procedure InitRing(var s: Ring);
Инициализирует односвязный кольцевой список s с головой P_begin типа
Ring, присваивая голове значение nil.
Входные данные: идентификатор записи типа Ring (s). Выходные данные:
пустое кольцо s.
Описание тестовой Входные данные Выходные данные
ситуации
Зануление головы s1 s1
(Инициализация
s2 s2
списка)

function IsRingEmpty(s: Ring): boolean;


Проверяет наличие элементов в односвязном кольцевом списке s с головой
P_begin типа Ring и возвращает true, если голова списка равна nil, иначе
false.
Входные данные: идентификатор записи типа Ring (s). Выходные данные:
true/false.
Описание тестовой Входные данные Выходные данные
ситуации
Проверка списка на s1 = {1 2} true
наличие элементов
s2 = {} false

procedure AddToRing(var s: Ring; x: integer);


Добавляет в начало односвязного кольцевого списка s с головой P_begin типа
Ring новый элемент x – целое число.
Входные данные: идентификатор записи типа Ring (s), значение x. Выходные
данные: кольцо s с новым элементом x в начале.
Описание тестовой Входные данные Выходные данные
ситуации
Добавление в начало s1 = {}, x=54 s1 = {54}
нового элемента в
s2 ={}, x=38 s2 = {38}
список
Добавление в начало s1 = {38}, x=27 s1 = {27 38}
нового элемента в
список s2 ={17}, x=91 s2 = {91 17}

procedure PrintRing(s: Ring);


Выводит на экран содержимое односвязного кольцевого списка s с головой
P_begin типа Ring.
Входные данные: идентификатор записи типа Ring (s). Выходные данные:
содержимое кольца s.
Описание тестовой Входные данные Выходные данные
ситуации
Вывод на экран s1 = {4 3 2 1} Односвязное кольцо: 4
содержимого списка 321
s1 = {} Список пуст.

s2 = {6} Односвязное кольцо: 6

s2 = {} Список пуст.

procedure RemoveRing(var s:Ring);


Очищает односвязное кольцо s с головой P_begin типа Ring.
Входные данные: идентификатор записи типа Ring (s). Выходные данные:
пустое кольцо s.
Описание тестовой Входные данные Выходные данные
ситуации
Освобождение памяти s1 = {} Список пуст.

s2 = {1 2} Список успешно удален.

function SummRings(s1, s2: Ring): Ring;


Выполняет объединение двух односвязных кольцевых списков s1 и s2 в
новое кольцо newRing и возвращает это новое кольцо.
Входные данные: два кольца s1 и s2. Выходные данные: новое кольцо
newRing.
Описание тестовой Входные данные Выходные данные
ситуации
Объединение двух s1={3 2 1}, s2={5 6} newRing = {6 5 1 2 3}
списков
s1={}, s2={5 6} newRing = {6 5}

Объединение двух s1={3 2 1}, s2={} newRing = {1 2 3}


списков
s1={}, s2={} Списки пусты!

procedure DeleteBeforeValue(var s: Ring; x: Integer);


Удаляет в односвязном кольце s с головой P_begin типа Ring элементы перед
каждым вхождением заданного числа x.
Входные данные: идентификатор записи типа Ring (s), значение x. Выходные
данные: кольцо s без элементов перед заданными вхождениями x.
Описание тестовой Входные данные Выходные данные
ситуации
Удаление перед s1 = {}, x=1 Список пуст.
каждым вхождением
s1 = {1}, x=1 s1 = {1}
заданного числа
s1 = {1 1 1}, x=1 s1 = {1}
Удаление перед s1 = {1 2 1}, x=2 s1 = {2 1}
каждым вхождением
заданного числа
Удаление перед s1 = {1 2 1 2}, x=2 s1 = {2 2}
каждым вхождением
s1 = {1 2 2 1 2}, x=2 s1 = {2 2}
заданного числа

function SearchValue(s: Ring; x: integer):boolean;


Находит в односвязном кольце s с головой P_begin типа Ring элемент со
значением переменной x типа integer и возвращает true, если элемент в
списке есть, иначе false.
Входные данные: список s, значение x. Выходные данные: true/false.
Описание тестовой Входные данные Выходные данные
ситуации
Поиск элемента в s1 = {} false
пустом списке
Поиск элемента в s1 = {2} false
непустом списке
s1 = {4} true

Поиск элемента в s1 = {1 4} true


непустом списке
s1 = {4 1} true
3 Текст программы
type
P_elem = ^Elem;
Elem = record
data: integer;
next: P_elem;
end;

Ring = record
P_begin: P_elem;
end;

procedure InitRing(var s: Ring);


begin
s.P_begin := nil;
end;

function IsRingEmpty(s: Ring): boolean;


begin
IsRingEmpty := (s.P_begin = nil);
end;

procedure AddToRing(var s: Ring; x: integer);


var
newNode, current: P_elem;
begin
new(newNode);
newNode^.data := x;
if IsRingEmpty(s) then
begin
// Если список пуст, делаем новый элемент самим
себе
newNode^.next := newNode;
s.P_begin := newNode;
end
else begin
// Иначе, добавляем элемент в начало списка и
обновляем ссылку последнего элемента
current := s.P_begin;
while current^.next <> s.P_begin do
current := current^.Next;
newNode^.next := s.P_begin;
current^.next := newNode; //связываем ласт элемент
с новым
s.P_begin := newNode;
end;
end;

procedure PrintRing(s: Ring);


var
current: P_elem;
begin
if IsRingEmpty(s) then
begin
writeln('Список пуст.');
Exit;
end;
current := s.P_begin;
write('Односвязное кольцо: ');
repeat
write(current^.data, ' ');
current := current^.next;
until current = s.P_begin;
writeln;
end;

procedure RemoveRing(var s:Ring);


var
current, nextNode: P_elem;
begin
if IsRingEmpty(s) then
begin
writeln('Список пуст.');
Exit;
end;
current := s.P_begin;
repeat
nextNode := current^.next;
dispose(current);
current := nextNode;
until current = s.P_begin;
s.P_begin := nil;
writeln('Список успешно удалён.');
end;
function SummRings(s1, s2: Ring): Ring;
var
current: P_elem;
newRing : Ring;
begin
InitRing(newRing);
newRing.P_begin := nil;
if ((not IsRingEmpty(s1)) and (not IsRingEmpty(s2)))
then begin
current := s1.P_begin;
while current^.next <> s1.P_begin do begin
AddToRing(newRing, current^.data);
current := current^.next;
end;
AddToRing(newRing, current^.data); //ласт эл-т 1-го
списка
current := s2.P_begin;
while current^.next <> s2.P_begin do begin
AddToRing(newRing, current^.data);
current := current^.next;
end;
AddToRing(newRing, current^.data);
result := newRing;
exit
end;
if (not IsRingEmpty(s1)) then begin
current := s1.P_begin;
while current^.next <> s1.P_begin do begin
AddToRing(newRing, current^.data);
current := current^.next;
end;
AddToRing(newRing, current^.data);
result := newRing;
exit
end;
if (not IsRingEmpty(s2)) then begin
current := s2.P_begin;
while current^.next <> s2.P_begin do begin
AddToRing(newRing, current^.data);
current := current^.next;
end;
AddToRing(newRing, current^.data);
result := newRing;
exit
end;
begin
writeln('Списки пусты!');
result := newRing;
exit
end;
result := newRing;
end;

procedure DeleteBeforeValue(var s: Ring; x: Integer);


var
сurrent, pred, nextNode: P_elem;
begin
if IsRingEmpty(s) then begin
writeln('Список пуст.');
Exit;
end;
сurrent := s.P_begin;
pred := s.P_begin;
while сurrent^.next <> s.P_begin do begin // пока не
последний
if сurrent^.next^.data = x then begin
if сurrent = s.P_begin then begin
nextNode := сurrent^.next;
while сurrent^.next <> s.P_begin do
сurrent := сurrent^.next;
сurrent^.next := nextNode;
dispose(s.P_begin);
s.P_begin := nextNode;
сurrent := nextNode;
end
else begin
nextNode := сurrent^.next;
dispose(сurrent);
pred^.next := nextNode;
сurrent := nextNode;
end;
end
else begin
pred := сurrent;
сurrent := сurrent^.next;
end;
end;
end;
function SearchValue(s: Ring; x: integer):boolean;
var
current: P_elem;
begin
if s.P_begin <> nil then
begin
current := s.P_begin;
repeat
if current^.Data = x then begin
SearchValue := True;
exit;
end;
current := current^.Next;
until current^.next = s.P_begin;
if current^.data = x then
SearchValue := True;
end;
end;

var
s1,s2: Ring;
begin
...
Вызов вышеперечисленных функций
...
end.

Вам также может понравиться