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