Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
mohl by mi někdo poradit jak vytvořit dvousměrný spojový seznam z pole a jak ho vypsat (od začátku a od konce).
Kdyby někdo měl ještě dneska čas (musím to odevzdat), tak bych byla moc ráda, nikde nic pořádného nemůžu najít.
Děkuji.
Offline
std::list<T> je obousměrný spojový seznam, který je součástí standardní knihovny jazyka. Z pole -- což je ve standardní knihovně std::vector<T> -- ho vytvoříš třeba takto:
// Predp., ze T je nejaky konkretni typ (napr. "int" ci "void (*)(void (*)())" či něco jiného). std::vector<T> v = ...; // Nejaka data. std::list<T> l(v.begin(), v.end()); // Vytvorim spojak z pole. std::copy(l.begin(), l.end(), std::ostream_iterator<T>(std::cout)); // Vypisu spojak od zacatku do konce.
Ale hádám, že smyslem úkolu je naučit vás implementovat to ručně -- to ovšem nijak nezávisí na jazyku (aspoň z 90%) ne. Uděláš to například tak, že si uděláš prázdný seznam, pak budeš iterovat přes všechny prvky v pole a v každé iteraci na konec spojáku přidáš nový prvek -- což by mohlo jít třeba takto:
Uzel* novyUzel = new Uzel; novyUzel->data = pole[i]; novyUzel->next = 0; novyUzel->prev = konecSpojaku; konecSpojaku->next = novyUzel; konecSpojaku = novyUzel;
Na vypsání stačí si prostě udělat ukazatel na aktuální uzel, nastavit ho na začátek seznamu, cyklit tak dlouho, dokud nebude nullový, vypisuje při tom jeho obsah, a na závěr iterace udělat klasické aktualni = aktualni->next;.
Jinak stejně jako s jakýmkoliv jiným úkolem, bylo by hezké, kdybys napsala, co jsi už zkusila a čemu nerozumíš -- pak můžeš dostat konkrétnější odpověď než takovouhle obecnou.
Offline
Takhle mi to staci. Dík.
Jen ještě jak vypsat ten seznam od konce. Musím najít poslední prvek a od něho jít zpátky, jak mam pak zjistit, že jsem na začátku?
Offline
gladiator01 napsal(a):
Takhle mi to staci. Dík.
Jen ještě jak vypsat ten seznam od konce. Musím najít poslední prvek a od něho jít zpátky, jak mam pak zjistit, že jsem na začátku?
Nejsnažší budeš mít, když si budeš držet ukazatel na začátek i na konec spojáku současně (v mym příkladu je "konecSpojaku" ukazatel na poslední uzel). No a že seš na začátku zjistíš stejně, jako zjistíš že jsi na konci -- ten ukazatel je obousměrný, takže každý uzel má ukazatel na předcházející uzel -- no a když není žádný předcházející, tak ten ukazatel bude nullový.
Offline
Stránky: 1