Matematické Fórum

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

#1 14. 10. 2009 18:30

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

obousměrný spojový seznam v c++

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.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#2 14. 10. 2009 19:12 — Editoval Oxyd (14. 10. 2009 19:13)

Oxyd
Příspěvky: 614
Škola: MFF UK, teoretická informatika
Pozice: Student
Reputace:   31 
 

Re: obousměrný spojový seznam v c++

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:

Code:

// 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:

Code:

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.


Mýlím se častěji, než bych chtěl. Pokud vám v mém příspěvku něco nehraje, neváhejte se zeptat.
Jsem stále mlád a je mi příjemnější tykání. :)

Offline

 

#3 14. 10. 2009 20:13

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: obousměrný spojový seznam v c++

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?


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#4 14. 10. 2009 20:33

Oxyd
Příspěvky: 614
Škola: MFF UK, teoretická informatika
Pozice: Student
Reputace:   31 
 

Re: obousměrný spojový seznam v c++

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ý.


Mýlím se častěji, než bych chtěl. Pokud vám v mém příspěvku něco nehraje, neváhejte se zeptat.
Jsem stále mlád a je mi příjemnější tykání. :)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson