Форум программистов, компьютерный форум CyberForum.ru

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

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

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

22.12.2014, 13:47. Просмотров 208. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2014, 13:47     Связанный список. List, не могу найти ошибку в куске кода
Посмотрите здесь:

Хотел бы попросить помочь разобраться в куске кода C++
Связанный список (Linked list). C++
Связанный двусторонний список C++
C++ Связанный список.
C++ Связанный список
Ошибка в куске кода C++
Связанный список C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12892 / 7278 / 811
Регистрация: 27.09.2012
Сообщений: 17,978
Записей в блоге: 2
Завершенные тесты: 1
22.12.2014, 14:14     Связанный список. List, не могу найти ошибку в куске кода #2
C++
1
2
3
4
listIt = myList.erase(listIt);
if ( listIt == myList.end() )
   break ;
--listIt ;
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 14:41  [ТС]     Связанный список. List, не могу найти ошибку в куске кода #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()
Croessmah
Модератор
Эксперт CЭксперт С++
12892 / 7278 / 811
Регистрация: 27.09.2012
Сообщений: 17,978
Записей в блоге: 2
Завершенные тесты: 1
22.12.2014, 14:52     Связанный список. List, не могу найти ошибку в куске кода #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++ приведет к ошибке
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 17:55  [ТС]     Связанный список. List, не могу найти ошибку в куске кода #5
Croessmah, Да, я понял, но есть еще не решенный вопрос, я вычитал где то на форуме, что нельзя удалять элементы из цикла, так итератор теряет свое значение, как я понял, но меня волнует вот эта строка
C++
1
if (*listIt >= (A * X) && *listIt <= (B * X))
тут не выполняется условие, при последовательности (1, 2 ,3, 4, 5) среднее арифм. будет 3, и при коэффицентах значений 1, 2 диапазон удаления чисел будет 3-6 включительно, но удаляет только последний элемент
Croessmah
Модератор
Эксперт CЭксперт С++
12892 / 7278 / 811
Регистрация: 27.09.2012
Сообщений: 17,978
Записей в блоге: 2
Завершенные тесты: 1
22.12.2014, 18:13     Связанный список. List, не могу найти ошибку в куске кода #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();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2014, 19:31     Связанный список. List, не могу найти ошибку в куске кода
Еще ссылки по теме:

Связанный список C++
C++ Пожалуйста, проверьте, есть ли ошибки в приведённом куске кода.
C++ Связанный список
C++ Связанный список, найти ошибку
C++ Связанный список (ООП)

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

Или воспользуйтесь поиском по форуму:
_Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
22.12.2014, 19:31  [ТС]     Связанный список. List, не могу найти ошибку в куске кода #7
Croessmah, блин, спасибо=) под вечер тупой, как угол 179 градусов.
Yandex
Объявления
22.12.2014, 19:31     Связанный список. List, не могу найти ошибку в куске кода
Ответ Создать тему
Опции темы

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