Egyirnyban lncolt lista A trhely listaelem az adatelem
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 14: 16: 32 1 tárhelyre, amely tartalmazza a lista első elemét.
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. 14: 16: 32 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. 14: 16: 32 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: 14: 16: 32 Bővítés a lista végén Bővítés az aktuális elem előtt vagy után 4
adat 2 adat 1 adatn Fej Uj adat TMP Uj adat ? TMP 1&2 3 adat 2 adat 1 adatn Fej 4 Uj adat TMP 14: 16: 32 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). 14: 16: 32 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 cserélendő új értékkel felülírjuk. 14: 16: 32 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. ) 14: 16: 32 8
Egyirányban láncolt lista: Feldolgozás A feldogozásnak minden esetben a keresés vagy a bejárás az alapja. 14: 16: 32 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. ) 14: 16: 32 10
Egyirányban láncolt lista: adat 1 adat 2 adatn Fej Ciklikus lista: adat 1 adat 2 adatn Fej 14: 16: 32 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 14: 16: 32 12 megelőzőjét és rákövetkezőjét.
Egy irányban láncolt lista: adat 1 adat 2 adatn Fej Két irányban láncolt lista: adat 1 adat 2 adatn Fej Vége 14: 16: 32 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: 16: 33 14
Multilista (1): X 2 Betű G Szám K 14: 16: 33 7 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. 14: 16: 33 16
Multilista (2): Abc Def Qwe 4. érték 5. érték Def Abc Qwe 5. érték Abc Qwe 14: 16: 33 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 egyetlen biten tárolt információval dönthetjük el. Pl. 14: 16: 33 0 == > listafej 1 == > tényleges atomi érték 18
Multilista (3): 1 Adat 1 Fej 0 1 Adat 2 0 1 Adat 4 0 1 Adat 6 1 Adat 3 1 Adat 5 14: 16: 33 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. 14: 16: 34 20
Reprezentáció és Implementáció absztrakt adatszerkezet ->leképezés-> ábrázolás Absztrakt adatszerkezet reprezentációja: Absztrakt adatszerkezet implementációja: A tárolási mód Leképezés 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) 14: 16: 34 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) Hulladékgyűjtés (Garbage collection) 14: 16: 34 NEW, …. FREE, …. . 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 14: 16: 34 Az első szabad, megfelelő méretű A legjobban illeszkedő 23
Szabad helyek kezelése: 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) Szétszórt ábrázolás 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 14: 16: 34 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
- Slides: 24