A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

Hasonló dokumentumok
Egyirányban láncolt lista

Adatszerkezetek 1. előadás

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Java és web programozás

Láncolt listák Témakörök. Lista alapfogalmak

Adatszerkezetek 1. Dr. Iványi Péter

Programozás I gyakorlat

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Láncolt listák. PPT 2007/2008 tavasz.

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Adatszerkezetek és algoritmusok

Táblázatok fontosabb műveletei 1

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Algoritmusok és adatszerkezetek I. 1. előadás

Generikus osztályok, gyűjtemények és algoritmusok

Programozási technológia

Osztályok. 4. gyakorlat

Java és web programozás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Algoritmusok és adatszerkezetek I. 4. előadás

Elemi adatszerkezetek

10. előadás Speciális többágú fák

Tuesday, March 6, 12. Hasító táblázatok

Programozási nyelvek Java

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Szoftvertechnolo gia gyakorlat

Algoritmusok és adatszerkezetek II.

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

Java II. I A Java programozási nyelv alapelemei

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Algoritmusok és adatszerkezetek II.

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Algoritmusok és adatszerkezetek gyakorlat 07

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

BME MOGI Gépészeti informatika 4.

Struktúra nélküli adatszerkezetek

Java és web programozás

4. Gy: JAVA osztályok

Információs Technológia

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Adatszerkezetek és algoritmusok

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás alapjai II. (7. ea) C++

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Például számokból álló, egyszeresen láncolt lista felépítéséhez az alábbi struktúra definíciót használhatjuk:

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

6. LISTÁK ábra. A lista absztrakt adatszerkezet (ADS)

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

Adatbáziskezelés. Indexek, normalizálás NZS 1

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

C++ programozási nyelv

Programozási segédlet

Programozási nyelvek Java

A C# programozási nyelv alapjai

Információs Technológia

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Java programozási nyelv 6. rész Java a gyakorlatban

C++ programozási nyelv Konstruktorok-destruktorok

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Java II. I A Java programozási nyelv alapelemei

8. gyakorlat Pointerek, dinamikus memóriakezelés

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

7. fejezet: Mutatók és tömbök

Programozás alapjai. 10. előadás

OOP: Java 8.Gy: Abstract osztályok, interfészek

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Kalapácsvetés 2016 szöveges

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

1. Jelölje meg az összes igaz állítást a következők közül!

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

21. Adatszerkezetek Az adattípus absztrakciós szintjei Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Egyszerű adattípusok Tömbök

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

.Net adatstruktúrák. Készítette: Major Péter

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Adatszerkezetek 2. Dr. Iványi Péter

C# osztályok. Krizsán Zoltán

és az instanceof operátor

Az emelt szintű. informatika érettségi. programozási feladatainak. megoldása Java nyelven. NetBeans IDE 8.1 környezetben

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

OOP: Java 8.Gy: Gyakorlás

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Adatszerkezetek 7a. Dr. IványiPéter

C# feladatok gyűjteménye

Programozás I. Első ZH segédlet

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Átírás:

Lista adatszerkezet A lista adatszerkezet jellemzői 1 Különböző problémák számítógépes megoldása során gyakran van szükség olyan adatszerkezetre, amely nagyszámú, azonos típusú elem tárolására alkalmas, és nem jelent problémát a közvetlen elérés hiánya. Azonban gyakran van szükség az adatszerkezet olyan szinten történő megváltoztatására, hogy bizonyos elemeit kitöröljük, illetve a már sorozatbeli elemek közé adott helyre újat vegyünk fel, lehetőleg kevés adatmozgatás elvégzésével. Ez utóbbi feltételezi, hogy nem feltétlenül ismert előre a sorozat elemszáma. A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista. Statikus lista reprezentációja esetén egy táblázatot használunk, amiben érték, index párokat helyezünk el. Az indexek jelentik a rákövetkezőségeket, tehát ez fogja a lista elemei közötti logikai sorrendet kialakítani. (A táblázatban elfoglalt pozíció és rákövetkezőség nem azonos a listában elfoglalt pozícióval és rákövetkezőséggel.) A dinamikus lista mérete az igényeknek megfelelően változik. Megvalósítása láncolt listával történik. A láncolt lista egyike a számítógép-programozásban használatos legegyszerűbb adatszerkezeteknek. Olyan csomópontok, cellák sorozatából épül fel, amelyek tetszőleges számú és fajtájú adatmezőt, és egy vagy két hivatkozást tárolnak. A hivatkozás(ok) a lista következő (és előző) elemére mutat(nak). 1 Forrás: http://tudasbazis.sulinet.hu/hu/informatika/informatika/informatika-9-12-evfolyam/informatikaiprogramozasi-alapfogalmak/linearis-listak-szekvencialis-es-lancolt-helyfoglalas

A listaelem szerkezete A listaelem feladata kettős. Egyrészt helyet kell biztosítania a sokaság egy eleme számára, másrészt biztosítania kell a következő elem elérését, hiszen a memória tetszőleges területén lehet. Ennek megfelelően a listaelem funkcionálisan két részből áll: a tárolandó sorozat egy eleme és mutató a következő elem eléréséhez. Láncolt lista adatok szétszórt tárolása Tárolási módok: A listaelem szerkezete egyirányú láncolt lista, cirkuláris láncolt lista, kétirányú láncolt lista, multilista. Egy irányban láncolt lista A láncolt lista olyan homogén, dinamikus, szekvenciális elérésű adatszerkezet, amelynek minden eleme - a tárolandó adatokon kívül - azt az információt is tárolja, hogy a következő elemet hol tárolja a rendszer a számítógép memóriájában.

A lánc első elemének a címét a lista feje tartalmazza. A listafej nem tartalmaz információs részt, azaz tényleges listabeli adatot. A lánc végét az jelzi, hogy az utolsó elemben a rákövetkező elem mutatója üres (NULL). Megjegyzés: A lista első elemének eléréséhez csupán egy mutató is elegendő. Ennek ismerete a teljes lista ismeretét jelenti, mert így hozzáférhetünk az elemben tárolt minden adathoz, tehát azt az információt is ki tudjuk olvasni, hogy hol található a következő elem. A láncolt szerkezet lehetővé teszi listaelemek törlését és beszúrását a lista tetszőleges pontjára konstans (azaz a konkrét helytől független) időben, ugyanakkor egy véletlenszerűen kiválasztott elem előkeresése a lista hosszával arányos időt igényel. A láncolt listákat gyakran alkalmazzák összetettebb adatstruktúrák, mint például verem vagy sor építésekor. A cellák adatmezői tetszőleges adatot tárolhatnak, így akár hivatkozást is egy másik láncolt listára. Ezzel a trükkel már nem csak lineáris adatszerkezeteket tudunk építeni, hanem tetszőleges elágazó struktúrát, mint például fákat, gráfokat stb. Láncolt lista

Új elem felvitele Új elem felvitelét elvégezhetjük a lista elejére, végére, és adott elem után. A lista végre történő elem hozzáadásának lépései: a tárolandó adat bekérése vagy előállítása, új listaelem létrehozása; érték beállítása; a következő elem mutatójának nullázása, az új elem hozzáfűzése a lista végére, az utolsó elem mutatójának ráállítása az új elemre. Lista kiírása, feldolgozása A lista elemein egyesével végig kell menni, és kiírni vagy feldolgozni a tárolt adatot. Az elemek eléréséhez egy segéd mutatót használunk, amelyet kezdetben az első elemre állítunk. Első, utolsó elem törlése A lista első elemének törlésénél a fej mutatót állítjuk a második elemre, majd felszabadítjuk az első elem által lefoglalt memóriát. A Java nyelv esetén automatikus memória felszabadítás van. Azokat a memória területeket, amelyekre nem történik hivatkozás a rendszer Garbage Collection mechanizmusa felszabadítja. Szokták automatikus szemétgyűjtésnek is nevezni.

Tartalmazás vizsgálat Azt akarjuk kideríteni, hogy egy megadott érték szerepel-e a listában. Szintén az fejtől indulunk, és minden elem adattagját megvizsgáljuk, hogy az-e a keresett. Függvénnyel megvalósítva egy logikai igen-nem értékkel jelezzük a találatot. Láncolt lista megvalósítása Java nyelven /* * Láncolt lista adatszerkezet megvalósítása * ---------------------------------------- */ package lancoltlista; public class LancoltLista { //listaelem megvalósítása belső osztállyal class ListaElem{ //adattagok public int adat; public ListaElem kovetkezo; // listaelem konstruktora public ListaElem(int adat, ListaElem kovetkezo){ this.adat = adat; this.kovetkezo = kovetkezo; //láncolt lista adattagja a kezdő és az utolsó elem referenciája (mutatója) private ListaElem fej; private ListaElem utolso; //Láncolt lista konstruktora public LancoltLista(){ fej = null; utolso = null; üres //annak lekérdezése, hogy a lista üres -- empty = public boolean isempty(){ return fej == null; public static void main(string[] args) { // TODO code application logic here

Új elem felvitele a lista végére. //új elem felvitele a lista végére public void ujelem(int adat){ //létrehozunk egy önálló listaelemet ListaElem elem = new ListaElem(adat, null); //az elem felfűzése a listába if(fej == null){ //ha a lista üres fej = elem; //a fej mutasson az elemre else{ //egyébként utolso.kovetkezo = elem;//láncolunk utolso = elem; //a segédreferenciát is ráállítjuk Első elem törlése. //első elem törlése a listából public void torolelso(){ //ha a lista nem üres if(fej!= null) fej = fej.kovetkezo; Utolsó elem törlése //utolsó elem törlése public void torolutolso(){ //ha a lista nem üres if(utolso!= null){ ListaElem seged = fej; //megkeressük az utolsó előtti elemet while(seged.kovetkezo!= utolso){ seged = seged.kovetkezo; //töröljük az utolsót utolso = seged;

seged.kovetkezo = null; Adott értékű elem keresése //adott értékű elem keresése public boolean bennevan(int keresettadat){ ListaElem seged = fej; //amíg meg nem találjuk a keresett értéket, lépkedünk while((seged.adat!= keresettadat) && (seged.kovetkezo!= null)) seged = seged.kovetkezo; //megtaláltuk, ha úgy lépünk ki ciklusból, hogy nem értük el a lista végét return seged.adat == keresettadat; A lista elemeinek kiírása //lista kiírása public void kiirlista(){ if(!this.isempty()){ ListaElem seged = fej; while(seged!= null){ System.out.print(seged.adat+", "); seged = seged.kovetkezo; System.out.println(""); else{ System.out.println("A lista üres, nincs mit kiírni."); A lista tesztelése //főprogram public static void main(string[] args) { Random rnd = new Random();

//lista készítése LancoltLista ll = new LancoltLista(); //lista feltöltése 10 elemmel int adat; for(int i = 0; i < 10; i++){ adat = rnd.nextint(101); //új elem hozzáadása ll.ujelem(adat); //a lista kiírása System.out.println("A lista elemei:"); ll.kiirlista(); //első elem törlése, majd a lista kiírása System.out.println("Első elem törlése, majd a lista kiírása:"); ll.torolelso(); ll.kiirlista(); //utolsó elem törlése, majd a lista kiírása System.out.println("Utolsó elem törlése, majd a lista kiírása"); ll.torolutolso(); ll.kiirlista(); //adott értékű elem keresése System.out.println("10 érték keresése:"); System.out.println(ll.benneVan(10)?"benne van":"nincs benne"); A futás eredménye run: A lista elemei: 51, 37, 25, 18, 76, 49, 33, 61, 10, 76, Első elem törlése, majd a lista kiírása: 37, 25, 18, 76, 49, 33, 61, 10, 76, Utolsó elem törlése, majd a lista kiírása 37, 25, 18, 76, 49, 33, 61, 10, 10 érték keresése: benne van BUILD SUCCESSFUL (total time: 0 seconds)

Ciklikusan láncolt lista Hasonló az egy irányban láncolt listához, ám itt egyik listaelem mutatórésze sem tartalmazhatja a NIL értéket: az utolsó listaelem mutatórészébe az első listaelem címe kerül. A cirkuláris lista első elemének tárbeli címét most is egy mutató, a fejmutató tárolja. Amennyiben a fejmutató a NIL értéket tartalmazza, akkor a cirkuláris lista üres. Ciklikusan láncolt lista

Két irányban láncolt lista Hasonló az egy irányban láncolt listához, ám itt minden listaelem mutatórésze két részből áll: az egyik mutató az adott listaelemet megelőző, a másik az adott listaelemet követő listaelemre mutat. Ha üres a lista, a listát azonosító mutatók értéke végjel. Két lánc alakul ki, két fejmutatóval. A fejmutatók a két irányban láncolt lista első és utolsó elemére mutatnak. Ha mindkét fejmutató értéke NIL, akkor a két irányban láncolt listának nincs egyetlen eleme sem, azaz üres. Két irányban láncolt lista

Szabad helyek kezelése A lista-adatszerkezetek szervezéséből adódóan a listaelemek a memória különböző területein, szétszórtan helyezkedhetnek el (különösen kellő számú új elemmel való bővítés és feleslegessé vált elem listából való elhagyása után). Ez természetesen nem okoz gondot, mert az egyes listaelemek elérését az őket megelőző elemek mutatói biztosítják. A listaelemekkel végezhető műveletek (lista bővítése egy elemmel, feleslegessé vált elem elhagyása a listából) azt feltételezik, hogy a listából törölt elemek is szétszórtan helyezkednek el a memóriában. Az így felszabadult elemekre a későbbiekben egy újabb bővítés alkalmával még szükség lehet, hiszen a lista dinamikus adatszerkezet. Meg kell tehát oldani a szabad helyek kezelését. Ennek legkézenfekvőbb megvalósítása, hogy a szabaddá vált listaelemeket egyszerűen egy listába fűzve tároljuk. Szabad helyek kezelése