
2392_Смирнова_М_ЛР3
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе 3
по дисциплине «Алгоритмы и Структуры Данных»
Тема: Линейная Структура Данных «Список»
Студентка гр. 2392 |
|
Смирнова М. В. |
Преподаватель |
|
Ряскова Е. Б. |
Санкт-Петербург
2023
Постановка задачи.
Создать односвязный список с помощью массива структур. Один из элементов структуры – целое число. Расположить в начале списка все элементы списка с четными целыми числами. Результирующий список вывести на экран.
Ход решения.
Struct Node: Определение списка через структуру, в элементе которого переменная и ссылка на следующий элемент.

Node* push: Функция добавления элемента в список – задается новый узел с введенными данными в начало связанного списка. Указатель обновляется на голову списка, создавая новый узел – новой головой.
Bool ischet: принимается целочисленный аргумент "data" и возвращает булево значение true, если остаток от деления аргумента на 2 равен 0 (т.е. число четное), и false в противном случае.

Bool cel: которая принимает аргумент типа float и возвращает булево значение true, если этот аргумент является целым числом (т.е. равен своему целочисленному представлению), и false в противном случае. Для проверки используется оператор static_cast<int>, который приводит значение аргумента к целочисленному типу.
Node* sort: реализуется сортировку связного списка по двум критериям: числа, которые являются целыми и четными, перемещаются в начало списка, а остальные числа - в конец.
Сначала проверяется, что список не пустой и состоит из более чем одного элемента. Затем создаются четыре указателя на узлы списка: два для четных чисел (chet и lastchet) и два для нечетных чисел (nechet и lastnechet).
Затем происходит проход по всем узлам списка. Каждый узел отсоединяется от списка (head указывает на следующий узел), чтобы его можно было добавить в новый список. Затем проверяется, является ли число в узле целым и четным, и в зависимости от этого добавляется в соответствующий список (если список пустой, то узел становится первым и последним элементом списка, иначе он добавляется в конец списка).

После прохода по всем узлам списка проверяется, были ли найдены хотя бы один четный элемент и хотя бы один нечетный элемент. Если да, то последний узел списка четных чисел (lastchet) указывает на первый узел списка нечетных чисел (nechet), и возвращается указатель на первый узел списка четных чисел (chet). Если нет, то возвращается указатель на первый узел списка нечетных чисел (nechet).
Void print: функция печатает значения всех узлов связного списка, начиная с головного узла (head). Сначала создается указатель current на головной узел списка. Затем в цикле while происходит проход по всем узлам списка, пока указатель current не станет равным nullptr (то есть пока не достигнут конец списка). Внутри цикла происходит вывод значения data текущего узла на экран с помощью функции cout, после чего указатель current переводится на следующий узел списка (current = current->next).

После окончания цикла while выводится символ перевода строки endl для того, чтобы следующий вывод начался с новой строки.

Int main: Сначала запрашивается у пользователя количество элементов в списке (переменная n), затем в цикле for запрашиваются значения каждого элемента и добавляются в список с помощью функции push. После заполнения списка вызывается функция print для вывода на экран значений всех элементов списка в порядке их следования. Затем вызывается функция sort для сортировки списка четности целой части элементов. Наконец, снова вызывается функция print для вывода на экран значений элементов отсортированного списка. После этого программа завершается.
Р
езультат
работы
Вывод
В ходе выполнения задания было освоено понимание структуры данных "список", изучены различные виды и основные операции, доступные для работы с ним.
Приложение
#include <iostream>
using namespace std;
struct Node {
float data;
Node* next;};
Node* push(Node* head, float data) {
Node* newNode = new Node;
newNode->data = data;
newNode->next = head;
return newNode;}
bool ischet(int data) {
return (data % 2 == 0);}
bool cel(float data) {
return (data == static_cast<int>(data));}
Node* sort(Node* head) {
if (head == nullptr || head->next == nullptr) {
return head;}
Node* chetCel = nullptr;
Node* chetCelLast = nullptr;
Node* ost = nullptr;
Node* LastOst = nullptr;
Node* current = head;
while (current != nullptr) {
Node* temp = current;
current = current->next;
temp->next = nullptr;
if (static_cast<int>(temp->data) % 2 == 0) {
if (chetCel == nullptr) {
chetCel = temp;
chetCelLast = temp;}
else {
chetCelLast->next = temp;
chetCelLast = temp;}}
else {
if (ost == nullptr) {
ost = temp;
LastOst = temp;}
else {
LastOst->next = temp;
LastOst = temp;}}}
if (chetCel != nullptr) {
chetCelLast->next = ost;
return chetCel;}
else {
return ost;}}
void print(Node* head) {
Node* current = head;
while (current != nullptr) {
cout << current->data << " ";
current = current->next;}
cout << endl;}
int main() {
int n;
cout << "Enter the number of items in the list: ";
cin >> n;
Node* head = nullptr;
for (int i = 0; i < n; ++i) {
float data;
cout << "Enter the element #" << i + 1 << ": ";
cin >> data;
head = push(head, data);}
cout << "Source list: ";
print(head);
head = sort(head);
cout << "Sorted list: ";
print(head);
return 0;}