@BelDm

Как найти элемент (класс как тип) в обобщенном односвязном списке (при этом сохранив обобщенность метода поиска)?

Имеется обобщенный односвязный список, организованный по принципу наличия head (первый элемент) и элемента, указывающего на nullptr (последний элемент), организованы методы добавления элемента в начало, конец списка, метод сортировки, методы записи и чтения в/из текстовых и бинарных файлов. Загвоздка с методом поиска элемента списка. Класс List (список) - обобщенный, если с простыми типами проблем нет, то с типом Student (имеет поля: группа, фамилия и имя, возраст, оценки) возникают проблемы. Хотелось бы организовать поиск в консольном окне по фрагменту группы и/или фамилии...пробовал через string для Student с перегрузкой "==", но тогда ломаются стандартные типы int, double. Если переменная data в методе поиска имеет тип Type (обобщенный), то в поиске приходится вводить всего студента полностью со всеми полями, что абсурдно, хотелось бы одну строчку. Операторы ">>" и "<<" для Student также уже перегружены. Логику прилагаю без лишних методов.
P.S. Вся боль в cin >> data для типа Student. Не красиво вводить весь объект сложного типа полностью, а для строчки реализацию не придумал.
Спасибо!

//Класс "Студент" с требуемыми свойствами: группа, имя, возраст, оценки:
class Student
{
public:
char group[10];
char name[20];
int age;
int score[3];
//Конструктор:
Student() {}
Student(char *group, char *name, int age, int *score = nullptr)
{
strcpy_s(this->group, group);
strcpy_s(this->name, name);
this->age = age;

if (score != nullptr)
{
for (int i = 0; i < 3; i++)
{
this->score[i] = score[i];
}
}
else
{
for (int i = 0; i < 3; i++)
{
this->score[i] = 0;
}
}
}
};

//Перегрузка оператора "<<" для объекта класса "Student":
ostream & operator << (ostream &os, Student &st)
{
os << "Group: " << st.group << endl;
os << "Name: " << st.name << endl;
os << "Age: " << st.age << endl;
for (auto it : st.score) { os << "Score: " << it << endl; }
return os;
}

//Перегрузка оператора ">>" для объекта класса "Student":
istream & operator >> (istream &is, Student &st)
{
string s1, s2;
is >> st.group;
is >> s1 >> s2;
s1 = s1 + " " + s2;
strcpy_s(st.name, s1.c_str());
is >> st.age >> st.score[0] >> st.score[1] >> st.score[2];
return is;
}

//Перегрузка оператора "==" для объектов класса "Student":
bool operator == (Student &st1, Student &st2)
{
string str1_name, str1_group, str2_name, str2_group;
str1_group = st1.group;
str1_name = st1.name;
str2_group = st2.group;
str2_name = st2.name;
if (str1_group.find(str2_group, 0) != -1 || str1_name.find(str2_name, 0) != -1)
{
return true;
}
else
{
return false;
}
}

//Обобщенный класс "Список" (организует односвязный список для хранения элементов заданного типа):
template class List
{
public:

//Обобщенный класс "Запись" (хранит данные заданного типа):
template class Record
{
public:
Type data;
Record *ptr_next = nullptr;

//Конструктор:
Record() : data(Type()) {}
};

Record *head;
ifstream infile, in_bin_file;
ofstream outfile, out_bin_file;

//Конструктор:
List() : head(nullptr) {}

//Метод нахождения элемента списка:
void search()
{
Record *current;
Type data;
char exit = 0;
int sum = 0;

if (head == nullptr)
{
cout << "The list is empty!!!" << endl;
}
else
{
sort();
while (exit != 'n')
{
cout << "Enter a parameter to search for: "; cin >> data;
current = head;
for (current; current != nullptr; current = current->ptr_next)
{
if (current->data == data)
{
cout << current->data;
sum++;
}
}

if (sum == 0) { cout << "Nothing found!!!" << endl; }
sum = 0;
cout << "Continue? (y/n)" << endl;
exit = _getch();
}
}
}
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы