Как вывести из мультиструктуры (1 уровень - страны, 2 уровень - спортсмены)тех спортсменов, чьи имена и виды спорта совпадают, но у них страны разные?
У меня есть мультиструктура:
typedef struct Sportsman
{
string surname;
string category;
string type;
Sportsman * next;
}TSportsman;
typedef struct Country
{
string name;
string currency;
Country * next;
Sportsman * sublevel;
}TCountry;
Я записываю страны и спортсменов этих стран через функцию, после чего обрабатываю эту структуру. Требуется написать функцию, которая выводит спортсменов с одинаковым фамилиями и видами спорта, но они должны быть из разных стран. Я плохо понимаю, как это можно сделать, но попытался написать функцию. Тут, я уверен, очень много ошибок. Помогите пожалуйста решить!
void showSameSurname(TCountry * &Start)
{
TCountry * wpC=Start;
TSportsman * wpS=NULL;
string tempSurname, tempType;
while(wpC!=NULL)
{
wpS=wpC->sublevel;
while(wpS!=NULL)
{
tempSurname=wpS->surname;
tempType=wpS->type;
wpC=wpC->next;
while(wpC!=0)
{
if(wpC->sublevel->surname==tempSurname && wpC->sublevel->type==tempType){
cout << tempSurname << ": " << tempType << endl;
cout << wpC->sublevel->surname << ": " << wpC->sublevel->type << endl << endl;
wpC->sublevel->next;
}
else wpC->sublevel->next;
}
if(wpC->next!=NULL)wpC=wpC->next;
else break;
wpS=wpS->next;
}
}
}
Ответы (1 шт):
Если у вас C++ то используйте ООП и STL. Отделите рутинную работу со списками от логики своей программы. За вас уже написаны списки, очереди, динамические массивы, словари и т.д. - используйте их!
struct Sportsman
{
string surname;
string category;
string type;
};
struct Country
{
string name;
string currency;
std::vector<Sportsman> sportsmans;
};
std::vector<Country> countries;
Но это если по-нормальному. А вашем коде написано что-то странное.
Вы просто запутались в указателях. Код прохода по спискам у вас занимает 90% , а на логику - оставшиеся 10.
Прежде всего - упростите себе жизнь, напишите вспомогательную функцию поиска имени в списке, чтобы не путаться в указателях. Если использовать ООП - то это будет метод структуры Country, в котором можно просто вызвать библиотечную функцию поиска.
bool checkSurname(Sportsman *sublevel, const string& surname) {}
// либо
Sportsman* findSurname(Sportsman *sublevel, const string& surname) {}
Далее алгоритм такой:
- цикл по странам C1
- цикл по спортсменам в этой стране Sp1
- цикл по странам, начиная со следующей относительно первого цикла C2
- поиск спортсмена у которого имя совпадает с именем из цикла Sp1
Т.е. если писать циклами, то будет 4 вложенных цикла. Если сделаете отдельную функцию - то 3 цикла и вызов функции (один цикл вы выносите в функцию поиска имени).
Ну и код сводится к:
TCountry *C1=Start;
while(C1)
{
Sp1 = C1->sublevel;
while(Sp1)
{
C2 = C1->next;
while(C2)
{
if( checkSurname( C2->sublevel, Sp1->surname) )
cout << Sp1->surname;
C2 = C2->next;
}
Sp1 = Sp1->next;
}
C1 = C1->next;
}