сд3
.pdfРеализация всего приложения представлена в приложении A.
Описание классов, методов и параметров представлено в таблице 2.1.
Таблица 2.1 — Описание классов и методов
Класс |
Назначение |
Методы |
Назначение |
Параметры |
|
|
|
|
|
|
|
|
Узел |
|
|
|
|
Node |
циклическог |
Node |
Создание нового узла |
int value |
|
|
о списка |
|
|
|
|
|
|
|
|
|
|
|
|
Add |
Добавить элемент в |
int element |
|
|
|
конец списка |
|||
|
|
|
|
||
|
|
|
|
|
|
|
|
RemoveItem |
Удалить указанный |
int element |
|
|
|
элемент из списка |
|||
|
|
|
|
||
|
|
|
|
|
|
|
|
Clear |
Очистить список |
bool |
|
|
|
|
|
|
|
List |
Двусвязный |
Search |
Найти элементы в |
int element |
|
список |
списке по образцу |
||||
|
|
|
|||
|
|
|
|
|
|
|
|
MergeSortedLists |
Объединить два списка |
|
|
|
|
и отсортировать |
|
||
|
|
|
|
||
|
|
|
|
|
|
|
|
Sort |
Отсортировать список |
|
|
|
|
|
|
|
|
|
|
PrintList |
Вывести список на |
|
|
|
|
экран |
|
||
|
|
|
|
||
|
|
|
|
|
11
Реализована блок-схема алгоритма Sort в классе List (рисунок 2.8).
Рисунок 2.8 — Блок-схема алгоритма Sort в классе List
12
3Заключение
Входе выполнения практической работы была реализована программа инициализации списка и методы для работы с ним с помощью двух классов Node
иList. Созданы таблица классов и блок-схема алгоритма работы метода Sort.
13
Приложение А
using System;
public class Node
{
public int Value; public Node Next;
public Node(int value)
{
Value = value; Next = null;
}
}
public class List
{
public Node head; public Node tail;
public List()
{
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;
}
14
else
{
head = head.Next;
tail.Next = head; // Обновляем хвост для циклич-
ности
}
}
else
{
previous.Next = current.Next;
if (current == tail) // Если удаляемый элемент - это
хвост
{
tail = previous; tail.Next = head;
}
}
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 int Search(int element)
{
if (head == null) return -1; // Список пуст
Node current = head; int index = 0;
do
{
if (current.Value == element)
{
return index;
}
current = current.Next; index++;
}
while (current != head);
return -1; // Элемент не найден
}
// Сортировка списка public void Sort()
{
if (head == null || head.Next == head) return; // Список пуст или содер-
жит один элемент
bool swapped;
15
Node current;
do
{
swapped = false; current = head;
do
{
Node nextNode = current.Next;
if (current.Value > nextNode.Value)
{
int temp = current.Value; current.Value = nextNode.Value; nextNode.Value = temp;
swapped = true;
}
current = current.Next;
}
while (current != tail); // Проходим до хвоста
} while (swapped); // Повторяем, пока есть обмены
}
// Метод для слияния двух списков с сортировкой public void MergeSortedLists(List otherList)
{
Node current = otherList.head;
//Добавляем все элементы из другого списка в текущий if (current != null)
{
do
{
Add(current.Value); // Добавляем элемент из другого списка current = current.Next;
}
while (current != otherList.head);
}
//Сортируем объединённый список
Sort();
}
// Вывод списка
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();
}
16
}
public class Program
{
public static void Main(string[] args)
{
List list1 = new List(); List list2 = new List(); bool running = true;
while (running)
{
Console.WriteLine("\nМеню:");
Console.WriteLine("1. Добавить элемент в первый список"); Console.WriteLine("2. Добавить элемент во второй список"); Console.WriteLine("3. Удалить элемент из первого списка"); Console.WriteLine("4. Удалить элемент из второго списка"); Console.WriteLine("5. Поиск элемента в первом списке"); Console.WriteLine("6. Поиск элемента во втором списке"); Console.WriteLine("7. Очистить первый список"); Console.WriteLine("8. Очистить второй список"); Console.WriteLine("9. Показать первый список"); Console.WriteLine("10. Показать второй список"); Console.WriteLine("11. Отсортировать первый список"); Console.WriteLine("12. Отсортировать второй список"); Console.WriteLine("13. Объединить два списка и вывести результат"); Console.WriteLine("14. Выйти");
Console.Write("Выберите действие: "); string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент для добавления в первый
список: ");
int elementToAdd1 = int.Parse(Console.ReadLine()); list1.Add(elementToAdd1);
Console.WriteLine($"Элемент {elementToAdd1} добавлен в
первый список.");
break;
case "2":
Console.Write("Введите элемент для добавления во вто-
рой список: ");
int elementToAdd2 = int.Parse(Console.ReadLine()); list2.Add(elementToAdd2); Console.WriteLine($"Элемент {elementToAdd2} добавлен
во второй список.");
break;
case "3":
Console.Write("Введите элемент для удаления из первого
списка: ");
int elementToRemove1 = int.Parse(Console.ReadLine()); if (list1.RemoveItem(elementToRemove1))
{
Console.WriteLine($"Элемент {elementToRemove1}
удален из первого списка.");
}
else
{
Console.WriteLine("Элемент не найден в первом
списке.");
}
break;
17
case "4":
Console.Write("Введите элемент для удаления из второго
списка: ");
int elementToRemove2 = int.Parse(Console.ReadLine()); if (list2.RemoveItem(elementToRemove2))
{
Console.WriteLine($"Элемент {elementToRemove2}
удален из второго списка.");
}
else
{
Console.WriteLine("Элемент не найден во втором
списке.");
}
break;
case "5":
Console.Write("Введите элемент для поиска в первом
списке: ");
int elementToSearch1 = int.Parse(Console.ReadLine()); int index1 = list1.Search(elementToSearch1);
if (index1 != -1)
{
Console.WriteLine($"Элемент {elementToSearch1}
найден в первом списке на индексе {index1}.");
}
else
{
Console.WriteLine("Элемент не найден в первом
списке.");
}
break;
case "6":
Console.Write("Введите элемент для поиска во втором
списке: ");
int elementToSearch2 = int.Parse(Console.ReadLine()); int index2 = list2.Search(elementToSearch2);
if (index2 != -1)
{
Console.WriteLine($"Элемент {elementToSearch2}
найден во втором списке на индексе {index2}.");
}
else
{
Console.WriteLine("Элемент не найден во втором
списке.");
}
break;
case "7":
if (list1.Clear())
{
Console.WriteLine("Первый список очищен.");
}
else
{
Console.WriteLine("Первый список уже пуст.");
}
break;
case "8":
if (list2.Clear())
18
{
Console.WriteLine("Второй список очищен.");
}
else
{
Console.WriteLine("Второй список уже пуст.");
}
break;
case "9":
Console.WriteLine("Первый список:"); list1.PrintList();
break;
case "10":
Console.WriteLine("Второй список:"); list2.PrintList();
break;
case "11": list1.Sort();
Console.WriteLine("Первый список отсортирован."); break;
case "12": list2.Sort();
Console.WriteLine("Второй список отсортирован."); break;
case "13": list1.MergeSortedLists(list2);
Console.WriteLine("Объединённый и отсортированный спи-
сок:");
list1.PrintList();
break;
case "14":
running = false;
Console.WriteLine("Выход из программы."); break;
default:
Console.WriteLine("Неверный ввод, попробуйте еще
раз.");
break;
}
}
}
}
19
