
Заключение
В ходе работы был создан простой динамический циклический список, который включает реализацию базовых операций — добавление, удаление, очистку и поиск элементов. Дополнительно реализованы функции для удаления четных и повторяющихся значений.
Приложение а
(обязательное)
Код
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;
}
runner.Next = runner.Next.Next;
}
else
{
runner = runner.Next;
}
}
current = current.Next;
} while (current != head);
}
public void PrintList()
{
if (head == null)
{
Console.WriteLine("Список пуст.");
return;
}
Node current = head;
do
{
Console.Write(current.Value + " ");
current = current.Next;
} while (current != head);
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
MyList list = new MyList();
bool keepRunning = true;
while (keepRunning)
{
Console.WriteLine("1. Добавить элемент");
Console.WriteLine("2. Удалить элемент");
Console.WriteLine("3. Очистить список");
Console.WriteLine("4. Поиск элемента");
Console.WriteLine("5. Удалить четные элементы");
Console.WriteLine("6. Удалить повторяющиеся элементы");
Console.WriteLine("7. Показать список");
Console.WriteLine("8. Выйти");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент: ");
int addValue = int.Parse(Console.ReadLine());
list.Add(addValue);
break;
case "2":
Console.Write("Введите элемент для удаления: ");
int removeValue = int.Parse(Console.ReadLine());
bool removed = list.RemoveItem(removeValue);
Console.WriteLine(removed ? "Элемент удален." : "Элемент не найден.");
break;
case "3":
bool cleared = list.Clear();
Console.WriteLine(cleared ? "Список очищен." : "Список пуст.");
break;
case "4":
Console.Write("Введите элемент для поиска: ");
int searchValue = int.Parse(Console.ReadLine());
bool found = list.Search(searchValue);
Console.WriteLine(found ? "Элемент найден." : "Элемент не найден.");
break;
case "5":
list.RemoveEven();
Console.WriteLine("Четные элементы удалены.");
break;
case "6":
list.RemoveDuplicates();
Console.WriteLine("Повторяющиеся элементы удалены.");
break;
case "7":
list.PrintList();
break;
case "8":
keepRunning = false;
break;
default:
Console.WriteLine("Неверный выбор.");
break;
}
}
}
}
Томск 2024