Ha egy láncolt lista utolsó előtti elemét át szeretném helyezni a második helyre, akkor milyen sorrendben irányítsam át a pointereket, hogy ez sikerüljön?
Lehetséges egyáltalán? Ha jól számoltam, összesen 6 pointert kellene átállítani (a lista duplán láncolt).
Próbálkoztam már egy csomó sorrenddel, de nem akar működni.
Persze, bármelyik helyről bárhova átrakhatod. A lényeg, hogy csak olyan pointereket írj felül, amik vagy nem kellenek már, vagy megvannak máshol. Fontos a sorrend, különben menet közben elveszhetnek pointerek ill. elemek.
Mondjuk legyenek az elemek A-B-C-D-E, és az előző-következő pointerek 1 és 2.
Itt mondjuk a D elemet akarod kivenni és beszúrni az A után.
-A1,A2- -B1,B2- -C1,C2- -D1,D2- -E1,E2-
Elem törlés:
x = D // hogy legyen ami D-re mutat törlés után
E1 = C // E valójában a D2 által mutatott elem
C2 = E // C2 valójában a D1 által mutatott elem
Beszúrás:
x1 = A
x2 = B
B1 = x // vagy B lehet az A2 által mutatott elem
A2 = x
Bocsi az újabb kérdés miatt, nem tudom követed-e még itt a hozzászólásokat, de időközben megváltoztattam a programomat vizuális okok miatt, és most már csak az utolsó elemet teszem a második helyre, ebben a sorrendben:
C2 = NULL
D1 = A
D2 = A2
B1 = D
A2 = D
Ahol A az első, B a második, C az utolsó előtti, D pedig az utolsó elem, és 1 az előző elemre, 2 pedig a következő elemre mutató pointer hasonlóan ahhoz, ahogyan te is jelölted.
Ezt a sorrendet én jónak tartom igazából, tehát csak egy megerősítés, vagy egy kijavítás kellene, ha valamit nagyon nem látnék jól.
Viszont valami baj mégis van, mert a program így kidob szegmentálási hibával, és csak ezen a részen lehet valami hibás.
C2 = NULL // Vigyázat, itt valami másnak még hivatkoznia kell D-re, különben D elvész, mint az elengedett lufi
D1 = A
D2 = A2 // Ennek semmi értelme, D2 B-re mutasson
B1 = D
A2 = D
De van itt egy nagyobb probléma is. Rossz gyakorlat az, ha ennyire speciális esetekhez csinálsz algoritmust. Csinálj általános függvényt törlésre és beszúrásra, és akkor olyan listával használhatod, amilyennel akarod.
A D2 = A2 alatt én is a B elemre gondoltam, csak nem tudtam máshogy leírni, a kódban is head->kov néven érem el a második elemet, ami tulajdonképpen A2. Vagy azt mondod, legyen inkább külön pointerem B-re?
Egyébként azért ilyen speciális ez az algoritmus, mert snake játékhoz készül, és úgy mozgatom, hogy az utolsó elemet a második helyre teszem (azért nem az elsőre, mert ott van a feje, és az kinézetben, és méretben is különbözik a törzselemtől).
"A D2 = A2 alatt én is a B elemre gondoltam"
Ja igen, én voltam figyelmetlen, bocsánat.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!