Смирнова_2370_ЛР3
.docxДисциплина: «Программирование»
Отчет по лабораторной работе №3
Выполнила: Смирнова М. В.
Группа: №2370
Цели работы:
Реализовать задание лабораторной работы №2 для случая односвязного циклического списка.
Построение линейного односвязного линейного списка типа «очередь». (информационные части узлов должны иметь целочисленный тип и заполняться путем последовательного ввода значений с клавиатуры; признак окончания ввода – введенный 0);
Обработку созданного списка с выполнением следующих функций:
Вставку узлов с информационной частью = 1 во все позиции списка, предшествующие узлам с отрицательной информационной частью
Удаление всех узлов списка, содержащих в информационной части отрицательные числа;
Расчет количества вхождений заданного с клавиатуры числа в информационные поля узлов;
Рекурсивное удаление всех узлов списка
Код программы:
#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;
}