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

Практики(Вариант №1) / Практическая работа №3

.odt
Скачиваний:
0
Добавлен:
23.02.2026
Размер:
347.98 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра безопасности информационных систем (БИС)

СПИСКИ Отчет по практической работе №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

Соседние файлы в папке Практики(Вариант №1)