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

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

«ОМСКИЙ ГОСУДАРСТВЕННЫЙ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра Информатика и вычислительная техника

Лабораторная работа №14

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

на тему:

«Динамические структуры данных. Списки»

Выполнил ст.гр. ИВТ-234

Шкутова А.В.

Проверила профессор

Дорошенко М.С

Омск 2024

Задание 1 (программа 14_1)

11. Сформировать очередь из элементов целого типа. Четные элементы возвести в квадрат. Распечатать исходную и результирующую очереди.

Схема алгоритма:

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

#include <iostream>

#include <vector>

using namespace std;

// Определение структуры для элемента очереди

struct qel {

int elmnt; // Значение элемента

qel* next; // Указатель на следующий элемент

};

// Определение структуры очереди

struct Queue {

qel* front = nullptr; // Указатель на начало очереди

qel* rear = nullptr; // Указатель на конец очереди

};

// Функция для добавления элемента в очередь

void enqueue(Queue& q, int elm) {

qel* newEl = new qel; // Создание нового элемента

(*newEl).elmnt = elm; // Присвоение значения новому элементу

(*newEl).next = nullptr; // новый элемент ссылается на nullptr (пусто)

if (q.rear == nullptr) { // Если очередь пуста

q.front = newEl; // Устанавливаем начало очереди на новый элемент

q.rear = newEl; // Устанавливаем конец очереди на новый элемент

}

else { // Если очередь не пуста

(*q.rear).next = newEl; // Связываем текущий конец очереди с новым элементом

q.rear = newEl; // Устанавливаем новый элемент как конец очереди

}

}

// Функция для извлечения элемента из очереди

int dequeue(Queue& q) {

int val = (*q.front).elmnt; // Сохраняем значение первого элемента очереди

qel* temp = q.front; // Сохраняем указатель на первый элемент

q.front = (*q.front).next; // Сдвигаем указатель начала очереди на следующий элемент

if (q.front == nullptr) { // Если это был последний элемент в очереди

q.rear = nullptr; // Устанавливаем конец очереди на nullptr

}

delete temp;

return val;

}

int main() {

setlocale(LC_ALL, "RUS"); // Установка локали для вывода текста на русском

Queue orQueue; // Создание исходной очереди

Queue sqQueue; // Создание очереди для квадратов элементов

vector<int> orVal; // Вектор для хранения значений исходной очереди

for (int i = 1; i <= 10; ++i) { // Заполнение исходной очереди значениями от 1 до 10

enqueue(orQueue, i); // Добавление элемента в исходную очередь

orVal.push_back(i); // Добавление значения в вектор исходных значений

}

// Обработка элементов исходной очереди

while (orQueue.front != nullptr) {

int curElement = dequeue(orQueue); // Извлечение элемента из исходной очереди

if (curElement % 2 == 0) { // Проверка, является ли текущий элемент четным

curElement *= curElement; // Возведение четного элемента в квадрат

}

enqueue(sqQueue, curElement); // Добавление обработанного элемента в очередь для квадратов

}

cout << "Исходная очередь: ";

for (int val : orVal) { // Для каждого значения в векторе исходных значений

cout << val << " ";

}

cout << "\nРезультирующая очередь: ";

while (sqQueue.front != nullptr) { // Пока очередь для квадратов не пуста

cout << dequeue(sqQueue) << " "; // Извлечение и вывод элемента из очереди для квадратов

}

return 0;

}

Результат программы:

Задание 2 (программа 14_2)

Использование другой динамической структуры - стек.

Схема алгоритма:

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

#include <iostream>

using namespace std;

struct Node { // Объявление структуры Node для элементов стека

int data; // Целочисленное поле для данных элемента

Node* next;// Указатель на следующий элемент

};

void initStack(Node*& top) {// Функция для инициализации стека

top = nullptr;// Устанавливаем вершину стека в nullptr

}

void push(Node*& top, int val) { // Функция для добавления элемента в стек

Node* newNode = new Node; // Создание нового узла

(*newNode).data = val; // Присваивание узлу значение val

(*newNode).next = top; // Новый узел указывает на предыдущий верхний узел

top = newNode;// Верхний узел становится новым узлом

}

void sqEven(Node* top) { // Функция для возведения в квадрат четных элементов стека

Node* temp = top; // Временный указатель указывает на вершину стека

while (temp != nullptr) {// Пока не конец стека

if ((*temp).data % 2 == 0) {// Если значение текущего узла четное

(*temp).data = (*temp).data * (*temp).data; // Возвести его в квадрат

}

temp = (*temp).next; // Перейти к следующему узлу

}

}

void printStack(Node* top) {// Функция для вывода содержимого стека

Node* temp = top; // Временный указатель указывает на вершину стека

while (temp != nullptr) { // Пока не конец стека

cout << (*temp).data << " ";// Выводим значение текущего узла

temp = (*temp).next; // Перейти к следующему узлу

}

cout << endl;

}

int main() {

setlocale(LC_ALL, "RUS");// Установка локали для корректного отображения русского языка

Node* top;// Указатель на вершину стека

initStack(top);// Инициализируем стек

push(top, 1); // Добавляем элементы в стек

push(top, 2);

push(top, 3);

push(top, 4);

push(top, 5);

cout << "исходный стек: ";

printStack(top);

sqEven(top);// Возводим в квадрат четные элементы

cout << "результирующий стек: ";

printStack(top);

return 0;

}

Результат программы:

Соседние файлы в папке лабы