Вопрос по очереди

223
06 апреля 2017, 20:32

Нужно разделить очередь на две, в одну значения большие или равные среднему,во вторую меньшие,при этом не создавая новую(задание такое).Как я понял нужно просто сделать две точки входа в очередь:из первой точки большие элементы,из второй меньшие, но я не могу реализовать.Ниже непосредственно представлен код, уже написанной функции(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;
}
Answer 1

Так, скорее наметки, чем "живой" код. На работоспособность не проверял, проверки "от дурака" - типа, пустая цепочка или тому подобные - не делал.

Передаем в функцию указатель на первый элемент в цепочке и среднее. После завершения указатель на первый элемент указывает на первый элемент в цепочке больших, а возвращаемый функцией указатель - на новую цепочку меньших.

Что происходит - описано в комментариях.

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, это скорее намек, как делать самому.

READ ALSO
Оптимальная настройка image-min в Gulp

Оптимальная настройка image-min в Gulp

Подскажите какие должны быть настройки у image-min и его плагинов через Gulp, чтобы уровень сжатия картинок (png, jpg) был приближен к сжатию в Tinypng ?

524
TypeError при попытку вызвать spread в bluebird

TypeError при попытку вызвать spread в bluebird

При попытке запустить такой код

217
Ошибка THREE.ShapeBufferGeometry is not a constructor

Ошибка THREE.ShapeBufferGeometry is not a constructor

Перешел на webpackИмпортирую three

311