Programozsi Paradigmk s Technikk Programozsi eszkzk Interfszek Generikus
- Slides: 57
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 3/6/2021 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 1
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 2
Interfészek • Metódusok "előírására", kötelezővé tételére használható • Az osztályban kötelezően kell lennie egy publikus Eldönt() eljárásnak (ha nincs: a fordító reklamál) • Hasonló, de teljesen másra használt : absztrakt osztály • Kifejezés: "az X osztály implementálja az Y interfészt" V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 3
Interfészek - lehetőségek • Egy interfészt implementáló osztály egy példányára akár interfész típusú változó is mutathat: IEldönthető valtozo=new Saját. Osztály(); • Egy interfész-metódus szokványosan elérhető az osztálypéldányon keresztül: Saját. Osztály valtozo=new Saját. Osztály(); valtozo. Eldönt (); • … Vagy az interfészen keresztül: (valtozo as IEldönthető ). Eldönt(); • Ez utóbbira akkor van szükség, ha explicit megvalósítású az interfész az osztályban, vagy a változó típusából nem egyértelmű az interfész implementálása V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 4
Explicit implementáció • Azonos eljárást előíró interfészek esetén lehet szükséges V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 5
Explicit Implementáció V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 6
Explicit implementáció használata • A következő órán fogunk saját interfészt létrehozni, ezen az órán csak meglévő interfészeket használunk V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 7
Interfészek használata • Tipikusan: funkcionalitás előírásánál, avagy előírásnak megfelelésnél (pl. VEP: ha az INotify. Property. Changed interfészt implementálom egy olyan osztálynál, aminek a példányait List. Box vezérlőben helyezem el, akkor ez előír egy eseményt, amire a List. Box feliratkozik – ezen az eseményen keresztül tudja a List. Box, ha frissítenie kell) • "A változó típusából nem egyértelmű az interfész implementálása" Ugyanaz, mint amikor OOP-ben ős típusú volt a tömb, és nem tudtuk, hogy az egyes tömbelemek milyen típusúak • Van olyan eset, amikor a gyűjteményből/tömbből csak néhány elem implementál egy bizonyos interfészt, az interfész implementálását ugyanúgy az IS kulcsszóval lehet ellenőrizni V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 8
Interfészek használata V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 9
Interfészek használata • Array. Sort(tömb) tömb rendezése. int[] esetén tökéletesen működik • Készítsünk egy osztályt, amelynek segítségével hallgatókat tudunk tárolni: név, neptun kód, teljesített kreditek • Töltsünk fel egy 10 elemű tömböt hallgatókkal. Hogyan tudjuk ezt a tömböt a fenti módon névsorba vagy teljesített kreditek szerinti sorba rendezni? IComparable. Compare. To (object) V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 10
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok (© Erdélyi Krisztina) Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 11
Generikus Osztályok • • V 1. 0 A generic fogalma Generikus osztályok Generikus metódusok Megszorítások Statikus tagok Öröklés A generic-ek működése. NET-ben Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 12
Bevezetés – feladat • Cél: halmaz típus létrehozása , egy elemet egyszer tartalmazhat , a lehető legáltalánosabb módon • Milyen elemekből álljon a halmaz? – Személy – akkor a kutya-klubhoz át kell írni – A személy és a kutya őse – ez biztos, hogy elég általános? – Object ez mindennek az őse - ez lehet megoldás Array. List, . NET 1, csak object-et tárol, állandó castolás – A típust adjuk meg paraméterként , így elég a deklarációban megadni a konkrét típust – ez is megoldás Vizsgáljuk meg ezt közelebbről! V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 13
A generic fogalma. NET-ben • Paraméterezett típus vagy metódus • Minden egyes paraméter egy még meg nem határozott típus helye • Más néven sablon vagy template • Az osztály tervezésekor csak T néven hivatkozok a típusra, csak az osztály példányosításakor definiálom, hogy ez a T pontosan mi V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 14
Paraméterezett típusok • A paraméter a típus fejrészében helyezkedik el class My. Generic. Class <T> { } • Deklarációnál és példányosításkor az aktuális típus kerül a paraméter helyére My. Generic. Class <int> mgc. INT = new My. Generic. Class <int>(); • A generic-ek tipikusan gyűjtemények létrehozásához valók, mivel a gyűjtemények több típussal is használhatók V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 15
Saját generikus osztály létrehozása V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 16
Generikus osztály használata V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 17
Generikus gyűjtemények • Array. List object típust tárol, állandó castolás, elavult • List<T>: Add(), Insert(), Remove. At(), Reverse(), [], Clear(), Contains(), Count • Queue<T>: Enqueue(), Dequeue(), Peek(), Clear(), Contains(), Count • Stack<T>: Push(), Pop(), Peek(), Clear(), Contains(), Count • Dictionary<T, U>: Add(), Remove(), Try. Get. Value(), Keys, Values, Clear(), Contains. Key(), Contains. Value (), Count V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 18
Paraméterezett típus inicializálása • Nem tudható, hogy érték vagy referencia típusú-e a paraméter • Megoldás: default expression – Referenciánál null-t ad vissza – Érték típusnál bitenkénti nullát V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu this. elem = default(T); 19
Megszorítások • Lefordulnak a következő kódok? • Ha nem, akkor mi a megoldás? • Annyit feltételezhetünk, hogy a T típus a System. Object-ből származik • Ezért ennek megfelelően viselkedik V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 20
Interfész megszorítás class My. Class 2<T> { public void Iterate(T data) { foreach (object item in data) { Console. Write. Line(item); } } Nem biztos, hogy T felsorolható! } (A foreach ciklus akkor működik saját típuson, ha a saját típus megvalósítja a IEnumerable <T> interfészt, ld. később) class My. Class 2<T> where T : IEnumerable<T>{ public void Iterate(T data) { foreach (object item in data) { Console. Write. Line(item); } } } OK V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 21
Konstruktormegszorítás class My. Class<T> { T obj = new T(); } Nem biztos, hogy T-nek van alapértelmezett konstruktora! class My. Class<T> where T: new() { T obj = new T(); } OK V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 22
Művelet megszorítás? ? ? class Arithmetic<T>{ Nem biztos, hogy T-n public T Cubed(T number){ return number * number; értelmezett a szorzás! } } class Arithmetic<T> where T : System. Int 32{ public T Cubed(T number){ return number * number; } Érték és primitív } típusok nem lehetnek megszorítások! Súlyos korlátja a generic-ek használatának, hogy standard operátorok az érték típusokkal nem használhatók. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 23
A Generic korlátja class Program 2 { A standard operátorok public T Min<T>(T a, T b) nem használhatók. where T : IComparable<T> { if (a<b) return a; class Program else { return b; public T Min<T>(T a, T b) } where T : IComparable<T> } { if (a. Compare. To(b)<0) return a; else return b; }… Szabó Zsolt, Óbudai Egyetem, 2011 V 1. 0 24 } szabo. zsolt@nik. uni-obuda. hu
Megszorítások • • A megszorítások a típus paraméterektől elvárt viselkedést írják le A where kulcsszóval vezetjük be Típusnál és metódusnál is használhatók Fajtáik: – – – Leszármazott (where T : Személy) Interfész (where T: IEnumerable <T>) Érték típus (where T: struct) Referencia típus ( where T: class) Konstruktor (where T: new()) • Az alábbi típusok nem lehetnek megszorításban: – – – V 1. 0 Lezárt osztályok Primitív típusok System. Array System. Delegate System. Enum System. Value. Type Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 25
Generikus metódus • • V 1. 0 Tartozhat generikus vagy nem generikus típushoz Azért, mert az osztály generikus, a metódus még nem A metódus generikus, ha saját típusparamétere(i) van( nak) A típusparaméter megjelenhet visszatérési értékként vagy a paraméterlistában Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 26
Generikus metódusok meghívása • A metódus meghívásakor a paraméterek típusa adja meg a típusparaméter aktuális értékét : int i=Min(2, 3); //egészek float f=Min(2. 0, 3. 0); //valósak • Ellentmondás esetén a nem-generikus eljárás hívódik: mi van, ha T=int? a nem-generikus változat hívódik meg • Ha két generikus metódus van különböző generikus paraméterrel pl. Method(T arg), Method(U arg), és T és U konkrétan ugyanaz, akkor a metódus meghívásánál jelez hibát. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 27
Statikus tagok • A statikus tagok eléréséhez be kell helyettesíteni egy konkrét típust a paraméterbe My. Generic. Class <int>. Count(); • Különböző behelyettesített típusokhoz különböző statikus tagok tartoznak • A statikus konstruktor implicit meghívódik, és a behelyettesített típusnak megfelelően inicializálja a statikus mezőket V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 28
Példányok számolása class My. Generic. Class<T> { private static int counter = 0; public My. Generic. Class() { counter++; } public static void Count() { Console. Write. Line(counter); } } V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 29
Generikus osztályok az öröklésben • Generikus osztály lehet őse generikus és nem generikus osztálynak • Generikus osztály származhat generikus vagy nem generikus osztályból • De mindkét állítás csak bizonyos esetekben igaz! • Gondoljunk arra, hogy az utód példányosításakor a típusparaméterek értékét mindenképpen meg kell határozni V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 30
Generikus osztályok az öröklésben Melyik eset lehetséges? V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 31
Generikus osztályok az öröklésbenés a. NET-ben • A típusra vonatkozó ős osztálybeli megszorításokat az utódosztályban meg kell ismételni • Az utódosztály tartalmazhat további megszorításokat • Nem nyelvspecifikus , minden felügyelt nyelvben elérhető • A köztes kódra való fordítás során metaadatok és a generic-ekre vonatkozó MSIL kód áll elő • A JIT fordítás során történik meg a konkrét típusok behelyettesítése • Lehetőség van több típus használatára: class valami<T, U> { } V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 32
A generic-ek működése. NET-ben A fenti kódhoz három osztály jön létre. A két My. Generic. Class<int> osztozik egy osztályon. A My. Generic. Class<double> külön osztály. A My. Generic. Class<Személy> és a My. Generic. Class<Pizza> osztozik egy osztályon. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 33
Feladat: halmaz • Hozzunk létre egy generikus halmaz<T> osztályt, amelyben List<T> segítségével tároljuk az elemeket • Kell: konstruktor, copy konstruktor, elem hozzáadása • Cél: foreach ciklus működjön: V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 34
IEnumerable / IEnumerator • A foreach ciklus akkor működik saját típuson, ha a saját típus megvalósítja a IEnumerable <T> interfészt • Ez az interfész előírja a Get. Enumerator () eljárást, ami visszaad egy olyan objektumpéldányt, ami megvalósítja az IEnumerator <T> interfészt • Az IEnumerator <T> előírja a következő műveleteket: Aktuális elem olvasása ( Current), következő elemre mozgás (Move. Next()), visszaállás az első előtti elemre (Reset()) lista bejárása • Mindegyik interfész előírja a nemgenerikus (object ) változatot is • Saját enumeratort a következő órán fogunk implementálni, addig meglévő enumeratort használunk Szabó Zsolt, Óbudai Egyetem, 2011 V 1. 0 szabo. zsolt@nik. uni-obuda. hu 35
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 36
Operator Overloading • halmaz<int> ha = new halmaz<int>(); halmaz<int> hb = new halmaz<int>(); ha. hozzaad(42); hb. hozzaad (15); ha. hozzaad(23); halmaz<int> hc = ha + hb; unió public static halmaz<T> operator +(halmaz<T> h 1, halmaz<T> h 2) { } • halmaz<int> hc = ha - hb; különbség hc = ha * hb; metszet hc = ha + 5; elem hozzáadása hc = ha - 5; elem törlése • A kimenet mindig ÚJ objektumpéldány • Új operátort nem lehet feltalálni • Az azonos/hasonló operátorok lehetőleg hivatkozzanak Szabó Zsolt, Óbudai Egyetem, 2011 V 1. 0 egymásra szabo. zsolt@nik. uni-obuda. hu 37
Operator Overloading • Implicit konverzió, T halmaz<T> – halmaz<int> ha = 5; halmaz< string> hb="Hello"; – public static implicit operator halmaz<T>(T elso) { } • Explicit konverzió, halmaz<T> string – string valami = (string)ha; – public static explicit operator string(halmaz<T> be ) { } • Ugyanarra a típusra nem lehet mindkettő konverziót definiálni! • A kimeneti típus vagy a bemeneti típus kötelezően az operátort tartalmazó osztály! • if (ha==hb) / if (ha!=hb) / if (ha. Equals(hb)) • Equals: példányok tartalmi egyezés-vizsgálata. Sok mező/beágyazott osztály esetén inkább javasolt: Get. Hash. Code () V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 38
Tesztelés V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 39
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 40
Láncolt Lista • Egyszeresen láncolt, ciklikus, kétszeresen láncolt listák (ld. Ea. ) • Strázsa-elemes, rendezett láncolt listák (ld. Ea. ) • Órai feladat: telefonkönyv-bejegyzések (név, cím, telefonszám) egyirányú, nem rendezett láncolt listába fejtése • ZH: egyéb láncolás is lehetséges V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 41
A fejlesztés menete 1. Generikus osztályként megtervezzük a Lista. Elem<T> osztályt, amely egy T típusú referenciát tárol, valamint egy referenciát a következő listaelemre 2. Generikus osztályként megtervezzük a Lista<T> osztályt, amely tárol egy referenciát az első listaelemre, emellett implementáljuk az eljárásokat is: a) public void Beszúr(T elem) b) public T Keres(T mitkeres, out bool talalt) c) public bool Töröl(T elem) d) public bool Töröl(int index) e) Cél: a lista osztályt be lehessen járni foreach ciklussal 3. A foreach ciklus működése miatt tervezünk egy saját felsorolót 4. Megtervezzük a bejegyzés osztályt, amit ténylegesen tárolni akarunk 5. Tesztprogram írása V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 42
Lista. Elem<T> • T típusú adatot tárol + egy referenciát a következő elemre • Tulajdonságok, konstruktor, To. String() Lista<T> + Lista. Enumerator<T> • Lista. Elem<T> Elso; + konstruktor? • public void Beszúr(T elem) PPT előadás • public T Keres(T mitkeres, out bool talalt) PPT előadás, p. Elem. Equals(mitkeres) • public bool Töröl(T elem) PPT előadás, ugyanúgy Equals() • public bool Töröl(int index) index szerinti törlés • Cél: a lista osztályt be lehessen járni foreach ciklussal – saját felsoroló készítése: konstruktor (*), aktuális elem kiolvasása, következőre való mozgás, első előttire való visszaállás (*) V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 43
Telefonkönyv bejegyzés • Név + Cím + Telefonszám • Konstruktor + To. String() • Speciális Equals() : rész-egyenlőség visszaadott értéke is true Tesztprogram • Lista<Bejegyzes> telefonszámok = new Lista<Bejegyzes>(); • Bejegyzes keresett, talalt; • bool van; V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 44
Tesztprogram V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 45
Tesztprogram V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 46
Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 47
Bináris keresőfa V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 48
A fejlesztés menete 1. Generikus osztályként megtervezzük a csucs<T> osztályt, amely egy T típusú referenciát tárol, valamint egy referenciát a jobb és a bal oldali gyermek-elemre 2. Generikus osztályként megtervezzük a fa<T> osztályt, amely tárol egy referenciát a gyökérelemre, valamint azt, hogy milyen bejárást akarunk használni (szélességi, mélységi, inorder, preorder, postorder ) , emellett implementáljuk az eljárásokat is: a) public bool bennevan(T elem) b) public void beszur(T ujelem) c) public bool torol(T x) d) Cél: a fát be lehessen járni foreach ciklussal 3. A foreach ciklus működéséhez az éppen kiválasztott bejárást hívjuk meg, és a produkált lista felsorolóját ( List<csucs<T>>. Get. Enumerator () ) használjuk fel 4. Tesztprogram írása, amiben a fa számokat tárol V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 49
Fejlesztési sajátosságok • A csúcs osztályban a gyermek-elemekhez ne csináljuk tulajdonságot, maradjanak publikus adattagok – ez nem szép megoldás, de ha a gyermekcsúcsokat referenciaként akarom továbbadni, akkor erre szükség van • Az előadáson bemutatott eljárások egyik paramétere az aktuális csúcs, ami kiindulási állapotban a gyökér. Ugyanakkor a publikus eljárásban ez nem szerepel, pl. public void beszur (T ujelem) Megoldás: a publikus eljárás nem-publikus eljárásra hivatkozik, pl. priv_beszur (ref FRoot, ujelem) • A "referencia referenciája" probléma: miért kell a ref csucs <T> némelyik paraméternél? • Szélességi bejárás sor, mélységi bejárás verem adatszerkezettel • xx. Order bejárás rekurzióval • Fa magsságának számolása fa<T> int explicit konverziónál V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 50
Tesztprogram I. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 51
Tesztprogram II. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 52
Tesztprogram III. V 1. 0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 53
3/6/2021 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 54
3/6/2021 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 55
Képek forrásai • • V 1. 0 http: //people. ksp. sk /~kuko/bak/ (megjegyzés: a fenti oldal nagyon jó, de kicsit más a BST, mint az előadáson ismertetett: törlés-C esetnél (amikor mindkét gyermekeleme létezik a törlendő elemnek) nem a bal oldali részfa legjobboldalibb elemét, hanem a jobb oldali részfa legbaloldalibb elemét használja) http: //en. wikipedia. org /wiki/Linked_List Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 56
Képek forrásai V 1. 0 3/6/2021 Szabó Zsolt, Óbudai Egyetem, 2011 szabo. zsolt@nik. uni-obuda. hu 57