Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сд3

.pdf
Скачиваний:
11
Добавлен:
01.12.2024
Размер:
575 Кб
Скачать
☆

Реализация всего приложения представлена в приложении 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

Соседние файлы в предмете Структуры данных