Как вывести из мультиструктуры (1 уровень - страны, 2 уровень - спортсмены)тех спортсменов, чьи имена и виды спорта совпадают, но у них страны разные?

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2023

У меня есть мультиструктура:

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;
        }
    }
}

Ответы

▲ 0Принят

Если у вас 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;
}