
Лабораторные работы / лабы / 14lb
.docxФедеральное государственное автономное образовательное учреждение высшего образования
«ОМСКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра Информатика и вычислительная техника
Лабораторная работа №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;
}
Результат программы: