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

Смирнова_2370_ЛР3

.docx
Скачиваний:
0
Добавлен:
05.12.2024
Размер:
19.25 Кб
Скачать

Дисциплина: «Программирование»

Отчет по лабораторной работе №3

Выполнила: Смирнова М. В.

Группа: №2370

Цели работы:

Реализовать задание лабораторной работы №2 для случая односвязного циклического списка.

  1. Построение линейного односвязного линейного списка типа «очередь». (информационные части узлов должны иметь целочисленный тип и заполняться путем последовательного ввода значений с клавиатуры; признак окончания ввода – введенный 0);

  2. Обработку созданного списка с выполнением следующих функций:

    1. Вставку узлов с информационной частью = 1 во все позиции списка, предшествующие узлам с отрицательной информационной частью

    2. Удаление всех узлов списка, содержащих в информационной части отрицательные числа;

    3. Расчет количества вхождений заданного с клавиатуры числа в информационные поля узлов;

    4. Рекурсивное удаление всех узлов списка

Код программы:

#include <iostream>

using namespace std;

struct Node {

int data;

Node* next;

};

Node* createList() {

Node* head = nullptr, * tail = nullptr, * newNode = nullptr;

int input;

cout << "Введите целые числа для создания списка (введите 0 для завершения ввода): ";

cin >> input;

while (input != 0) {

newNode = new Node;

newNode->data = input;

newNode->next = nullptr;

if (head == nullptr) {

head = newNode;

tail = newNode;

}

else {

tail->next = newNode;

tail = newNode;

}

cin >> input;

}

tail->next = head;

return head;

}

void print(Node* rear) {

if (rear == NULL) {

cout << "Список пустой" << endl;

return;

}

cout << "Список: ";

Node* current = rear->next;

do {

cout << current->data << " ";

current = current->next;

} while (current != rear->next);

cout << endl;

}

void insert(Node*& head) {

Node* cur = head;

do {

if (cur->data < 0) {

Node* newNode = new Node;

newNode->data = 1;

newNode->next = cur;

Node* prev = head;

while (prev->next != cur) prev = prev->next;

prev->next = newNode;

if (cur == head) head = newNode;

}

cur = cur->next;

} while (cur != head);

}

void deleteNegativeNodes(Node*& head) {

Node* current = head;

Node* prev = nullptr;

while (current->next != head) {

if (current->data < 0) {

if (current == head) {

head = head->next;

}

prev->next = current->next;

delete current;

current = prev->next;

}

else {

prev = current;

current = current->next;

}

}

if (current->data < 0) {

if (current == head) {

head = head->next;

}

prev->next = current->next;

delete current;

}

}

void recursiveDelete(Node*& head) {

if (head == nullptr) {

return;

}

recursiveDelete(head->next);

delete head;

head = nullptr;

}

int countOccurrences(Node* head, int num) {

if (head == nullptr) {

return 0;

}

int count = 0;

Node* current = head;

do {

if (current->data == num) {

count++;

}

current = current->next;

} while (current != head);

return count;

}

int main() {

setlocale(LC_ALL, "Russian");

Node* head = createList();

print(head);

insert(head);

print(head);

int n = 1;

while (n != 0)

{

cout << "Искомое число: ";

cin >> n;

cout << "Искомое число встречается " << countOccurrences(head, n) << " раз(а)" << endl;

}

deleteNegativeNodes(head);

print(head);

recursiveDelete(head);

return 0;

}