struktura danych jak zrobić z next prev

0

Witam,

mam problem z strukturą danych , poleceniami next prev
:

struct ST //deklaracja struktury
{
	string nik;
	string haslo;
	string status;
	string rodzaj_konta;

	struct ST *next;
        struct ST *prev;
};
 
                ST POS1;
                POS1[0].nik = "alien0";
		POS1[0].haslo = "12340";
		POS1[1].nik = "alien1";
		POS1[1].haslo = "12341";
		POS1[2].nik = "alien2";
		POS1[2].haslo = "12342";

Chciałbym dynamicznie dodawać pola za pomocą funkcji oraz przechodzić między nimi za pomocą funkcji/znacznika next, prev. Nie wiem jak to zrobić?

np..:

while (POS1->next) {
			textBox1->AppendText(gcnew String(POS1->haslo.c_str()));
		}

albo:

while (POS1->next()) {
			textBox1->AppendText(gcnew String(POS1->haslo.c_str()));
		}
0

To co zrobiłeś to jest prototyp listy. Nie lepiej po prostu użyć std::list<ST> ?
Ale nawet jeśli, robić to tak(co jest zupełnie złym podejściem) no to dobrze by było sobie napisać metodę do tej struktury:

struct ST //deklaracja struktury
{
    string nik;
    string haslo;
    string status;
    string rodzaj_konta;
 
    struct ST *next;
    struct ST *prev;

    ST()
    {
      next = 0;
      prev = 0;
    }
    void push_back(ST * element)
    {
       next = element;
       element->prev = this;
    }
};

ST element_0;
ST element_1;
ST element_2;
element_0.nik = "alien0";
element_0.haslo = "12340";
element_1.nik = "alien1";
element_1.haslo = "12341";
element_2.nik = "alien2";
element_2.haslo = "12342";

element_0.push_back(element_1);
element_1.push_back(element_2);

Aczkolwiek do list albo napisz własną klasę która weźmie template albo używaj std::list.

0

Wtedy pętla by wyglądała tak oczywiście:

ST * node = element_0;
while (node = node->next) 
{
  textBox1->AppendText(gcnew String(node->haslo.c_str())); // tutaj masz memory leaka jeśli textBox1 sam nie usunie tego Stringa.
}
2

@Krwawy Kaczor, czy wiesz może co oznaczają literki gc w słowie kluczowym gcnew ?

for(ST * node = element_0;node;node=node->next)  textBox1->AppendText(gcnew String(node->haslo.c_str())); // nie ma tu żadnego memory leaka
1

Jeśli piszesz w C++/CLI to nie używaj std::string tylko dotnetowego System::String:

ref struct ST //deklaracja struktury
{
    String ^nik;
    String ^haslo;
    String ^status;
    String ^rodzaj_konta;
 
    ref struct ST ^next;
    ref struct ST ^prev;
};

Takich Stringów możesz używać w kontrolkach i funkcjach np. w AppendText() bez konwersji.

0

Ogólnie C++/CLI używam tymczasowo do zobrazowania natomiast docelowo będzie to w trybie tekstowym działać :
aby poprawnie działał kod trzeba dodać -> & do:

element_0.push_back(element_1);
element_1.push_back(element_2);
element_0.push_back(&element_1);
element_1.push_back(&element_2);

Możecie mi wyjaśnić co to dokładnie robi element_1.push_back(element_2);

oraz dlaczego nie działa while (node = node->prev)

0

Ad 1. Ponieważ element_1 oraz element_2 są typu ST, zaś metoda push_back() wymaga parametru typu ST*
Ad 2. Ponieważ nie masz poprawnej inicjalizacji składowej prev

0

Ogólnie C++/CLI używam tymczasowo do zobrazowania natomiast docelowo będzie to w trybie tekstowym działać

W trybie tekstowym też może być C++/CLI, ale dziwi mnie takie podejście - skoro ma być konsolowo to zostaw to CLI i rób od razu konsolowo w natywnym C++. Bo tak to ocierasz się o konieczność rozwiązywania dodatkowych problemów zupełnie na darmo.

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