

Рисунок 8 — Вывод списка
Сделал блок-схему(рис.9) и написал текстовое описание:
Функция RemoveDuplicates удаляет дубликаты, используя два указателя: current и runner. Указатель current фиксируется на текущем узле, а runner проходит по всем последующим узлам. Если значение узла runner совпадает со значением узла current, то runner изменяет ссылку на следующий узел, тем самым пропуская дубликат. Если дубликат находится в конце списка, указатель tail обновляется, чтобы указывать на предыдущий узел runner. Этот процесс продолжается, пока все узлы не будут проверены.

Рисунок 9 - Блок-схема
Заключение
В ходе работы был создан простой динамический циклический список, который включает реализацию базовых операций — добавление, удаление, очистку и поиск элементов. Дополнительно реализованы функции для удаления четных и повторяющихся значений.
Приложение А (обязательное)
Код
using System;
class Node
{
public int Value; public Node Next;
public Node(int value)
{
Value = value; Next = null;
}
}
class MyList
{
private Node head; private Node tail;
public MyList()
{
head = null; tail = null;
}
public bool Add(int element)
{
Node newNode = new Node(element);
if (head == null)
{
head = newNode; tail = newNode; tail.Next = head;
}
else
{
tail.Next = newNode; tail = newNode; tail.Next = head;
}
return true;
}
public bool RemoveItem(int element)
{
if (head == null)
{
return false;
}
Node current = head;
Node previous = null;
do
{
if (current.Value == element)
{
if (previous == null)
{
if (head == tail)
{
head = null; tail = null;
}
else
{
head = head.Next; tail.Next = head;
}
}
else
{
previous.Next = current.Next; if (current == tail)
{
tail = previous;
}
}
return true;
}
previous = current; current = current.Next;
} while (current != head);
return false;
}
public bool Clear()
{
if (head == null)
{
return false;
}
head = null; tail = null;
return true;
}
public bool Search(int element)
{
if (head == null)
{
return false;
}
Node current = head;
do
{
if (current.Value == element)
{
return true;
}
current = current.Next;
} while (current != head);
return false;
}
public void RemoveEven()
{
if (head == null)
{
return;
}
Node current = head;
Node previous = null;
do
{
if (current.Value % 2 == 0)
{
if (current == head)
{
if (head == tail)
{
head = null; tail = null;
}
else
{
head = head.Next; tail.Next = head; current = head;
}
}
else
{
previous.Next = current.Next; if (current == tail)
{
tail = previous;
}
current = previous.Next;
}
}
else
{
previous = current; current = current.Next;
}
} while (current != head);
}
public void RemoveDuplicates()
{
if (head == null)
{
return;
}
Node current = head;
do
{
Node runner = current; while (runner.Next != head)
{
if (runner.Next.Value == current.Value)
{
if (runner.Next == tail)
{
tail = runner;
}