• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Guest
  • Дата начала
G

Guest

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


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

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

DarkKnight

Дашенька, как я понимаю список формируется по-словестно (слова содерж. в строке это и есть элементы списка), я прав?
 
D

DarkKnight

Вот как то так...
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
    26,3 КБ · Просмотры: 468
D

DarkKnight

2 Дашенька: Тема еще является актуальной????
Возможно вы имеете какие-либо вопросы??? Или ее все же смело можно закрывать?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!