Lista w liście

0

Potrzebuję pomocy. Muszę stworzyć listę w liście. W jednej będą zawarte województwa, a w drugiej miasta. Struktura powinna również zawierać program testujący, który wyświetla menu z możliwością wyboru:
pełen wykaz województw i miast,
dodanie nowego województwa
dodanie nowego miasta
Nigdy nie tworzyłem czegoś nawet podobnego. Mógłbym prosić o jakiejś wskazówki lub cokolwiek na czym mógłbym się oprzeć w tworzeniu?

0

Rzeczywiście lista, czy wystarczy tablica dwuwymiarowa?

1
  1. lista w liscie. Czyli masz liste pelna listy obiektow
  2. W jednej będą zawarte województwa, a w drugiej miasta to jak ma to wygladac? chodzi mi o zdanie Muszę stworzyć listę w liście Masz dwa typy Wojewodztwo a drugi typ to Miasto. W uproszczeniu mozna zalozyc
std::list<Wojewodztwo> wojewodztwa
std::list<Miasto> Miasta

Wiec watpie bys mial std::list<std::list<tutajjakisobiekt>> jakasnazwa
Bardziej chodzilo o cos takiego ze obiekt Wojewodztwo posiada liste Miast

class Wojewodztwo {
  std::list<Miasto> miasta;
};
  1. Struktura powinna również zawierać program testujący jak struktura ma zawierac program testujacy? WTF? Mozesz miec strukture ktora testuje powyzszy kod, ale na pewno nie powinna nalezec do tej struktury co masz wyzej.
    Inaczej piszac, masz napisac po prostu test czyli
class WojewodztwoTestCase {};

i tutaj odpowiednio budujesz wojewodztwa z miastem i sprawdzasz czy odpowiednio zbudowany obiekt posiada to co powinno

pełen wykaz województw i miast,
dodanie nowego województwa
dodanie nowego miasta

to masz 3 funkcje.

  1. Show na klasie wojewodztwo
  2. AddWojewodztwo. Tutaj musisz stworzyc osobna klase ktora bedzie managerem dla wojewodztwa
  3. AddMiasto. Imo tak samo jak na gorze.

wiec sumujac (i juz nie bede pisal po polsku, tylko po angielsku jezeli chodzi o kod)

-- To jest pierwszy wariant, zapewne sam bym tak zrobil. Ktory nie jest zgodny z poleceniem, ale polecenie troche nie ma sensu

potrzebujesz 8 klas

  1. Province
  2. City
  3. ProvinceManager
  4. CityManager
  5. ApplicationManager
  6. ProvinceManagerTest
  7. CityManagerTest
  8. ApplicationManager

ProvinceManager posiada liste wojewodztw (w sumie widzialbym tutaj bardziej std::map no ale, zadanie ma byc na liscie wiec... std::list...) oraz posiada metody ktore robia CRUD na tej liscie
CityManager posiada Province oraz std::list<City>
ApplicationManager posiada ProvinceManager oraz CityManager. Mozesz robic na tym co chcesz juz.

Dzieki temu masz ladnie wszystko odseparowane, przeszukiwanie danych nie jest zadnym problemem. Masz model oddzielony od prezentacji. Dodanie bazy danych czy czegokolwiek jest latwiejsze niz w drugim zaprezentowanym sposobie

-- Drugi wariant.

Skoro ma byc lista w liscie to mozesz zrobic na zasadzie (czyli zapewne o co chodzilo nauczycielowi...)

  1. ApplicationManager
  2. City
  3. Province

ApplicationManager posiada std::list<Province>
Province posiada std::list<City>

2

Jeżeli nie chcesz korzystać z std::list (bo np. nie możesz):

struct Miasto {
    std::string city_name;
    Miasto *next;
};

struct Wojewodztwo
{
    std::string province_name;
    Miasto *pMiasto;
    Wojewodztwo *next;
};

void add_province(Wojewodztwo *&head, const std::string province_name)
{
    if (!head) {
        head = new Wojewodztwo {province_name, nullptr, nullptr};
        return;
    }
    auto p = head;
    while (p) {
        if (p->province_name == province_name)
            return;
        p = p->next;
    }
    head = new Wojewodztwo {province_name, nullptr, head};

}

void add_city_to_province(Wojewodztwo *province_head, Miasto *&city_head, const std::string city_name, const std::string province_name)
{
    if (!province_head)
        return;
    while (province_head) {
        if (province_head->province_name == province_name) {
            if (!province_head->pMiasto) {
                city_head = new Miasto {city_name, nullptr};
                province_head->pMiasto = city_head;
                return;
            }
            else {
                auto _city_head = city_head;
                while (_city_head) {
                    if (_city_head->city_name == city_name)
                        return;
                    _city_head = _city_head->next;
                }
                city_head = new Miasto {city_name, city_head};
                province_head->pMiasto = city_head;
            }
        }
        province_head = province_head->next;
    }
}

void print(Wojewodztwo *head)
{
    int i = 1;
    while (head) {
        std::cout << "\n\nWojewodztwo " << i++ << ": " << head->province_name << std::endl;
        std::cout << "Miasta nalezace: ";
        if (!head->pMiasto)
            std::cout << "brak";
        while (head->pMiasto) {
            std::cout << head->pMiasto->city_name << " ";
            head->pMiasto = head->pMiasto->next;
        }
        head = head->next;
    }
}

int main()
{
    Wojewodztwo *wojewodztwoptr = nullptr;
    Miasto *miastoptr = nullptr;
    add_province(wojewodztwoptr, "Slaskie");
    add_province(wojewodztwoptr, "Wielkopolskie");
    add_province(wojewodztwoptr, "Podlaskie");
    add_province(wojewodztwoptr, "Mazowieckie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Katowice", "doesnt exist");
    add_city_to_province(wojewodztwoptr, miastoptr, "Poznan", "Wielkopolskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Miasto", "Wielkopolskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Gniezno", "Wielkopolskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Miasto", "Slaskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Gliwice", "Slaskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Gliwice", "Slaskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Katowice", "Slaskie");
    add_city_to_province(wojewodztwoptr, miastoptr, "Warszawa", "Mazowieckie");
    print(wojewodztwoptr);
}

Output:
output
Nie wiem czy nie ma błędów. Po skończeniu korzystania z nich, należałoby je jeszcze usunąć z pamięci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1