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

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

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

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

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

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

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

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