Нужно разделить очередь на две, в одну значения большие или равные среднему,во вторую меньшие,при этом не создавая новую(задание такое).Как я понял нужно просто сделать две точки входа в очередь:из первой точки большие элементы,из второй меньшие, но я не могу реализовать.Ниже непосредственно представлен код, уже написанной функции(b-указатель на начало очереди):функция Avrg2 P.S. порядок элементов должен сохраниться.
struct Spis1
{
int info;
Spis1* next;
}* b, *e, *b2, *e2;
void Create(Spis1** b, Spis1** e, int in)
{
Spis1* t = new Spis1;
t -> info = in;
t -> next = NULL;
if (*b == NULL)
*b = *e = t;
else
{
(*e)-> next = t;
*e = t;
}
}
void View(Spis1* b)
{
Spis1* i = new Spis1;
i = b;
while (i != NULL)
{
cout << i->info << " " << endl;
i = i->next;
}
}
void Del_All(Spis1** b)
{
Spis1* t;
while (*b != NULL)
{
t = *b;
*b = (*b)->next;
delete t;
}
}
Spis1* Avrg(Spis1* b)
{
int n = 0, s = 0;
Spis1* t;
double a;
t = b;
while (t != NULL)
{
s += t->info;
t = t->next;
n++;
}
a = (double) s / (double) n;
cout << "Среднее арифметическое=" << a;
Spis1* p = b;
t = p ->next;
while (t != NULL)
{
if (p == b && p->info < a)
{
p = b;
b = b->next;
delete p;
p = t;
t = t->next;
continue;
}
if (a > (t->info))
{
p -> next = t -> next;
delete t;
t = p -> next;
}
else
{
p = t;
t = t -> next;
}
}
return b;
}
Spis1* Avrg2(Spis1* b)
{
int n = 0, s = 0;
Spis1* t, *p;
double a;
t = b;
while (t != NULL)
{
s += t->info;
t = t->next;
n++;
}
a = (double) s / (double) n;
cout << "Среднее арифметическое=" << a;
n = 0;
t = b;
while (t != NULL)
{
}
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleOutputCP(1251);
int i, in, n, kod, kod1;
while (true)
{
cout << "Создать/Добавить - 1 " << endl << "Просмотреть - 2 " << endl
<< "Удалить - 3 " << endl <<
"Сортировка(удаление меньше среднего) - 4" << endl <<
"Разделение - 5 " << endl;
cin >> kod;
switch (kod)
{
case 1:
cout << "Введите число элементов: ";
cin >> n;
cout << "Введите чиселки: ";
for (i = 1; i <= n; i++)
{
cin >> in;
Create(&b, &e, in);
}
break;
case 2:
if (b == NULL)
{
cout << "ПУСТО" << endl;
break;
}
cout << "------ЧИСЕЛКИ------" << endl;
View(b);
break;
case 3:
Del_All(&b);
cout << "Память освобождена!" << endl;
break;
case 4:
b = Avrg(b);
case 5:
Avrg2(b);
break;
}
cout << endl << endl;
}
return 0;
}
Так, скорее наметки, чем "живой" код. На работоспособность не проверял, проверки "от дурака" - типа, пустая цепочка или тому подобные - не делал.
Передаем в функцию указатель на первый элемент в цепочке и среднее. После завершения указатель на первый элемент указывает на первый элемент в цепочке больших, а возвращаемый функцией указатель - на новую цепочку меньших.
Что происходит - описано в комментариях.
Spis1* Rebuild(Spis1* &start, int avg)
{
Spis1* curr = start; // Указатель на текущий элемент
Spis1* less = nullptr; // Последний элемент в цепочке меньших
Spis1* more = nullptr; // Последний элемент в цепочке больших
Spis1* ret = nullptr; // Указатель на цепочку меньших
while(curr)
{
if (curr->info > avg) // Оставляем на месте
{
if (more == nullptr) // Первый
{
start = curr;
}
// Добавляем в цепочку
if (more) more->next = curr;
more = curr;
}
else // Меньше или равен среднему
{
if (ret == nullptr) // Первый
{
ret = curr;
}
if (less) less->next = curr;
less = curr;
}
curr = curr->next;
}
more->next = less->next = nullptr; // Обрубаем цепочки
return ret;
}
Еще раз - no warranty, это скорее намек, как делать самому.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите какие должны быть настройки у image-min и его плагинов через Gulp, чтобы уровень сжатия картинок (png, jpg) был приближен к сжатию в Tinypng ?