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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2016, 01:04   #1
Родион_Волков
Пользователь
 
Регистрация: 12.05.2016
Сообщений: 11
По умолчанию Оставить в списке числа, которые встречаются только один раз - C++

необходимо:сформировать из последовательности целых чисел линейный список и преобразовать его, оставив только те числа, которые встречают в списке только 1 раз.
никак не могу удалить повторяющиеся элементы, не знаю как это реализовать, вот все, что получилось осилить:

#include <iostream>
#include <iomanip>
#include <string.h>
#include <fstream>

using namespace std;

struct para
{
int inf;
para *ref;
};

para *create(istream& input)
{
int inf = 0;
input >> inf;

para *para_list = new para;
para_list->inf = inf;

para *p = para_list;
while (cin >> inf)
{
p->ref = new para;
p = p->ref;
p->inf = inf;
}
p->ref = NULL;
input.clear(0);

return para_list;
}


void print_list(para *para_list)
{
cout << setw (20) << "Исходный список:" << endl;

for (; para_list && para_list->inf; para_list = para_list->ref)
{
cout << setw(20) << para_list->inf << endl;
}
}

void delete_list(para *para_list)
{
para *p;
while (para_list)
{
p = para_list;
para_list = para_list->ref;
delete p;
}
}


int main()
{
setlocale(LC_ALL, "Russian");
para *para_list = create(cin);
print_list(para_list);
delete_list(para_list);
cin.clear(0);

return 0;
}
Родион_Волков вне форума Ответить с цитированием
Старый 04.12.2016, 01:11   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Оставить в списке числа, которые встречаются только один раз - C++
Если это C++, используйте list<int> из STL вместо struct para - ваш код упростится (и укоротится) раз в 5.
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 01:15   #3
Родион_Волков
Пользователь
 
Регистрация: 12.05.2016
Сообщений: 11
По умолчанию

дело не в укорочении кода, а в том что возникла проблема с тем, чтобы удалить повторяющиеся элементы.
Родион_Волков вне форума Ответить с цитированием
Старый 04.12.2016, 01:44   #4
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Родион_Волков Посмотреть сообщение
дело не в укорочении кода, а в том что возникла проблема с тем, чтобы удалить повторяющиеся элементы.
дело не в том, чтобы удалить повторяющиеся элементы, а в том, чтобы вместо вот такой бездарности писать краткий и внятный код в 5-10 строк.
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 02:28   #5
Родион_Волков
Пользователь
 
Регистрация: 12.05.2016
Сообщений: 11
По умолчанию

Задание на работу с Линейными списками, нам не разрешают пользоваться стандартными библиотеками!
Как учат так и пишем!
Родион_Волков вне форума Ответить с цитированием
Старый 04.12.2016, 03:04   #6
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Пройтись по списку, удаляя для каждого очередного значения все последующие повторы как-то так:
Код:
void delete_dup(para *last){ //где last - узел, за которым удаляются его дубликаты
  int del_inf= last->inf;
  para *p;
  while(last->ref){
    if(last->ref->inf==del_inf){//если совпали:
      p= last->ref; //удаляемый
      last->ref= p->ref; //след. за ним
      delete p;
      }
    else last= last->ref; //иначе просто на след.
    }
  }
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 04.12.2016 в 03:08.
MihalNik вне форума Ответить с цитированием
Старый 04.12.2016, 14:08   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Родион_Волков Посмотреть сообщение
Как учат так и пишем!
Плохо учат.
Можете порепетировать вместо вашей простыни вот с таким кодом, например:
Код:
#include <iostream> 
#include <list>
#include <sstream>
#include <algorithm>  
using namespace std;

int main() {
   while( true ) {
      string e;                    // ввод списка
      getline( cin, e );
      if( 0 == e.length() ) break;
      istringstream ist( e );
      int d;
      list<int> lst;
      while( ist >> d )
         lst.push_back( d );
      for( auto i = lst.begin(); i != lst.end(); ) {
         bool dbl = false;         // удаление дубликатов
         auto j = i;
         if( ++j == lst.end() ) break;
         while( ( j = find( j, lst.end(), *i ) ) != lst.end() ) {
            j = lst.erase( j );
            dbl = true;
         }
         if( dbl ) i = lst.erase( i );
         else i++;
      }
      for( auto &x: lst ) cout << x << " ";
      cout << endl;
   }
}
Если не обращать внимание на часть начального заполнения списка, то весь код удаления множественных (!) дубликатов умещается в 8 строк.
Наслаждайтесь.
(здесь точно такая же "работа с Линейными списками")

P.S. Я даже прогнал это, чтобы нагляднее (только компилировать это нужно с опциями компилятора совместимости с C++11):
Код:
$ ./uniq
1 2 1 3 1 4 1
2 3 4
1 2 3 4 2 5 6 1
3 4 5 6
3 4 5 3 3 3 3 3 6 7 3 3 3 3 8
4 5 6 7 8
1 2 3 4 1
2 3 4
1 2 3 2 4 2 5
1 3 4 5
1 2 3 4 5 4 3 2 1
5

Цитата:
Плохо учат.
olej.tsil
Создайте свою отдельную тему, и пишите о том как надо учить сколько душе угодно.

Последний раз редактировалось MihalNik; 04.12.2016 в 17:38. Причина: примечание
olej.tsil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести только те слова сообщения, которые встречаются в нем ровно один раз С++ filimoncc Помощь студентам 11 23.02.2014 19:30
Вывод на экран символов, которые встречаются только один раз. Tsunami C++ Builder 1 10.04.2011 19:00
[C++ Builder 6] Вывод на экран символов, которые встречаются только один раз. Tsunami Помощь студентам 0 07.04.2011 09:21
Из заданной символьной строки, выбрать те символы, которые встречаются в ней только один раз... Banny Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2008 06:15