Проблема реализации 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;
}