240 likes | 360 Views
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.
E N D
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.
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.
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.
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
Fej TMP TMP 1 & 2 3 Fej 4 TMP
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.
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.
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.)
Egyirányban láncolt lista: Feldolgozás • A feldogozásnak minden esetben a keresés vagy a bejárás az alapja.
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.)
Egyirányban láncolt lista: Fej Ciklikus lista: Fej
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.
Egy irányban láncolt lista: Fej Két irányban láncolt lista: Fej Vége
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.
Multilista (1): Betű Szám
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.
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
Multilista (3): Fej
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.
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
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
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ő
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