Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+1

Программирование С++, решение задачи

Прошу помочь с задачкой :3
Создать двусвязный список, содержащий целые числа. После всех чисел, равных минимальному числу, вставить последний четный элемент. Например, было 2 8 2 1 6 8 8 1 2 2 8 2 1. Стало 2 8 2 1 2 6 8 8 1 2 2 2 8 2 1 2

По дате
По рейтингу
Аватар пользователя
Просветленный

### Шаги решения:
1. Определим структуру узла для двусвязного списка.
2. Напишем функции для добавления элементов в список и вывода списка.
3. Найдем минимальный и последний четный элементы списка.
4. Вставим последний четный элемент после всех минимальных чисел.
#### Определение структуры узла:

1234567891011121314151617181920212223242526272829303132
 #include <iostream> 
#include <limits.h> 
 
struct Node { 
    int data; 
    Node* next; 
    Node* prev; 
    Node(int val) : data(val), next(nullptr), prev(nullptr) {} 
}; 
 
void insert(Node*& head, int val) { 
    Node* newNode = new Node(val); 
    if (!head) { 
        head = newNode; 
    } else { 
        Node* temp = head; 
        while (temp->next) { 
            temp = temp->next; 
        } 
        temp->next = newNode; 
        newNode->prev = temp; 
    } 
} 
 
void printList(Node* head) { 
    while (head) { 
        std::cout << head->data << " "; 
        head = head->next; 
    } 
    std::cout << std::endl; 
} 
 

#### Функции для добавления элементов и вывода списка:

12345678910111213141516171819202122232425262728293031323334
 void findMinAndLastEven(Node* head, int& min, int& lastEven) { 
    min = INT_MAX; 
    lastEven = INT_MIN; 
    Node* temp = head; 
    while (temp) { 
        if (temp->data < min) { 
            min = temp->data; 
        } 
        if (temp->data % 2 == 0) { 
            lastEven = temp->data; 
        } 
        temp = temp->next; 
    } 
} 
 
void insertAfterMin(Node*& head, int min, int lastEven) { 
    if (lastEven == INT_MIN) return; 
    Node* temp = head; 
    while (temp) { 
        if (temp->data == min) { 
            Node* newNode = new Node(lastEven); 
            newNode->next = temp->next; 
            if (temp->next) { 
                temp->next->prev = newNode; 
            } 
            temp->next = newNode; 
            newNode->prev = temp; 
            temp = newNode->next; 
        } else { 
            temp = temp->next; 
        } 
    } 
} 
 

#### Основная функция:

123456789101112131415161718192021
 int main() { 
    Node* head = nullptr; 
    int elements[] = {2, 8, 2, 1, 6, 8, 8, 1, 2, 2, 8, 2, 1}; 
    int size = sizeof(elements) / sizeof(elements[0]); 
    for (int i = 0; i < size; ++i) { 
        insert(head, elements[i]); 
    } 
 
    std::cout << "Original list: "; 
    printList(head); 
 
    int min, lastEven; 
    findMinAndLastEven(head, min, lastEven); 
    insertAfterMin(head, min, lastEven); 
     
    std::cout << "Modified list: "; 
    printList(head); 
 
    return 0; 
} 
 

### Объяснение:
1. Определение структуры узла: Каждый узел двусвязного списка содержит data, указатели на next и prev.

2. Функции для добавления и вывода: insert добавляет элемент в конец списка, printList выводит список.

3. Нахождение минимального и последнего четного элементов: Функция findMinAndLastEven находит минимальное число и последний четный элемент в списке.

4. Вставка после минимальных чисел: Функция insertAfterMin вставляет последний четный элемент после всех встреченных минимальных чисел.

### Запуск программы:
Этот код создает, модифицирует и выводит двусвязный список, как требуется согласно задаче. В конце выполнения вы увидите сначала исходный список, затем список с внесенными изменениями.