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. 1
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. 2
Egyirányban láncolt lista: Létrehozás 1. A fejmutató létrehozása, és 2. feltöltése a NIL értékkel. Ezzel létrejött egy üres egyirányban láncolt lista. 3
Egyirányban láncolt lista: Bővítés (az elején) 1. Tárhelyet foglalunk az új elem számára 2. A tárhely (új listaelem) adat részébe beírjuk a tárolandó elem értékét. 3. 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.) 4. 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 4
adat1 adat2 adatn Fej TMP Uj adat? Uj adat 1 & 2 TMP 3 adat1 adat2 adatn Fej 4 Uj adat TMP 5
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: 1. Ha a lista üres (fejmutató==nil), az algoritmus véget ért. 2. 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. 6
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 csrélendő új értékkel felülírjuk. 7
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.) 8
Egyirányban láncolt lista: Feldolgozás A feldogozásnak minden esetben a keresés vagy a bejárás az alapja. 9
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.) 10
Egyirányban láncolt lista: adat1 adat2 adatn Fej Ciklikus lista: Fej adat1 adat2 adatn 11
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 12 megelőzőjét és rákövetkezőjét.
Egy irányban láncolt lista: adat1 adat2 adatn Fej Két irányban láncolt lista: Fej adat1 adat2 adatn Vége 13
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. 14
Multilista (1): Betű X 2 Szám G 7 K 9 15
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. 16
Multilista (2): Abc Def Qwe 4.érték 5.érték Abc Def Def Def Abc 5.érték Qwe Abc Qwe 17
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 18
Multilista (3): Fej 0 0 1 Adat3 1 Adat1 0 1 Adat4 1 Adat5 1 Adat2 1 Adat6 19
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. 20
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 21
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) NEW,. Mutató értékadások figyelése Már nem hivatkozott tárhelyek automatikus felismerése 22
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
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 24