Egyirányban láncolt lista A tárhely (listaelem) az adatelem értékén kívül egy mutatót tartalmaz, amely a következő listaelem címét tartalmazza. A láncolt lista első elemének címét egy, a láncszerkezeten kívüli mutató, a fejmutató tárolja. A fejmutató nem tartalmaz egyéb adatot a mutatón kívül, így nem része az adatszerkezetnek, csak a hozzáférést biztosítja ahhoz. A láncolt lista végét egy speciális érték, a NIL jelzi. Amennyiben a fejmutató értéke NIL, akkor a lista üres. Ha a fej értéke nem NIL, kötelezően mutat egy tárhelyre, amely tartalmazza a lista első elemét. 23:06:33
Egyirányban láncolt lista Kedvező a beszúrásos rendezés számára. Előnyös, hogy a módosítási műveletek nem igényelnek adatmozgatást, valamint dinamikusságából következően nem kell előre meghatározni a tárhelyek számát. Nehéz benne keresni. Csak a teljes, és rendezett listában a lineáris keresés valósítható meg. 23:06:33
Egyirányban láncolt lista: Létrehozás A fejmutató létrehozása, és feltöltése a NIL értékkel. Ezzel létrejött egy üres egyirányban láncolt lista. 23:06:33
Egyirányban láncolt lista: Bővítés (az elején) Tárhelyet foglalunk az új elem számára A tárhely (új listaelem) adat részébe beírjuk a tárolandó elem értékét. A tárhely mutató részébe átmásoljuk a fejmutató értékét. (Most egy ideig egyszerre két mutató is kijelöli a lista eddigi első elemét.) Fejmutatóba beírjuk az új elem tárhelyének címét. A 3. és 4. lépés nem felcserélhető! (Az algoritmusok végrehajtása szekvenciális.) Van még: Bővítés a lista végén Bővítés az aktuális elem előtt vagy után 23:06:33
? adat2 adatn adat1 Uj adat Uj adat adat2 adatn adat1 Uj adat Fej TMP 1 & 2 3 adat2 adatn adat1 Fej 4 Uj adat TMP 23:06:33
Egyirányban láncolt lista: Törlés Bármelyik elem törölhető, de előre meg kell határozni, melyik ez az elem. Ha nem úgy van „megfogalmazva” a feladat, hogy töröld az első elemet, akkor a törlés művelete minden esetben a törlendő elem keresésével kezdődik. Első elem tölése: Ha a lista üres (fejmutató==NIL), az algoritmus véget ért. A fejmutató új értéke legyen, a fej által mutatott elem mutató részében tárolt érték (a következő elem címe). Ezután a lista egy elemmel kevesebbet tartalmaz. 23:06:33
Egyirányban láncolt lista: Csere Egyirányban láncolt listában a csere minden esetben kereséssel kezdődik. Ha a keresés sikeres, a megtalált értéket a cserélendő új értékkel felülírjuk. 23:06:33
Egyirányban láncolt lista: Rendezés Egyirányban láncolt listában lehet ugyan rendezni, de nem szokás. Helyette, ha fontos a lista rendezettsége (pl. mert szeretnénk teljes keresés helyett lineáris keresést alkalmazni), akkor a bővítés műveletét módosítjuk olyan módon, hogy a rendezett egyirányban láncolt lista a bővítés közben megőrizze rendezettségét. (Beszúró rendezés képezi az alapját a rendezett lista bővítésének.) 23:06:33
Egyirányban láncolt lista: Feldolgozás A feldogozásnak minden esetben a keresés vagy a bejárás az alapja. 23:06:33
Ciklikus lista Az egyirányban láncolt listának a feldolgozást segítő módosítása. Abban különbözik az egyirányban láncolt listától, hogy egyetlen listaelem sem tartalmaz a mutató részében NIL-t. Az utolsó elem mutató része a lista első elemére mutat. Ennek a listának is van fejmutatója, ami az első elemhez való hozzáférést segíti, illetve lehetővé teszi az utolsó elem felismerését, hiszen annak mutató része ugyanazt az értéket tartalmazza, mint a fejmutató. (Mindketten az első elemre mutatnak.) 23:06:33
Egyirányban láncolt lista: adat2 adat1 adatn Fej Ciklikus lista: adat2 adat1 adatn Fej 23:06:33
Kétirányban láncolt lista Az adatelemek itt is adat részből és muató részből állnak. DE a mutató rész két mutatót tartalmaz: Az egyik mutatja -mint eddig- a rákövetkező adatelem tárhelyét, a másik pedig a megelőző adatelem tárhelyét. Ebben a szerkezetben az adatelemekhez való hozzáférést a fejmutatón kívül még egy vége mutató is segíti. Ez utóbbi az utolsó adatelem tárhelyének címét tartalmazza. (Akár úgy is tekinthetünk rájuk, mint két egyirányban láncolt lista fejmutatóira.) Ebben a szerkezetben egyszerűbb a fizikai törlés, mivel közvetlenül meg tudjuk fogni a törlendő elem megelőzőjét és rákövetkezőjét. 23:06:33
Egy irányban láncolt lista: adat2 adat1 adatn Fej Két irányban láncolt lista: adat2 adat1 adatn Fej Vége 23:06:33
Multilista (1) A listaelemek adatrésze összetett, több atomi értéket tartalmaz Mindegyik atomi értékre föl lehet építeni 1-1 láncolt listát Minden tárhely (legalább) annyi muatót tartalmaz, ahány listába szerveztük az elemeket. Annyi fejmutatóra van szükség, ahány listánk van. Minden elem benne van az összes listában. 23:06:33
Multilista (1): X 2 Betű Szám G 7 K 9 23:06:33
Multilista (2) Részláncokat hozunk létre. Azok az elemek kerülnek egy részláncba, melyeknek adatrésze megegyezik. Pontosan annyi részlánc van, ahány különböző érték fordul elő az adatelemek között. A részláncok nem fedik át egymást, minden atomi adatelem csak egyetlen részláncban szerepel. Annyi fejmutató létezik, ahány részlánc. 23:06:33
Multilista (2): Abc Def Qwe 4.érték 5.érték Def Def Abc Def Abc Qwe 23:06:33
Multilista (3) Itt a tárhelyekbe is be lehet építeni listafejeket. Egy listaelem adatrésze vagy tényleges atomi értéket tárol, vagy egy másik láncszerkezet első elemének a címét. Hogy a kettő közül melyiket, azt egy egyetlen biten tárolt információval dönthetjük el. Pl. 0 == > listafej 1 == > tényleges atomi érték 23:06:33
Multilista (3): 1 Adat1 1 Adat2 1 Adat4 1 Adat6 1 Adat3 1 Adat5 Fej 1 Adat4 1 Adat6 1 Adat3 1 Adat5 23:06:33
Folytonos és szétszórt ábrázolás Az egyes absztrakt adatszerkezetek mind folytonos, mind szétszórt módon ábrázolhatóak. DE: a leképezés annál egyszerűbb, minél jobban „illeszkedik” egymáshoz az absztrakt adatszerkezet és a tárolási szerkezet. Az asszociatív adatszerkezetek nagyon jól tárolhatók folytonosan. A hierarchikus és hálós szerkezetek viszont elsősorban szétszórt módon kezelhetőek könnyen. A szekvenciális adatszerkezetek mindkét módon jól kezelhetőek. 23:06:33
Reprezentáció és Implementáció absztrakt adatszerkezet ->leképezés-> ábrázolás Absztrakt adatszerkezet reprezentációja: A tárolási mód Leképezés Absztrakt adatszerkezet implementációja: reprezentáció A műveleteket megvalósító algoritmusok Az algoritmusok megadhatóak: beszélt emberi nyelven mondatszerű leírással folyamatábrával pszeudonyelvvel (gyakorlatokon) Programozási nyelvven 23:06:33
Szabad helyek kezelése A memória véges. Az adatszerkezetek elemeit a memóriában tároljuk. == > A memóriával gazdálkodni kell. Ebben az egyik fontos elem, a „felszabaduló” tárhelyek újrahasznosítása. Két alapvető módszer Kézi (Manual memory management) NEW, …. FREE, ….. Hulladékgyűjtés (Garbage collection) Mutató értékadások figyelése Már nem hivatkozott tárhelyek automatikus felismerése 23:06:33
Felszabadult helyek nyilvántartása, kezelése Szabad helyek nyilvántartása A szabad tárhelyeket a lefoglalt memória végére gyűjtjük össze. (Időigényes lehet.) Minden lefoglalt tárhelyhez hozzárendelünk egy bitet, amely jelzi a foglaltságot (1). (szabad – 0) (Bonyolultabb a kezelés.) Szabad helyek láncolt listájának megvalósítása Mindezek kombinációi Új helyek kiosztása Az első szabad, megfelelő méretű A legjobban illeszkedő 23:06:33
Szabad helyek kezelése: Szétszórt ábrázolás Bitsorozatok (Itt a foglaltság mellett a tárhely címét is tárolni kell. Csak elvi lehetőség.) Szabad helyek láncolt listájának megvalósítása Egyirányban láncolt lista. (azonos méret) Ha nem == > első v. legjobban illeszkedő Valamely adatszerkezet bővít == > a lista elejéről „adunk neki” tárhelyet. Valamely adaszerkezet (fizikailag) töröl == > a lista elejére szúrjuk be a felszabaduló tárhelyet Szemét gyűjtögetés itt is automatikus, fizikai törlés esetén jellemzője a hivatkozás figyelés, azaz csak azt a tárhelyet gyűjti, melyre nincs élő hivatkozás 23:06:33