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

Исключить повторяющиеся элементы из списка - C++

Восстановить пароль Регистрация
 
Wladius
12 / 7 / 2
Регистрация: 06.01.2013
Сообщений: 127
27.05.2013, 13:26     Исключить повторяющиеся элементы из списка #1
Не получается и всё тут! Удалять элементы умею из любой части списка, но вот именно, чтобы из списка с элементами типа int (например)
1 2 2 2 2 1 5 6 3 8 1 1
получить
1 2 5 6 3 8
не могу, подскажите каким образом это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
27.05.2013, 13:42     Исключить повторяющиеся элементы из списка #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <list>
 
int main()
{
    std::list<int> l {1, 2, 2, 2, 2, 1, 5, 6, 3, 8, 1, 1};
    
    for (const int i : l) std::cout<<i<<" ";
    std::cout<<'\n';
    
    l.sort();
    l.unique();
    
    for (const int i : l) std::cout<<i<<" ";
 
    std::cout<<'\n';    
    return 0;
}
Wladius
12 / 7 / 2
Регистрация: 06.01.2013
Сообщений: 127
27.05.2013, 13:51  [ТС]     Исключить повторяющиеся элементы из списка #3
Объясните пожалуйста, что такое sort(); unique();
И можно ли иначе это сделать?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
27.05.2013, 13:53     Исключить повторяющиеся элементы из списка #4
sort говорит само за себя, unique - удаляет одинаковые подряд идущие элементы.
Wladius
12 / 7 / 2
Регистрация: 06.01.2013
Сообщений: 127
27.05.2013, 14:04  [ТС]     Исключить повторяющиеся элементы из списка #5
Я задаю список таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
struct spis1
{   int obj;
    spis1 *next;
 
    spis1(int i, spis1 *n=0){
        obj=i;
        next=n;
        }
};
spis1 *first1;
spis1 *last1;
Как мне в таком случае использовать sort(); unique(); ?

Добавлено через 9 минут
Не подразумевает ли это использование классов? Т.к. пишет "выражение должно иметь тип класса", можно ли реализовать без классов?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
27.05.2013, 14:34     Исключить повторяющиеся элементы из списка #6
Надо было сразу сказать что вы пишете самописный список. Тогда вам надо самому реализовать вышеупомянутые функции. Я же использовал list из STL, это уже готовый, встроенный в C++ шаблонный класс с множеством полезных функций, которых самому писать уже не нужно.
Wladius
12 / 7 / 2
Регистрация: 06.01.2013
Сообщений: 127
27.05.2013, 15:25  [ТС]     Исключить повторяющиеся элементы из списка #7
up вопрос еще актуален.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2013, 18:05     Исключить повторяющиеся элементы из списка
Еще ссылки по теме:

Исключить из массива все повторяющиеся элементы C++

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

Или воспользуйтесь поиском по форуму:
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
27.05.2013, 18:05     Исключить повторяющиеся элементы из списка #8
Односвязный список это не вариант вообще. Удалять жутко неудобно, каждый раз приходится прогонять с головы. Сделайте двусвязный

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct spis1
{   int obj;
    spis1 *next;
    spis1 *prev;
 
    spis1(int i){
        obj=i;
        next=NULL;
        prev=NULL;
    }
};
spis1 *first;
spis1 *last;
Создаем список
C++
1
2
3
4
5
6
first = new spis1;
last = first;
first->next = NULL;
first->prev = NULL;
//Добавляем элемент
push(5);
Добавление в конец списка
C++
1
2
3
4
5
6
7
8
void push(int x)
{
    last->next = new spis1;
    last->next->prev = last;
    last = last->next;
    last->next = NULL;
    last->obj = x;
}
Удаление элемента по указателю на него
C++
1
2
3
4
5
6
7
void DeleteEl(spis1 *ptr)
{
    //связываем предыдущий и последующий
    ptr->prev->next = ptr->next;
    ptr->next->prev = ptr->prev;
    detete ptr;
}
Удаление повторов (протестировать надо )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Delete()
{
    spis1 *i = first;
    spis1 *j = first->next;
    while(i != last)
    {
        while(j != last)
        {
             j = j->next;
             if (i->obj == j->prev->obj) 
                 DeleteEl(j->prev);
        }
        i = i->next;
        j = i->next;
    }
}
Yandex
Объявления
27.05.2013, 18:05     Исключить повторяющиеся элементы из списка
Ответ Создать тему
Опции темы

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