Задача: Односвязный список, создание доп. списка по усл, Std::string

Тема в разделе "C/C++/C#", создана пользователем -, 9 дек 2010.

  1. Гость

    Вот задание:Реализовать односвязный список, в котором в элементах может содержаться строка любой длины. И обеспечить функцию создания подсписка, содержащего элементы основного списка, содержащие введенную подстроку.("abc"->"abd"->"sdf"->"sewf"->"dsfab"->"wert"->0 + "ab" => "abc"->"abd"->"dsfab"->0)


    Пожалуйста, напишите программу....я в списках вообще не разбираюсь..

    очень прошу.....помогите
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Дашенька, как я понимаю список формируется по-словестно (слова содерж. в строке это и есть элементы списка), я прав?
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот как то так...
    Код (C++):
    /*
    Реализовать односвязный список, в котором в элементах может содержаться строка любой длины.
    И обеспечить функцию создания подсписка, содержащего элементы основного списка, содержащие введенную подстроку.("abc"->"abd"->"sdf"->"sewf"->"dsfab"->"wert"->0 + "ab" => "abc"->"abd"->"dsfab"->0)
    */

    /*
    codeby.net
    Autor: DarkKnight125 (Denis Goncharov)
    */

    #include <iostream>
    #include <strstream> //Для строкового потока strstream
    #include <string> //Для std::string

    using namespace std;

    //Класс список
    class TSpisok
    {
    private:
    std::string Word; //Слово //Не очень люблю данный класс, но из задания видно что исользовать нужно именно его
    TSpisok *Next; //Указатель на следующее слова или на NULL (если следущего нет)

    TSpisok* First; //Адрес начала списка
    TSpisok* Current; //Адрес текущего элемента
    int Count; //Кол-во элементов в списке
    public:
    //Конструктор по умолчанию
    TSpisok()
    {
    First = NULL; //Уставим начало в NULL
    Current = NULL; // Текущий элемент в NULL
    Count = 0; //Кол-во элементов 0
    }
    void Add(std::string vWord); //Функция добавления в список

    //Функция получения слова
    std::string GetWord(void)
    {
    return Word;
    }

    //Функция перехода на след. позицию списка
    TSpisok* NextPosition(void)
    {
    return Next;
    }

    //Функция получения указателя на начало списка
    TSpisok* GetFirst(void)
    {
    return First;
    }
    };

    //Функция добавления элемента в список
    void TSpisok::Add(std::string vWord)
    {
    //Проверку на то что нам не хватит памяти для выделения делать не будем
    TSpisok *Temp = new TSpisok; //Создадим новый элемент
    Temp->Word = vWord;
    Temp->Next = NULL;
    if (!First) //Если First = NULL то значит список еще пуст
    {
    First = Temp; //Присвоим значение Началу списка
    }
    else //Если же список не пуст
    {
    Current->Next = Temp;
    }
    Current = Temp;
    Count++;
    }

    void main(void)
    {
    setlocale(LC_ALL,"Russian");
    char buffer[15000]; //Буфер для введеной строки, я думаю 15000 более чем достаточно
    char SubStr[128]; //Переменная для подстроки

    TSpisok A; //Основной список
    TSpisok Result; //Результирующий список (там где подстрока ищится)
    TSpisok *tmp; //Указатель на список

    //Ввод иходной строки
    cout<<"Введите исходную строку : ";
    cin.getline(buffer,1023);

    //Так как будем читать пословестно, то разумно использовать строковый поток, вот его то мы как раз и заведем
    strstream Str(buffer,strlen(buffer)); //Строковый поток из переменной buffer, длина потока = кол-ву символов в buffer
    std::string S; //Буферная переменная std::string как раз в нее мы будем получать не более 1 слова, пробелы будут использоваться, как разделители
    while (Str>> S) //Пока в строковом потоке есть что-нибудь то получаем слово S
    {
    A.Add(S); //И добавляем его в основной список
    }
    //Вывод на экран основного списка
    cout<< "Список А: " << endl;
    tmp = A.GetFirst(); //Установим указатель на начало списка
    while(tmp) //Пока указатель не равен NULL
    {
    cout << tmp->GetWord() << " -> ";
    tmp = tmp->NextPosition(); //Перейдем к след. элементу
    }
    //Эффектно завершим вывод
    cout<< "[NULL]" << endl << endl;

    //Теперь перейдем к подстрокам и списку Result
    cout << "Введите субстроку для поиска : ";
    cin.getline(SubStr,127);

    //Обойдем основной список еще раз и поищим субстроки
    tmp = A.GetFirst(); //Установим указатель на начало списка
    while(tmp) //Пока указатель не равен NULL
    {
    if (tmp->GetWord().find(SubStr) != string::npos)
    {
    Result.Add(tmp->GetWord());
    }
    tmp = tmp->NextPosition(); //Перейдем к след. элементу
    }

    //Вывод на экран дополнительного списка
    cout<< "Список Result: " << endl;
    tmp = Result.GetFirst(); //Установим указатель на начало списка
    while(tmp) //Пока указатель не равен NULL
    {
    cout << tmp->GetWord() << " -> ";
    tmp = tmp->NextPosition(); //Перейдем к след. элементу
    }
    cout<< "[NULL]" << endl << endl;
    }
     

    Вложения:

    • spisokstr.jpg
      spisokstr.jpg
      Размер файла:
      45,7 КБ
      Просмотров:
      8
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2 Дашенька: Тема еще является актуальной????
    Возможно вы имеете какие-либо вопросы??? Или ее все же смело можно закрывать?
     
Загрузка...
Похожие Темы - Задача Односвязный список
  1. Янчик
    Ответов:
    0
    Просмотров:
    481
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    781
  3. elzim
    Ответов:
    0
    Просмотров:
    929
  4. ShaoKahn
    Ответов:
    1
    Просмотров:
    1.117
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.105

Поделиться этой страницей