Линейные списки

Уровень сложности:

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

Программа должна удалять из списка все пары слов, которые являются обратными друг другу, например,  abc и cba.

К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.

E-mail : admin@cppstudio.com

 

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 13.09.2012
Поделиться:

Комментарии

  1. Arthur

    #include<iostream>
    #include<string>
    #include<fstream>
    #include <Windows.h>
    #include<list>
    #include<iterator>
    using namespace std;
    
    const int MWORD = 30;           //макс длина слова
    
    int main()
    {
        setlocale(LC_CTYPE, "rus");
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    
        list<string> li;
        char menu;
    
        while(true)
        {
         cin.sync();
         cout<<"\nВыберите действие:"
             <<"\n1 - ввод текста с клавиатуры"
             <<"\n2 - ввод текста с файла"
             <<"\n3 - показать список(начиная с первого звена)"
             <<"\n4 - удалить из списка все пары слов, которые являются обратными друг другу"
             <<"\n5 - очистить список"
             <<"\n0 - выход"
             <<"\nВаш выбор: ";
            cin>>menu;
        switch(menu)
        {
        case '1':
            {
                cin.sync();
                string text;
                char word[MWORD];
    
                cout<<"\nВведите текст:\n";
                getline(cin,text);
    
                for(int x = 0; x<text.length(); x++)
                {
                    int y = 0;
                    while ( isalpha((unsigned char)text[x]))
                         word[y++] = text[x++];
                    word[y] = '';
    
                    if(y!=0)
                        li.push_back(word);
                }
                break;
            }
        case '2':
            {
                cin.sync();
                char adres[MWORD];
                char ch;
                char word[MWORD];
    
                cout<<"\nВведите адрес файла: ";
                cin>>adres;
                ifstream fail(adres);
                if(fail)
                  while(fail)
                  {
                   fail.get(ch);
                   int y = 0;
                    for ( ;isalpha((unsigned char)ch) && fail;  fail.get(ch))
                        word[y++] = ch;
                    word[y] = '';
    
                    if(y)
                        li.push_back(word);
                  }
                else
                    cout<<"\nНевозможно открыть файл!\n";
                break;
            }
       case '3':
             if(!li.empty())
               {
                 cout<<"\nCписок начиная с первого звена: "<<endl;
                 copy(li.begin(), li.end(), ostream_iterator<string>(cout,"\n"));
               }
               else
                cout<<"\nСписок пуст\n"<<endl;
               break;
    
       case '4':
             if(!li.empty())
                {
                list<string>::iterator it;
                list<string>::iterator ih;
    
                for(it = li.begin(); it != li.end();it++ )
                   for(++(ih = it); ih != li.end(); ih++)
                     {
                       string temp = *ih;
                       if(*it ==  temp.assign( temp.rbegin(),  temp.rend()))
                        {
                           li.erase(it);
                           li.erase(ih);
                           break;
                        }
                     }
                cout<<"\nИз списка удалены все пары слов, которые являются обратными друг другу"<<endl;
                }
             else
               cout<<"\nСписок пуст\n"<<endl;
                break;
    
        case '5':
            {
                li.clear();
                cout<<"\nСписок очищен\n"<<endl;
                break;
            }
        case '0': return 0;
        default: cout<<"\nНеизвестное действие\n";
         }
        }
        return 0;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.