Практики(Вариант №7) / Практическая работа №3
.odtМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
СПИСКИ Отчет по практической работе №3 по дисциплине «Структуры данных»
Студент гр.
________
__.__.2025
Принял
Преподаватель
кафедры КИБЭВС
________ Д.Р. Уразаев
__.__.2025
Задание
Реализовать динамический список при помощи двух классов. Класс node - отвечает за узел элемента списка, класс List - за работу со списком. Реализовать интерфейсную часть - методы:
инициализация пустого списка - делаем это в конструкторе, если используются классы.
добавление элементов списка в конец bool add (int element)
удаление заданного элемента из списка bool remove_item (int element ), где int element - удаляемый элемент, метод возвращает true если удаление элемента прошло успешно.
Очистка списка -- bool clear(), возвращает true при успешной очистке, false в противоположном случае
поиск элемента списка по образцу
Вариант 7. Реализуемый список должен быть двусвязным. Два упорядоченных динамических списка объединить в один упорядоченный - реализовать в виде метода. Реализовать сортировку элементов списка в виде метода, массив для сортировки не использовать.
Оглавление
Задание 2
Введение 4
1 ХОД РАБОТЫ 5
Заключение 11
Приложение А 12
Введение
Целью данного задания является создание простого динамического циклического списока с использованием двух классов. Реализация базовых операций — добавление, удаление, очистка и поиск элементов. Также добавление функции удаления четных и повторяющихся элементов.
1 ХОД РАБОТЫ
В основе списка
лежит класс Node,
который хранит значение элемента и
ссылку на следующий узел. Класс MyList
управляет списком через два указателя:
на голову и на хвост списка (рис.
1).
Рисунок 1 — Создание классов
Добавление элемента: добавляет новый элемент в конец двусвязного списка, сохраняя ссылку на последний элемент через tail (рис. 2).
Рисунок 2 — Добавление
Удаление элемента: удаляет первый найденный элемент с заданным значением из двусвязного списка, корректно обновляя указатели head, tail и связи между узлами (рис.3).
Рисунок
3 — Удаление
Очистка списка: Полное удаление всех элементов — указатели на голову и хвост обнуляются (рис.4).
Рисунок
4 — Очистка
Поиск элемента: возвращает индекс первого вхождения элемента с заданным значением в списке, считая с нуля (рис.5).
Рисунок
5 — Поиск элемента
Сортировка: сортировка списка, путем сортировки обменом (рис. 6).
Рисунок
6 — Сортировка
Объединение двух упорядоченных списков в один упорядоченный (рис. 7).
Рисунок
7 — Объединение
Для сортировки была составлена блок-схема, которая представлена на рисунке 8.
Рисунок
8 — Блок-схема метода Sort()
Заключение
В ходе работы был создан простой динамический циклический список, который включает реализацию базовых операций — добавление, удаление, очистку и поиск элементов. Дополнительно реализованы функции для сортировки и объединения двух списков.
Приложение А
(обязательное)
Сортировка расческой
using System;
public class Node
{
public int Value;
public Node Prev;
public Node Next;
public Node(int value)
{
Value = value;
Prev = null;
Next = null;
}
}
public class MyList
{
private Node head;
private Node tail;
private int size;
public MyList()
{
head = null;
tail = null;
size = 0;
}
public bool Add(int element)
{
Node newNode = new Node(element);
if (head == null)
{
head = newNode;
tail = newNode;
}
else
{
tail.Next = newNode;
newNode.Prev = tail;
tail = newNode;
}
size++;
return true;
}
public bool RemoveItem(int element)
{
if (head == null) return false;
Node current = head;
while (current != null)
{
if (current.Value == element)
{
if (current.Prev != null)
current.Prev.Next = current.Next;
else
head = current.Next; // Удаляем первый элемент
if (current.Next != null)
current.Next.Prev = current.Prev;
else
tail = current.Prev; // Удаляем последний элемент
size--;
return true;
}
current = current.Next;
}
return false;
}
public bool Clear()
{
head = null;
tail = null;
size = 0;
return true;
}
public int Search(int element)
{
Node current = head;
int index = 0;
while (current != null)
{
if (current.Value == element)
return index;
current = current.Next;
index++;
}
return -1;
}
public void Sort()
{
if (head == null || head.Next == null) return;
bool swapped;
do
{
swapped = false;
Node current = head;
while (current.Next != null)
{
if (current.Value > current.Next.Value)
{
int temp = current.Value;
current.Value = current.Next.Value;
current.Next.Value = temp;
swapped = true;
}
current = current.Next;
}
}
while (swapped);
}
public static MyList MergeSortedMyLists(MyList list1, MyList list2)
{
MyList result = new MyList();
Node current1 = list1.head;
Node current2 = list2.head;
while (current1 != null && current2 != null)
{
if (current1.Value <= current2.Value)
{
result.Add(current1.Value);
current1 = current1.Next;
}
else
{
result.Add(current2.Value);
current2 = current2.Next;
}
}
while (current1 != null)
{
result.Add(current1.Value);
current1 = current1.Next;
}
while (current2 != null)
{
result.Add(current2.Value);
current2 = current2.Next;
}
return result;
}
public void Print()
{
Node current = head;
Console.Write("MyList: ");
while (current != null)
{
Console.Write(current.Value + " ");
current = current.Next;
}
Console.WriteLine();
}
public int Size
{
get { return size; }
}
}
class Program
{
static void Main()
{
MyList list1 = new MyList();
MyList list2 = new MyList();
list1.Add(5);
list1.Add(2);
list1.Add(8);
list1.Add(1);
list2.Add(3);
list2.Add(6);
list2.Add(4);
list2.Add(7);
Console.WriteLine("Исходные списки:");
list1.Print();
list2.Print();
list1.Sort();
list2.Sort();
Console.WriteLine("\nОтсортированные списки:");
list1.Print();
list2.Print();
MyList mergedMyList = MyList.MergeSortedMyLists(list1, list2);
Console.WriteLine("\nОбъединенный отсортированный список:");
mergedMyList.Print();
Console.WriteLine("\nПоиск элемента 4: " + mergedMyList.Search(4));
Console.WriteLine("Поиск элемента 10: " + mergedMyList.Search(10));
Console.WriteLine("Удаление элемента 4: " + mergedMyList.RemoveItem(4));
Console.WriteLine("Список после удаления:");
mergedMyList.Print();
Console.WriteLine("Очистка списка: " + mergedMyList.Clear());
Console.WriteLine("Размер после очистки: " + mergedMyList.Size);
}
}
Томск 2025
