

C - Spajany zoznam struktur mazanie
Dobry den prajem. Mam problemy so strukturami. Chapem zaklady spajaneh zoznamu ako ukazuju jednotlive struktury v zozname na druhe a tak ale neviem prijst nato ako zmazat dajme tomu v 8prvkovom zozname stuktur strukturu na 5. mieste napadlo ma ze ked dojdem na piatu tak ta stvrta bude ukazovat namiesto piatej na siestu a piatu vymazem. Bohuzial neviem ako to funguje ci pri mazani sa dava free alebo ako priradim tej stvrtej adresu siestej atd. Neukazal by mi dakto priklad ako sa to robi?
stvrty.spojka = pointer na siesty; // to je to same co stvrty.spojka = piaty.spojka;
free(pointer na piaty); // to je to same co free(stvrty.spojka);
t.j.
temp je len lokalna premenna (pomocna), typu pointer na tu strukturu.
A free pouzivas ked si si tu pamat alokoval pomocou malloc. Ked to alokujes inymi funkciami tak samozrejme pouzijes prislusnu inu free funkciu, podla toho jaku alokacnu fciu pouzivas pri alokovani pamate.
Musim to robit cez temp? Tuto mam jeden priklad:
Pocet je kolko struktur bolo prejdenych dokial som nenarazil na tu ktoru chcem zmazat. No a v tomto kode sa dostanem na strukturu pred tu ktoru chcem vymazat a podarilo sa mi tu adresu aj zmenit a preskocit ju ale neviem vymazat tu strukturu co som preskocil
Na to tam musi byt nejaka temp premenna, ptz uz si si prepisal pointer na tu strukturu (aktualnyZaznam->dalsia ukazuje uz na siestu), a teda uz nevies vobec jaka bola ta adresa ten piatej struktury.
Preco mas panicky strach z nejakej lokalnej premennej? Bez lokalnych premennych toho moc nenaprogramujes.
(P.S. tej premennej i sa nebojis? To je tiez len lokalna pomocna premenna :)
a to temp vlastne staci na tu premennu dalsia takze nemusim ho natahovat cez malloc ze?
temp si deklarujes len ako pointer, nerobis tam ziadne malloc.
struktura* temp;
temp = aktualnyZaznam->dalsia;
...
Dakujem uz mi to ide ako hodinky :) velmi si mi pomohol :)
Ked to mas do skoly tak si to temp nazvi nazmazanie apod, aby sa ucitel zbytocne nepytal ze preco si to nazval temp :) (je to skratka z anglickeho temporary = nejaka docasna premenna, ono premenne by sa stejne mali nazyvat nejak normalne a nie len temp alebo temp2 aby sa to dalo aj citat)
a tie smerniky aktualnyZaznam a prvyZaznam som alokoval cez malloc
struktura* neco;
neco = aktualnyZaznam->dalsia;
aktualnyZaznam->dalsia = neco->dalsia;
free(neco);
Este jedna otazocka co ak chcem zmazat uplne prvu strukturu to nemozem iba vymazat to musim poposuvat cely zoznam ze?
Niekde mas ulozeny pointer na hlavu zoznamu (to je to s cim zacinas, u teba "prvyZaznam")
To si nastavis na druhu, a potom uvolnis pamat tej prvej: free(prva);
Zas na to potrebujes nejaku lokalnu premennu.
neco = prvyZaznam;
prvyZaznam = neco->dalsi;
free(neco);
Ak to robis vo funkcii a predavas to prvyZaznam parametrom, tak to ale neovplyvni origijnalnu premennu. Potom si musis predavat to prvyZaznam do funkcie odkazom (adresu toho prvyZaznam, t.j. dvojity pointer).
funkcia(struktura **prvyZaznam)
{
aktualnyZaznam = *prvyZaznam;
for(i=0...
a ked chces zmazat ten prvy tak potom
neco = *prvyZaznam;
*prvyZaznam = neco->dalsi;
free(neco)
}
a volas to potom ako
funkcia(&prvyZaznam);
tak ovplyvnis premennu prvyZaznam vnutri funkcie (ak si ju pamatas mimo tej fukcie)
BTW. pri objektovom programovani je dobre mat objekt typu spojkovy zoznam v ktorom je ulozeny aj ten prvyZaznam, a potom nemusis robit taketo harakiri, vsetko je vnutri objektu a predavas si len pointer na cely objekt.
P.S. resp. nepredavas si nic ale pouzivas fcie nad tym objektom t.j. volas fciu stylom mojzoznam.ZmazZaznam(cislo); apod. To je OOP, preto je OOP prehladnejsie.
Ahaaaa jasne chapem super dakujem moc :)