Проблема реализации Insert() для односвязного списка

Задача состоит в том чтобы после целой части простых чисел (простые числа делятся только на 1 и на себя, например: 3, 5, 7 и т.д) вставлять минимальный положительный элемент списка. Только вот вместо этого функция insert() не вставляет после, а заменяет простое число на минимальное. Помогите пожалуйста найти ошибку ;(

Пример данных:

Список {1.84, 4.34, 5.8, 1.11, 17.87, 1.85, 29.78, 8.87, 14.97, 7.01}

Минимальный положительный элемент = 1.11

Вставляем 1.11 после простых чисел

Итог = {1.84, 4.34, 5.8, 1.11, 1.11, 17.87, 1.11, 1.85, 29.78, 1.11, 8.87, 14.97, 7.01, 1.11}

Вот мой "прекрасный" код:

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

struct Node //Узел
{
    float val; //Значение задаваемое пользователем
    Node* next; //Указатель на следующий элемент

    Node(float _val) : val(_val), next(nullptr) {} //Конструктор
}; 

struct singlyLinkedList //Односвязанный список
{
    Node* first; //Указатель на первый элемент узла
    Node* last; //Указатель на ппоследний элемент узла

    singlyLinkedList() : first(nullptr), last(nullptr) {} //Конструктор

    bool is_empty() //Проверка наличия узлов в списке
    {
        return first == nullptr;
    }

    void push_back(float _val) //Добавление в конец списка
    {
        Node* p = new Node(_val);
        if (is_empty()) 
        {
            first = p;
            last = p;
            return;
        }
        last->next = p;
        last = p;
    }

    void print() //Вывод значений списка
    {
        if (is_empty()) return;
        Node* p = first;
        while (p)
        {
            cout << p->val << " ";
            p = p->next;
        }
        cout << endl;
    }

    Node* find(float _val) //Поиск улза по значению
    {
        Node* p = first;
        while (p && p->val != _val) p = p->next;
        return (p && p->val == _val) ? p : nullptr;
    }

    void remove_first() //Удаление первого узла
    {
        if (is_empty()) return;
        Node* p = first;
        first = p->next;
        delete p;
    }

    void remove_last() //Удаление последнего узла
    {
        if (is_empty()) return;
        if (first == last)
        {
            remove_first();
            return;
        }
        Node* p = first;
        while (p->next != last) p = p->next;
        p->next = nullptr;
        delete last;
        last = p;
    }

    void erase(float _val) //Удаление узла по значению
    {
        if (is_empty()) return;
        if (first->val == _val) 
        {
            remove_first();
            return;
        }
        else if (last->val == _val)
        {
            remove_last();
            return;
        }
        Node* slow = first;
        Node* fast = first->next;
        while (fast && fast->val != _val) 
        {
            fast = fast->next;
            slow = slow->next;
        }
        if (!fast) 
        {
            cout << "Данного элемента не существует" << endl;
            return;
        }
        slow->next = fast->next;
        delete fast;
    }

    Node* operator[] (const int index) //Обращение к узлу по индексу
    {
        if (is_empty()) return nullptr;
        Node* p = first;
        for (int i = 0; i < index; i++) 
        {
            p = p->next;
            if (!p) return nullptr;
        }
        return p;
    }
};
//Случайное заполнение
void fillMasRnd(singlyLinkedList& list, int n)
{
    int max, min;

    do
    {
        cout << "Введите левую границу случайных чисел для заполнения массива [-100, 80] = ";
        cin >> min;
    } while (min < -100 || min > 80);
    cout << endl;

    do
    {
        cout << "Введите правую границу случайных чисел для заполнения массива [min, 100] = ";
        cin >> max;
    } while (min > max || max > 100);

    for (int count = 0; count < n; count++)
    {
        list.push_back(round(((float)rand() / (float)RAND_MAX * (max - min) + min) * 100) / 100);
    }
}
//Ручное заполнение
void fillMasHand(singlyLinkedList& list, int n)
{
    float temp;

    for (int count = 0; count < n; count++)
    {
        cout << "\nЧисло " << count + 1 << " = ";
        cin >> temp;
        list.push_back(temp);
    }
}
//Найти наименьшее положительное число
float searchMinPosNum(singlyLinkedList list)
{
    float result = 101.0;

    Node* p = list.first;

    while (p) 
    {
        if (p->val > 1 && p->val < result)
        {
            result = p->val;
        }
        p = p->next;
    }

    return result;
}
//Проверка на простату
bool SimpleNum(float n)
{
    int num = n;

    for (int i = 2; i <= sqrt(num); i++)
    {
        if (num % i == 0) {
            // вывести, что n  не простое, так как делится на i
            return false;
        }
    }
    //вывести что n простое.
    if (num > 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//Добавление элемента в массив
void insert(singlyLinkedList& list, float posNum, int val)
{
    singlyLinkedList temp;

    Node *p = list.first;
    Node *t = temp.first;

    temp.push_back(p->val);
    p = p->next;

    while (p->val != posNum)
    {
        temp.push_back(p->val);
        
        p = p->next;
    }

    temp.push_back(p->val);
    p = p->next;

    temp.push_back(val);
    p = p->next;

    while (p)
    {
        temp.push_back(p->val);

        p = p->next;
    }

    p = list.first;
    t = temp.first;

    while (t && p)
    {
        p->val = t->val;

        p = p->next;
        t = t->next;
    }

    while (p != nullptr)
    {
        list.push_back(t->val);

        p = p->next;
        t = t->next;
    }
}
//Задание 1.1 добавление числа после заданного
void searchIntSimpleNum(singlyLinkedList list, int& coastSimpleNum)
{
    Node* p = list.first;

    int val = searchMinPosNum(list); //значение для внесения в массив

    if (val == 101)
    {
        cout << "Положительного числа в массиве не найдено. Введите собственное число: ";
        cin >> val;
    }

    cout << "\nЦелое значение минимального положительного числа равно = " << val << " оно будет вставляться в массив" << endl;

    while (p)
    {
        int check = p->val;

        if (SimpleNum(p->val) == true && check != val)
        {
            if (p->next == nullptr)
            {
                list.push_back(val);
            }
            else
            {
                insert(list, p->val, val);
            }

            coastSimpleNum++;
        }

        p = p->next;
    }
}

int main()
{
    setlocale(LC_ALL, "rus");
    srand(time(0));

    singlyLinkedList list;

    int n, menu = -1, coastSimpleNum = 0;

    do
    {
        cout << "Введите количество элементов массива = ";
        cin >> n;
    } while (n < 1 || n > 30);
    cout << endl;

    fillMasRnd(list, n);

    list.print();

    do
    {
        switch (menu)
        {
        case 1:

            searchIntSimpleNum(list, coastSimpleNum);

            if (coastSimpleNum == 0)
            {
                cout << "\nЧисла целая чать которых простое число не найдено " << endl;
            }
            else
            {
                cout << "\nКоличество простых числел = " << coastSimpleNum << endl;

                list.print();
            }

            break;

        case 2:

            //erase(array, n);

            list.print();

            break;
        }

        cout << "\n1) Задание 1.1 и 1.2 Вставка\n2) Задание 2 Удаление\n0) Выйти\nВведите желаемое задание: ";
        cin >> menu;

    } while (menu != 0);

    cout << endl;
    system("pause");

    return 0;
}


Ответы (0 шт):