Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2015, 23:43   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct spisok
{
    int numeric;
    spisok *next;
};

spisok *head = NULL, *head1 = NULL, *head2 = NULL;

void recur_print(spisok *k)
{
    if (k == NULL)
        return;
    recur_print(k->next);
    cout << k->numeric << " ";
}

int main()
{
    srand(time(NULL));
    int j = rand() % 10 + 15;
    spisok *tmp;
    for (int i = 0; i < j; ++i) {
        int chislo = rand() % 253 - 126;

        tmp = new spisok;
        tmp->numeric = chislo;
        tmp->next = head;
        head = tmp;

        if (chislo % 2 == 0) {
            if (head1 == NULL || chislo > head1->numeric) {
                tmp = new spisok;
                tmp->numeric = chislo;
                tmp->next = head1;
                head1 =  tmp;
            }
        } else {
            if (head2 == NULL || chislo < head2->numeric) {
                tmp = new spisok;
                tmp->numeric = chislo;
                tmp->next = head2;
                head2 =  tmp;
            }
        }
    }
    recur_print(head);
    cout << "\n";
    recur_print(head1);
    cout << "\n";
    recur_print(head2);
    return 0;
}
Выводит верно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.05.2015 в 02:09.
BDA на форуме Ответить с цитированием
Старый 29.05.2015, 23:59   #12
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

извиняюсь, проблема лежала на поверхности, немного переделал, сверил с результатам BDA, при разных наборах данных у BDA выводится как надо, а у меня с точностью наоборот

вот пример BDA

список 1:
2 4 6

список 2:
1 3 5

вот мой

6 4 2
5 3 1

как решить проблему?

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <math.h>
#include <ctime>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[\\d]+"), this));

}

MainWindow::~MainWindow()
{
    delete ui;
}



struct spisok
{
    int numeric;
    spisok *next;
};






void MainWindow::on_pushButton_clicked()
{

    spisok *head=NULL;
    spisok *head2=NULL;
    spisok *head1=NULL;
    spisok *inputnewspisok,*spis1,*spis2;

    ui->textEdit->clear();

    int j=ui->lineEdit->text().toInt(),chislo=0,count=0;
    if (j==0) j=10;


    srand(time(NULL));



    ui->textEdit->append(QString("Исходный список:"));

    for (int i=0;i<j;i++)
    {   chislo=rand()%1000-500;//chislo = rand() % 253 - 126;


        //пока число вне диапозона-генерируем новое
        while (chislo>126||chislo<-126)
        {
            chislo=rand()%1000-500;
            count++;//сколько раз число вне диапозона
        }




        //заполняем исходный список
        inputnewspisok=new spisok;
        inputnewspisok->numeric=chislo;
        ui->textEdit->append(QString("%1;").arg(inputnewspisok->numeric));
        inputnewspisok->next=head;
        head=  inputnewspisok;



        if (chislo % 2 == 0) {
            if (head1 == NULL || chislo > head1->numeric) {
                spis1= new spisok;
                spis1->numeric = chislo;
                spis1->next = head1;
                head1 = spis1;
            }
        } else {
            if (head2 == NULL || chislo < head2->numeric) {
                spis2 = new spisok;
                spis2->numeric = chislo;
                spis2->next = head2;
                head2 = spis2;
            }
        }
    }










    //вывод


    ui->textEdit->append(QString("\nЧисло вне диапозона появлялось: %1\n\nРезультат списка 1:").arg(count));

    while(spis1)
    {
        ui->textEdit->append(QString("%1").arg(spis1->numeric));
        spis1=spis1->next;

    }

    ui->textEdit->append(QString("\n\nРезультат списка 2:").arg(count));



    while(spis2)
    {
        ui->textEdit->append(QString("%1").arg(spis2->numeric));
        spis2=spis2->next;

    }




    delete inputnewspisok;
    delete spis1;
    delete spis2;

}
from dark to light)

Последний раз редактировалось Алексей_2012; 30.05.2015 в 00:30.
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 00:35   #13
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

вернее как добавлять не в голову, а в хвост списка spis1,spis2 (версию BDA не очень понимаю, т.к. плохо знаю про указатели)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 01:03   #14
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Есть, конечно, вариант использовать массив, но для этого придется использовать две дополнительные переменные для его инициализации, два лишних цикла ввода/вывода, записать список в массив и вывести массив в обратном порядке, ребят, помогите)

спасибо! может другие варианты есть?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 02:25   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В 100% корректности не уверен.
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct spisok
{
    int numeric;
    spisok *next;
};

spisok *head = NULL, *head1 = NULL, *head2 = NULL,
       *tail = NULL, *tail1 = NULL, *tail2 = NULL;

int main()
{
    srand(time(NULL));
    int j = rand() % 10 + 15;
    spisok *tmp;
    for (int i = 0; i < j; ++i) {
        int chislo = rand() % 253 - 126;

        tmp = new spisok;
        tmp->numeric = chislo;
        tmp->next = NULL;
        if (head) {
            tail->next = tmp;
            tail = tmp;
        } else
            head = tail = tmp;

        if (chislo % 2 == 0) {
            if (head1 == NULL) {
                head1 = tail1 = new spisok;
                head1->numeric = chislo;
                head1->next = NULL;
            } else if (chislo > tail1->numeric) {
                tail1->next = new spisok;
                tail1 = tail1->next;
                tail1->numeric = chislo;
                tail1->next = NULL;
            }
        } else {
            if (head2 == NULL) {
                head2 = tail2 = new spisok;
                head2->numeric = chislo;
                head2->next = NULL;
            } else if (chislo < tail2->numeric) {
                tail2->next = new spisok;
                tail2 = tail2->next;
                tail2->numeric = chislo;
                tail2->next = NULL;
            }
        }
    }
    tmp = head;
    while (tmp) {
        cout << tmp->numeric << " ";
        tmp = tmp->next;
    }
    cout << "\n";
    tmp = head1;
    while (tmp) {
        cout << tmp->numeric << " ";
        tmp = tmp->next;
    }
    cout << "\n";
    tmp = head2;
    while (tmp) {
        cout << tmp->numeric << " ";
        tmp = tmp->next;
    }
    return 0;
}
Чтобы освобождать память, нужно пройтись по всему списку.
Примерно:
Код:
while (head) {
        cout << head->numeric << " ";
        tmp = head;
        head = head->next;
        delete tmp;
}
tail = NULL;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан целочисленный массив X(N,M).среди элементов нечетных столбцов массива найти количество четных чисел. darwin1 Паскаль, Turbo Pascal, PascalABC.NET 1 15.03.2014 17:50
Подсчитать сумму отрицательных четных чисел, количество четных чисел кратных 3 и т.д. (pascal abc .net) kardinalmax Общие вопросы .NET 1 24.01.2014 09:28
Составить программу массива: Найти наименьшее из четных и произведение нечетных чисел, входящих в последовательность kolia_y Паскаль, Turbo Pascal, PascalABC.NET 8 06.10.2013 09:39
Дана последовательность целых чисел.Подсчитать среднее арифметическое отрицательных элементов. d_dima Помощь студентам 5 20.03.2013 15:14
Пусть вводится последовательность чисел, которая заканчивается нулем. Найдите среднее арифметическое четных чисел. d_dima Помощь студентам 3 13.03.2013 12:17