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

АТД список. Замена элементов в списке - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:03     АТД список. Замена элементов в списке #1
Здравствуйте.

Нужна ваша помощь!

Подскажите пожалуйста как заменить элементы в списке которые стоят на четных позициях?

Суть примера такова!!

Пользователь вводит символ 'Х' и если есть такой символ на четных позициях в списке, то его заменить на "Y".

Например:

A х C х x меняем x->y получилось A y C y x. Видите "х" поменялся на "y" на четной позиция.

Вот то что у меня пока получилось:
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
52
#include "iostream"
#include "list"
#include <algorithm>
 
using std::cout;
using std::cin;
using std::list;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
    list<char> lst;
 
    char num;
    char ch, ch1;
    int n;
 
    cout << "Введите длину списка: ";
    cin >> n;
    cout << '\n';
 
    cout << "Введите элементы списка: ";
    for (int i = 0; i < n; i++)
    {
        cin >> num;
        lst.push_back(num);
    }
    cout << '\n';
 
    cout << "Введите символ который хотите заменить: ";
    cin >> ch;
    cout << '\n';
 
    cout << "Введите символ на который хотите заменить символ " << "'" << ch << "': " ;
    cin >> ch1;
    cout << '\n';
 
    list<char>::iterator iter = find(lst.begin(), lst.end(), ch); // ищем наш символ
 
    //вот тут нужно осуществить замену.
 
    cout << "Наш список: ";
 
    for(list<char>::iterator iter1 = lst.begin(); iter1 != lst.end(); iter1++)
    {
        cout << *iter1 << " ";
    }
    system("pause >> NULL");
    return 0;
}
подскажите хотя бы функцию или алгоритм! но желательно примерчик спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:14     АТД список. Замена элементов в списке #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
#include <iostream>
#include <list>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
int main( )
{
    srand( time(0) );
 
    list<char> lst;
    int lng;
 
    cout << "List length: ";
    cin >> lng;
 
    for( int i = 0; i < lng; i++ )
       lst.push_back( rand() % ('z' - 'a') + 'a' );
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++ )
       cout << *it << ' ';
 
    char ch;
    cout << "\nEnter a character: ";
    cin >> ch;
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++, it++ )
    {
       if( *it == ch )
          *it = '#';
    }
 
    for( list<char>::iterator it = lst.begin(); it != lst.end(); it++ )
       cout << *it << ' ';
 
    return 0;
}
Следите за тем, с чего у вас нумерация. 0 считается чётным, 1 - нечётным. В моём примере нумерация с нуля.

Добавлено через 1 минуту
Отлаживайте на длинах больше 50, чтобы видеть эффект
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:25  [ТС]     АТД список. Замена элементов в списке #3
Спасибо большое! все замечательно работает!!! спасибо огромное!!

Добавлено через 6 минут
Цитата Сообщение от talis Посмотреть сообщение
Следите за тем, с чего у вас нумерация. 0 считается чётным, 1 - нечётным. В моём примере нумерация с нуля.
как сделать отчет с 1! что то вообще не думается!))))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:29     АТД список. Замена элементов в списке #4
Infinity3000, объявите итератор до цикла и тут же инкрементируйте один раз, потом входите в цикл...
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:34  [ТС]     АТД список. Замена элементов в списке #5
Не хочет оно так

C++
1
2
list<char>::iterator iter1;
    iter1++;
я уже пытался!!))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:36     АТД список. Замена элементов в списке #6
C++
1
2
3
4
5
6
7
8
    list<char>::iterator it = lst.begin()
    it++;
 
    for( ; it != lst.end(); it++, it++ )
    {
       if( *it == ch )
          *it = '#';
    }
Так тоже не хочет?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:46  [ТС]     АТД список. Замена элементов в списке #7
не хотит!! компилится но когда нужно выводить список после замены вылетает!!!
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:49     АТД список. Замена элементов в списке #8
Infinity3000, какая среда? В mingw всё прекрасно.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 00:51  [ТС]     АТД список. Замена элементов в списке #9
Visual C++ 2010! та и по логике все должно работать, но увы!
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:54     АТД список. Замена элементов в списке #10
Infinity3000, рискну предположить, что в Visual C++ 2010 при попытке выполнить it++, когда it стоит на конце списка, приводит к переходу на нулевой или неопределённый адрес, что и вызывает ошибку. Однако, это только предположение.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 01:42  [ТС]     АТД список. Замена элементов в списке #11
вот так

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++ )
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
начинается замена со второго элемента и заменяет все подряд вхождения даного символа где бы он не стоял что говорит что инкремент до цикла срабатывает, но если так

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++ )
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
то он не хочет заменять символы только на четных позициях, вылетает не понятная ошибка

Добавлено через 13 минут
вот так коректно работает если в списке не четное количество элементов

C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++)
    {
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     }
Ну если четное то вылетает ошибка!! И я догадываюсь почему!

Когда циклом считываешь предпоследний элемент он пытается считать следующий через один, а там не чего нет!

Как можно решить эту проблему??

Добавлено через 26 минут
talis, а для твоего первого варианта если количество элементов в списке не четное то вылетает такая же ошибка!!

Тут мне кажется нужно все таки использовать

C++
1
2
3
4
5
6
7
8
9
10
11
12
list<char>::iterator iter1 = lst.begin();
    iter1++;
        
    for(;  iter1 != lst.end(); iter1++, iter1++)
    {
    
       if( *iter1  == ch )
       {
          *iter1  = ch1;
       }
     
     }
только если количество элементов в списке не четное, то просматриваем весь список, а если четное то до предпоследнего!!

Вопрос

Каким способом можно просмотреть список до предпоследнего элемента??
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
28.09.2011, 05:40     АТД список. Замена элементов в списке #12
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Пользователь вводит символ 'Х' и если есть такой символ на четных позициях в списке, то его заменить на "Y".
Типа этого.
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
#include <iostream>
#include <list>
using namespace std;
 
int  main(void) {   
   list<char>   lst;
   for(const char* s = "X AJAX-XOR, XXX"; *s; lst.push_back(*s++));
 
   char ch = 'X', cnew = 'W';
   //cin >> ch >> cnew;
 
   size_t  i = 1u;
   for(list<char>::iterator iter = lst.begin(); iter != lst.end(); *iter++, i++) {
           if( *iter == ch && !(i % 2u)) 
                *iter = cnew;
   }
 
   // выводим результат
   for(; ! lst.empty(); lst.pop_front())
        cout << lst.front();
   cout.put('\n');
    
   cin.get();
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 11:10     АТД список. Замена элементов в списке
Еще ссылки по теме:

C++ Атд список. Удалить одинаковые элементы.
АТД список. Переставить местами элементы списка C++
C++ [C++] Реализуйте АТД “Список” для любого типа данных

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

Или воспользуйтесь поиском по форуму:
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
28.09.2011, 11:10  [ТС]     АТД список. Замена элементов в списке #13
xAtom, Спасибо то что надо!!!
Yandex
Объявления
28.09.2011, 11:10     АТД список. Замена элементов в списке
Ответ Создать тему
Опции темы

Текущее время: 13:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru