/*
Реализовать односвязный список, в котором в элементах может содержаться строка любой длины.
И обеспечить функцию создания подсписка, содержащего элементы основного списка, содержащие введенную подстроку.("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;
}