Algoritmusok és adatszerkezetek I. 4. előadás
A lista olyan sorozat, amelyben műveleteket egy kiválasztott, az ún. aktuális elemmel lehet végezni. A lista rendelkezik az alábbi műveletekkel: Üres: Lista üres?(lista): Logikai Érték(Lista): Elem {NemDef} Módosít(Lista,Elem): Lista {NemDef} Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 2/46
A lista rendelkezik az alábbi műveletekkel: Elsőre(Lista): Lista {NemDef} Következőre(Lista): Lista {NemDef} BeszúrMögé(Lista,Elem): Lista {NemDef} BeszúrElejére(Lista,Elem): Lista {NemDef} utolsó?(lista): Logikai {NemDef} Kihagy(Lista): Lista {NemDef} Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 3/46
A lista tulajdonságai Lista Üres listára a beszúrás és az üresség vizsgálat kivételével minden művelet értelmetlen. Nem üres listának van aktuális eleme. Az utolsó elem után alkalmazott következőre lépés művelet az aktuális elemet nemdefiniált értékűvé teszi (sehova érték). Ebben az esetben utána csak az Elsőre vagy a BeszúrElejére művelet használható. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 4/46
A lista tulajdonságai Lista A BeszúrMögé művelet az aktuális elem mögé szúr be új elemet, és mindkét beszúr művelet után a beszúrt elem lesz az aktuális. Üres listára a BeszúrMögé hatása azonos a BeszúrElejére hatásával. A Kihagy az aktuális elemet hagyja ki, és utána a következő lesz az aktuális. Ha nem volt következő, akkor az aktuális az új utolsó lesz. Ha egyelemű volt, akkor nem lesz aktuális. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 5/46
Lista (dinamikus) láncolt ábrázolása: Típus TListaElem=Rekord(érték: Telem köv: Mutató(TListaElem)) Változó fej,akt: Mutató(TListaElem) hiba: Logikai Esetleg meggondolandó a lista elemszámának tárolása is. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 6/46
Eljárás Üres(L): L.fej:=sehova; L.akt:=sehova L.hiba:=Hamis Eljárás vége. Függvény üres?(l): üres?:=(l.fej=sehova) Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 7/46
Függvény Érték(L): Ha L.akt=sehova akkor L.hiba:=igaz különben Érték:=tartalom(L.akt).érték Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 8/46
Eljárás Elsőre(L): Ha L.fej=sehova akkor L.hiba:=igaz különben L.akt:=L.fej Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 9/46
Eljárás Következőre(L): Ha L.akt=sehova akkor L.hiba:=igaz különben L.akt:=tartalom(L.akt).köv Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 10/46
Eljárás BeszúrMögé(L,e): Ha L.fej=sehova akkor BeszúrElejére(L,e) különben Ha L.akt=sehova akkor L.hiba:=igaz különben Lefoglal(új,(e,tartalom(L.akt).köv)) tartalom(l.akt).köv:=új; L.akt:=új Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 11/46
Eljárás BeszúrElejére(L,e): régi:=l.fej; Lefoglal(L.fej,(e,régi)) L.akt:=L.fej Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 12/46
Eljárás Kihagy(L): Ha L.akt=sehova akkor L.hiba:=igaz különben ha L.akt=L.fej akkor L.fej:=tartalom(L.akt).köv Felszabadít(L.akt); L.akt:=L.fej... Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 13/46
... különben el:=l.fej Ciklus amíg tartalom(el).köv L.akt el:=tartalom(el).köv Ciklus vége tartalom(el).köv:=tartalom(l.akt).köv Felszabadít(L.akt) Ha tartalom(el).köv sehova akkor L.akt:=tartalom(el).köv különben L.akt:=el Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 14/46
Eljárás utolsó?(l): Ha L.akt=sehova akkor L.hiba:=igaz különben utolsó?:=tartalom(l.akt).köv=sehova Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 15/46
alkalmazás: kiválogatás Kiválogatás Bemenet: X H *, T:H L Kimenet: Y H * Előfeltétel: hossz(x)>0 Utófeltétel: Y X és y(y Y): T(y) és x(x X és x Y): nem T(x) Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 16/46
alkalmazás: kiválogatás Kiválogatás(L,M): Elsőre(L); Üres(M) Ciklus amíg nem utolsó?(l) e:=érték(l) Ha T(e) akkor BeszúrMögé(M,e) Következőre(L) Ciklus vége e:=érték(l) Ha T(e) akkor BeszúrMögé(M,e) Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 17/46
alkalmazás: Edényrendezés A rendezendő N elemű sorozat az 1..M értékeket tartalmazza. Vegyünk M edényt (most listát), amikbe szétválogatjuk az M-féle értéket, majd ezek egymás mögé másolásával előáll a rendezett sorozat! Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 18/46
alkalmazás: Edényrendezés Rendezés(X): Ciklus i=1-től M-ig Üres(L(i)) Ciklus vége Ciklus i=1-től N-ig BeszúrMögé(L(X(i)),X(i)) Ciklus vége... Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 19/46
alkalmazás: Edényrendezés... j:=0 Ciklus i=1-től M-ig Elejére(L(i)) Ciklus amíg L(i).akt Sehova j:=j+1; X(j):=Érték(L(i)) Következőre(L(i)) Ciklus vége Ciklus vége Eljárás vége. Megjegyzés: nem szép megoldás az ábrázolás ismeretének kihasználása (L(i).akt Sehova) Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 20/46
Definiáljunk egy új műveletet: vége?(l) legyen igaz, ha az utolsó elem utánra léptünk. Függvény vége?(l): vége?:=(l.akt=sehova) Függvény vége. Ekkor: Ciklus amíg L(i).akt Sehova Ciklus amíg nem vége?(l(i)) Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 21/46
alkalmazás: Beillesztéses rendezés Rendezés(X,L): Üres(L); BeszúrElejére(L,X(1)) Ciklus i=2-től N-ig Elsőre(L); e:=x(i) Ciklus amíg nem utolsó?(l) és e>érték(l) Következőre(L) Ciklus vége Ha e>érték(l) akkor BeszúrMögé(L,e) különben BeszúrElé(L,e) Ciklus vége Függvény vége. Baj van: annál az elemnél állunk, amely elé be kell szúrnunk az új elemet! Kivétel: ha éppen a lista végére kell tenni! Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 22/46
Definiáljunk egy új műveletet: BeszúrElé(L,e) az aktuális elem elé szúrjon be új elemet! (Hibakezelés meggondolandó!) Eljárás BeszúrElé(L,e): Ha üres?(l) akkor BeszúrElejére(L,e) különben f:=tartalom(l.akt).érték; akt:=l.akt tartalom(l.akt).érték:=e BeszúrMögé(L,f); L.akt:=akt Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 23/46
Lista (statikusan) láncolt ábrázolása: Típus TListaElem=Rekord(érték: Telem köv: Egész) Változó fej,akt: Egész t: Tömb(1..MaxHossz: TListaElem) szabad: Egész hiba: Logikai Megjegyzés: A szabad elemeket nekünk kell listába fűznünk. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 24/46
Eljárás Üres(L): L.fej:=0; L.akt:=0; L.szabad:=1 Ciklus i=1-től MaxHossz-1-ig L.t(i).köv:=i+1 Ciklus vége L.t(MaxHossz).köv:=0; L.hiba:=Hamis Eljárás vége. Függvény üres?(l): üres?:=(l.fej=0) Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 25/46
Függvény Érték(L): Ha L.akt=0 akkor L.hiba:=igaz különben Érték:=L.t(L.akt).érték Függvény vége. Eljárás Módosít(L,e): Ha L.akt=0 akkor L.hiba:=igaz különben L.t(L.akt).érték:=e Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 26/46
Eljárás Elsőre(L): Ha L.fej=0 akkor L.hiba:=igaz különben L.akt:=L.fej Eljárás vége. Eljárás Következőre(L): Ha L.akt=0 akkor L.hiba:=igaz különben L.akt:=L.t(L.akt).köv Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 27/46
Eljárás BeszúrMögé(L,e): Ha L.akt=L.fej akkor BeszúrElejére(L,e) különben Ha L.akt=0 vagy L.szabad=0 akkor L.hiba:=igaz különben s:=l.t(l.szabad).köv L.t(L.szabad):=(e,L.t(L.akt).köv) L.t(L.akt).köv:=L.szabad L.akt:=L.szabad; L.szabad:=s Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 28/46
Eljárás BeszúrElejére(L,e): Ha L.szabad=0 akkor L.hiba:=igaz különben s:=l.t(l.szabad).köv L.t(L.szabad):=(e,L.fej) L.fej:=L.szabad; L.akt:=L.fej L.szabad:=s Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 29/46
Eljárás Kihagy(L): Ha L.akt=0 akkor L.hiba:=igaz különben ha L.fej=L.akt akkor s:=l.fej L.fej:=L.t(L.fej).köv; L.akt:=L.fej L.t(s).köv:=L.szabad; L.szabad:=s... Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 30/46
... különben el:=l.fej; k:=l.t(el).köv Ciklus amíg L.t(el).köv L.akt el:=l.t(el).köv Ciklus vége L.t(el).köv:=L.t(L.akt).köv L.t(L.akt).köv:=L.szabad L.szabad:=L.akt Ha k sehova akkor L.akt:=k különben L.akt:=el Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 31/46
Függvény utolsó?(l): Ha L.akt=0 akkor L.hiba:=igaz különben utolsó?:=l.t(l.akt).köv=0 Függvény vége. Függvény vége?(l): vége?:=(l.akt=0) Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 32/46
Lista folytonos, szekvenciális ábrázolása: Típus TListaElemek=Tömb(1..MaxHossz:TElem) Változó t:tlistaelemek akt,hossz:0..maxhossz+1 hiba: Logikai Megjegyzés: A listaelemeket 1 és MaxHossz között helyezzük el. A listafej mindig az 1. elem. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 33/46
Eljárás Üres(L): L.akt:=0; L.hossz:=0; L.hiba:=Hamis Eljárás vége. Függvény üres?(l): üres?:=(l.hossz=0) Függvény vége. Függvény Érték(L) Ha L.akt [1..hossz] akkor Érték:=L.t(L.akt) különben L.hiba:=Igaz Függvény vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 34/46
Eljárás Elsőre(L): Ha L.hossz=0 akkor L.hiba:=Igaz különben L.akt:=1 Eljárás vége. Eljárás Következőre(L): Ha L.akt [1..hossz] akkor L.akt:=L.akt+1 különben L.hiba:=Igaz Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 35/46
Eljárás BeszúrElejére(L,e): Ha L.hossz=0 akkor L.t(1):=e; L.akt:=1 L.hossz:=1 különben ha L.hossz<MaxHossz akkor Ciklus i=l.hossz-tól 1-ig -1-esével L.t(i+1):=L.t(i) Ciklus vége L.t(1):=e; L.hossz:=L.hossz+1 L.akt:=1 különben Hiba:=igaz Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 36/46
Eljárás BeszúrMögé(L,e): Ha L.hossz=0 akkor L.t(1):=e; L.akt:=1 L.hossz:=1 különben ha L.akt=L.hossz és L.hossz<MaxHossz akkor L.akt:=L.akt+1 L.t(L.akt):=e L.hossz:=L.hossz+1 Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 37/46
különben ha L.akt [1..L.hossz-1] és L.hossz<MaxHossz akkor L.akt:=L.akt+1 Ciklus i=l.hossz-tól L.akt-ig -1-esével L.t(i+1):=L.t(i) Ciklus vége L.t(L.akt):=e; L.hossz:=L.hossz+1 különben L.hiba:=Igaz Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 38/46
Eljárás Kihagy(L): Ha L.akt [1..L.hossz-1] akkor Ciklus i=l.akt-tól L.hossz-1-ig L.t(i):=L.t(i+1) Ciklus vége L.hossz:=L.hossz-1 különben ha L.akt=L.hossz akkor L.hossz:=L.hossz-1; L.akt:=L.hossz különben L.hiba:=Igaz Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 39/46
Kétirányú lista A kétirányú lista olyan sorozat, amely a lista műveletein kívül az alábbi műveletekkel rendelkezik : Utolsóra(Lista): Lista {NemDef} Előzőre(Lista): Lista {NemDef} első?(lista): Logikai Ábrázolása: Típus TListaElem=Rekord(érték: Telem, köv,el:mutató(tlistaelem)) Változó fej,vég,akt: Mutató(TListaElem) hiba: Logikai Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:20 40/46
Kétirányú lista Eljárás BeszúrMögé(L,e): Ha L.fej=sehova akkor BeszúrElejére(L,e) különben Lefoglal(új,(e,tartalom(L.akt).köv,L.akt) tartalom(l.akt).köv:=új tartalom(tartalom(l.akt).köv).el:=uj L.akt:=új Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 41/46
Kétirányú lista Eljárás BeszúrElejére(L,e): régi:=l.fej; Lefoglal(L.fej,(e,régi,sehova)) tartalom(régi).el:=l.fej L.akt:=L.fej Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 42/46
Kétirányú lista Eljárás Kihagy(L): Ha L.akt=sehova akkor L.hiba:=igaz különben ha L.akt=L.fej akkor L.fej:=tartalom(L.akt).köv Felszabadít(L.akt); L.akt:=L.fej tartalom(l.akt).el:=sehova... Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 43/46
Kétirányú lista... különben el:=tartalom(l.akt).el köv:=tartalom(l.akt).köv Felszabadít(L.akt) tartalom(el).köv:=köv Ha köv sehova akkor tartalom(köv).el:=el L.akt:=köv különben L.akt:=el Elágazás vége Eljárás vége. Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:19 44/46
Ciklikus lista, gyűrű A ciklikus lista: Olyan egy- vagy kétirányú lista, amelynek az utolsó elemét az első követi, az elsőt pedig az utolsó előzi meg. Így kevesebb műveletre van szükség a megvalósításához. A gyűrű: Olyan ciklikus lista, amelynek nincs kitüntetett első, illetve utolsó eleme. Ábrázolása: Változó akt: Mutató(TListaElem) hiba: Logikai Szlávi Péter, Zsakó László: Adatszerkezetek I. 2018. 03. 07. 11:20 45/46
Algoritmusok és adatszerkezetek I. 4. előadás vége