Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
#1

Связанный список. List, не могу найти ошибку в куске кода - C++

22.12.2014, 13:47. Просмотров 230. Ответов 6
Метки нет (Все метки)

Программа работает, но работает не правильно. Суть функции, создается список, заполняется, потом надо по нужным условиям найти элементы и удалить из списка, но удаление не происходит. Список просто увеличивается в 2 раза и копирует свои же элементы...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void list_realization()
{
    std::list<int> myList;
    list<int>::iterator listIt;
 
    int buf, temp = 0;
    int N;
    int A, B, X;
 
    cout << "Ведите колличество элементов: ";
    cin >> N;
 
    cout << endl << "Введите коофиценты интервала:" << endl;
    cin >> A >> B;
 
    cout << endl << "Введите " << N << " элементов списка через пробелы:" << endl;
    
    for (int i = 0; i < N; i++)
    {
        cin >> buf;
        myList.push_back(buf);
    }
 
    cout << "Полученный список" << endl;
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        temp = temp + *listIt;
        cout << *listIt << ' ';
    }
 
    X = myList.size();
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        if (*listIt > (A * X) && *listIt < (B * X))
        {
            myList.erase(listIt);
        }
    }
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        cout << *listIt << ' ';
    }
 
    cout << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2014, 13:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связанный список. List, не могу найти ошибку в куске кода (C++):

Связанный список, найти ошибку - C++
http://iguania.ru/stati-po-programmirovaniiu/svyazanniy-spisok.html Вот статья про связанный список, все доступно и понятно написано,...

Связанный список (Linked list). - C++
Добрый день. Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других: парные числа и непарные, но...

Ошибка в куске кода - C++
Почему в массив не добавляется вводимое число??? include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;conio.h&gt; #include...

Что происходит в заданном куске кода? - C++
Здравствуйте, просто объясните пожалуйста этот кусок кода, что тут происходит. Это алгоритм преобразования серийного номера в нормальный...

Хотел бы попросить помочь разобраться в куске кода - C++
Всю программу приводить смысла нету, программа представляет собой интерпретатор формул на с++. Есть файл, в котором определены лексемы,...

Пожалуйста, проверьте, есть ли ошибки в приведённом куске кода. - C++
... unsigned short many = 10, people = 5; unsigned long int peep = 5, zood = 3; const unsigned long int peep = 10; ...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.12.2014, 14:14 #2
C++
1
2
3
4
listIt = myList.erase(listIt);
if ( listIt == myList.end() )
   break ;
--listIt ;
0
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 14:41  [ТС] #3
Croessmah, Получается вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void list_realization()
{
    std::list<int> myList;
    list<int>::iterator listIt;
 
    int buf, temp = 0;
    int N;
    int A, B, X;
 
    cout << "Ведите колличество элементов: ";
    cin >> N;
 
    cout << endl << "Введите коофиценты интервала:" << endl;
    cin >> A >> B;
 
    cout << endl << "Введите " << N << " элементов списка через пробелы:" << endl;
    
    for (int i = 0; i < N; i++)
    {
        cin >> buf;
        myList.push_back(buf);
    }
 
    cout << "Полученный список" << endl;
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        temp = temp + *listIt;
        cout << *listIt << ' ';
    }
 
    X = myList.size();
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        if (*listIt > (A * X) && *listIt < (B * X))
        {
            listIt = myList.erase(listIt);
            if (listIt == myList.end())
                break;
            --listIt;
        }
    }
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        cout << *listIt << ' ';
    }
 
    cout << endl;
}
Добавлено через 11 минут
Croessmah, Просто ничего не изменилось
Цитата Сообщение от Croessmah Посмотреть сообщение
if ( listIt == myList.end() )
но я думаю что это условие лишнее, поскольку в параметрах цикла написано что listIt != myList.end()
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.12.2014, 14:52 #4
Цитата Сообщение от _Edith Посмотреть сообщение
Просто ничего не изменилось
а что должно было измениться? Лишь исправил ошибку обращения к невалидному итератору
Цитата Сообщение от _Edith Посмотреть сообщение
Список просто увеличивается в 2 раза и копирует свои же элементы...
Тут ничего не увеличивается. У Вас выводится список:
C++
1
2
3
4
5
6
7
    cout << "Полученный список" << endl;
 
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        temp = temp + *listIt;
        cout << *listIt << ' ';
    }
а потом следом еще раз:
C++
1
2
3
4
5
6
    for (listIt = myList.begin(); listIt != myList.end(); listIt++)
    {
        cout << *listIt << ' ';
    }
 
    cout << endl;

Цитата Сообщение от _Edith Посмотреть сообщение
но я думаю что это условие лишнее, поскольку в параметрах цикла написано что listIt != myList.end()
при удалении последнего элемента erase вернет конечный итератор, тогда listIt++ приведет к ошибке
0
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 17:55  [ТС] #5
Croessmah, Да, я понял, но есть еще не решенный вопрос, я вычитал где то на форуме, что нельзя удалять элементы из цикла, так итератор теряет свое значение, как я понял, но меня волнует вот эта строка
C++
1
if (*listIt >= (A * X) && *listIt <= (B * X))
тут не выполняется условие, при последовательности (1, 2 ,3, 4, 5) среднее арифм. будет 3, и при коэффицентах значений 1, 2 диапазон удаления чисел будет 3-6 включительно, но удаляет только последний элемент
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.12.2014, 18:13 #6
Цитата Сообщение от _Edith Посмотреть сообщение
но удаляет только последний элемент
идем по алгоритму:
C++
1
cin >> A >> B;
A = 1 , B = 2
C++
1
X = myList.size();
получили X = 5
C++
1
if (*listIt >= (A * X) && *listIt <= (B * X))
A * X == 1 * 5 == 5
B * X == 2 * 5 == 10
Значит из последовательности 1,2,3,4,5 под условие подходит только элемент со значением 5

Добавлено через 7 минут
Цитата Сообщение от _Edith Посмотреть сообщение
среднее арифм. будет 3
и если X - Это среднее арифметическое, то может вы забыли поделить сумму на кол-во элементов?
C++
1
X = temp / myList.size();
0
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 19:31  [ТС] #7
Croessmah, блин, спасибо=) под вечер тупой, как угол 179 градусов.
0
22.12.2014, 19:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2014, 19:31
Привет! Вот еще темы с ответами:

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем - C++
Создать связанный список.Кроме информационных полей он должен обязательно содержать указатели на предыдущий и следующий за ним...

Сортировка слиянием. В каком куске кода происходит сортировка и каким именно образом? - C++
Помогите, пожалуйста, разобраться. Подскажите в каком куске кода происходит сортировка и каким именно образом? #include &lt;iostream&gt; ...

Связанный список - C++
Всем доброго время суток, написать программу демонстрации связанного списка, где PART - (ДЕТАЛЬ) содержит номер детали и остальную...

Связанный список - C++
Не могу обратиться к методу класса Node хотя они выраженны как public: void addNode(int d); void printList(); #include&lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru