Lista típuskonstrukció Szlávi PéterP ELTE Informatika Szakmódszertani Csoport szlavi@ludens.elte.hu http://izzo.inf.elte.hu/~szlavi Copyright, 1999 Szlávi Péter Tartalomjegyzék 1 A lista algebrai specifikációja 1.1 Lista-mveletek 1.2 Lista-axiómák 2 A lista típuskonstrukció specifikációja 2.1 A lista exportmodulja 2.2 A lista megvalósítási moduljai 3 Alkalmazási példák 3.1 Kiválogatás tétel újrafogalmazása listára 3.2 Összefuttatás tétel újrafogalmazása listára 3.3 Beszúrásos rendezés Programozásmódszertan 2 Lista típuskonstrukció 1
1 A lista algebrai specifikáci ciója 1.1 Lista-mveletek Típus Lista(Elem): Asszociált mveletek: Üres: Lista Üres?(Lista): Logikai rték(lista): Elem U {NemDef} ElemMódos dosít(lista,elem): Lista U {NemDef} Els5re(Lista): Lista U {NemDef} Következ5re(Lista): Lista U {NemDef} BeszúrM rmögé(lista,elem): Lista U {NemDef} BeszúrElej relejére(lista,elem): re(lista,elem): Lista U {NemDef} Programozásmódszertan 3 1.1 Lista-mveletek (folytatás) Kihagy(Lista): Lista U {NemDef} UtolsóE?(Lista): Logikai U {NemDef} Kiegész szít) mveletek: BeszúrEl relé(lista,elem): Lista U {NemDef} ElemSzám(Lista): m(lista): Egész A kétirk tirányú lista további mveletei: El5z5re(Lista): Lista U {NemDef} Utolsóra(Lista): Lista U {NemDef} BeszúrEl relé(lista,elem): Lista U {NemDef} Els5E?(Lista): E?(Lista): Logikai U {NemDef} Programozásmódszertan 4 Lista típuskonstrukció 2
1.1 Lista-mveletek (folytatás) A ciklikus lista: olyan egy- vagy kétirányú lista,, amelynek az utolsó elemét t az els5 követi, az els5t t pedig az utolsó el5zi meg. Így kevesebb mveletre van szüks kségg a megvalósításához. A gyr: olyan ciklikus lista,, amelynek nincs kitüntetett els5 eleme. Programozásmódszertan 5 1.1 Lista-mveletek (folytatás) További lehetséges mveletek: Els5(Lista): (Lista Elem) U {NemDef} Következ5(Lista): (Lista Elem) U {NemDef} Utolsó(Lista): (Lista Elem) U {NemDef} El5z5(Lista): (Lista Elem) U {NemDef} Egymásut sután(lista,lista): Lista l,l,l,l :Lista(Elem) e,f:elem h,h :Eg :Egész Axiómák Programozásmódszertan 6 Lista típuskonstrukció 3
1.2 Lista-axi axiómák 1 o Az Üres lista üres. l=üres Üres?(l) 2 o Üres listának nincs eleme. Üres?(l) ElemSzám(l)=0 m(l)=0 3 o Az üres listának nincs aktuális, els5,,... utolsó eleme. rték( k(üres)=nemdef Els)E?( E?(Üres)=NemDef Els)(Üres)=NemDef Következ)(Üres)=NemDef El)z)(Üres)=NemDef Utolsó(Üres)=NemDef UtolsóE?( E?(Üres)=NemDef 4a o Nincs els5t t megel5z5 éss nincs utolsót t követk vet5 eleme a listának. El)z)(Els (Els)re(l))=NemDef Következ)(Utolsóra(l))=NemDef Programozásmódszertan 7 1.2 Lista-axi axiómák (folytatás) 4b o A ciklikus listában az els5t t megel5z5 az utolsó,, az utolsót t követk vet5 pedig az els5. El)z)(Els (Els)re(l))=Utolsó(l) Következ)(Utolsóra(l))=Els)(l) 5 o A lista Utolsóra mvelettel m kiválasztott eleme az ElemSzám-adik, az 1. elemét t az Els5re mvelet m választja v ki. UtolsóE?(Utols E?(Utolsóra(l)) Els)E?(Els E?(Els)re(l)) h=elemszám(l) m(l)-1 Következ)re h (Els)re(l))=Utols re(l))=utolsóra(l) ra(l) 0h<ElemSzám(l) m(l)-1 nem UtolsóE?(K E?(Következ)re h (Els)re(l))) 0<hElemSzám(l) m(l)-1 nem Els)E?(K E?(Következ)re h (Els)re(l))) Programozásmódszertan 8 Lista típuskonstrukció 4
1.2 Lista-axi axiómák (folytatás) 6 o A BeszúrM rmögé mvelet b5víti b a listát t az adott elemmel. Az új elem az aktuális mögé kerül. Üres listába els5ként kerül l be az új elem. Az újj válik v aktuáliss lissá.. Ha nincs aktuális elem, akkor a mvelet eredménye nem definiált. f= rték(l) l'=beszúrmögé(l,e): ElemSzám(l')=ElemSz m(l')=elemszám(l)+1 m(l)+1 rték(l')=e El)z)(l'). (l').elem=f Üres?(l) ElemSzám(Besz m(beszúrmögé(l,e))=1 rték(beszúrmögé(l,e))=e nem Üres?(l) rték(l)=nemdef BeszúrM rmögé(l,e)=nemdef A BeszúrEl relé mvelet ennek analógi giájára fogalmazható meg. Programozásmódszertan 9 1.2 Lista-axi axiómák (folytatás) 7 o Kihagyni az aktuális elemet lehet, az aktuális a következk vetkez5 lesz. Ha nincs az aktuális elem kijelölve, lve, akkor nem lehet kihagyni sem. ék(l) l'=kihagy(l): ElemSzám(l')=ElemSz m(l')=elemszám(l) m(l)-1 (Üres?(l ) rték(l')=következ)(l).elem) rték(l)=nemdef Kihagy(l)=NemDef Állítás: : ha az utolsó az aktuális,, akkor a kihagyás s után n nem definiált lesz az aktuális. UtolsóE?(l) rték(kihagy(l))= k(kihagy(l))=nemdef Biz.: UtolsóE?(l) ék(l) 7 o l =Kihagy(l) Kihagy(l):(Üres?(l ) rték(l')=következ)(l).elem) (1) Üres?(l ) 3 o rték(kihagy(l))= k(kihagy(l))=nemdef (2) rték(l')=következ)(l).elem 9 o 4a o ék(l') k(l')=nemdef Programozásmódszertan 10 Lista típuskonstrukció 5
1.2 Lista-axi axiómák (folytatás) 8 o Kétt egymásut sutánn illesztett lista listát t alkot. Elemei az eredeti kett5 elemei lesznek, az eredeti sorrendben. h=elemszám(l) m(l) h'=elemszám(l') m(l') l"=egymásut sután(l,l') k [0,h): rték(következ)re k (Els)re(l")))= = rték(következ)re k (Els)re(l))) k [0,h'): rték(következ)re k+h (Els)re(l")))= = rték(következ)re k (Els)re(l'))) Programozásmódszertan 11 1.2 Lista-axi axiómák (folytatás) 9 o A következk vetkez5 elem az, amelyet a következk vetkez5re lépésl s után n aktuá- lisként érzékelünk, az el5z5 az, amelyet az el5z5re lépésl s után aktuálisk lisként érzékelünk,... rték(l) k(l)nemdef Következ)(l) (l).elem=ék(következ)re(l)) El)z)(l) (l).elem = rték(el)z)re(l)) Els)(l) (l).elem = rték(els)re(l)) Utolsó(l) (l).elem = rték(utolsóra(l)) Programozásmódszertan 12 Lista típuskonstrukció 6
2 A lista típuskonstrukcit puskonstrukció specifikáci ciója 2.1 A lista exportmodulja ExportModul Lista(Típus TElem): Eljárás Üres( res(változó l:lista) Üres?( res?(konstans l:lista): Logikai rték( k(változó l:lista): TElem Eljárás ElemMódos dosít( t(változó l:lista, Konstans e:telem) Eljárás Els5re( re(változó l:lista) Eljárás Következ5re( re(változó l:lista) Meg kell gondolni az operátorok ef/uf-ét az axiómák k alapján! n! Programozásmódszertan 13 2.1 A lista exportmodulja (folytatás) Eljárás BeszúrM rmögé(változó l:lista, Konstans e:telem) Eljárás BeszúrElej relejére( re(változó l:lista, Konstans e:telem) Eljárás Kihagy(Változ ltozó l:lista) UtolsóE?( E?(Változó l:lista): Logikai ElemSzám( m(konstans l:lista): Egész Eljárás BeszúrEl relé(változó l:lista, Konstans e:telem) Hibás?( s?(változó l:lista): Logikai Programozásmódszertan 14 Lista típuskonstrukció 7
2.1 A lista exportmodulja (folytatás) Infix Operátor Azonos?(Konstans l1,l2:lista):logikai Logikai l1=l2 Infix Operátor LegyenEgyenl5(Változ ltozó l1:lista, Konstans l2:lista) l1:=l2 Operátor Ki(Konstans Konstans l:lista) Ki: l Operáto tor Be(Változ ltozó l:lista) Be: l Modul vége. v Programozásmódszertan 15 2.1 A lista exportmodulja (folytatás) A kétirk tirányú lista további mveletei: m Eljárás Utolsóra( ra(változó l:lista) Eljárás El5z5re( re(változó l:lista) Els5E?( E?(Változó l:lista): Logikai Programozásmódszertan 16 Lista típuskonstrukció 8
2 A lista típuskonstrukcit puskonstrukció specifikáci ciója 2.2. A lista megvalósítási si moduljai 2.2.1 Láncolt L ncolt ábrázolás Modul Lista(Típus TElem): Reprezentáci ció Típus ListaElem=Rekord Rekord(érték: TElem köv: ListaElem'Mutat 'Mutató) Változó fej,akt: ListaElem'Mutat 'Mutató hossz: : Egész hiba: Logikai Programozásmódszertan 17 2.2.1 Láncolt L ncolt ábrázolás (folytatás) Implementáci ció Eljárás Üres( res(változó l:lista): fej:=sehova; akt:=sehova; hossz:=0 hiba:=hamis Eljárás vége. Üres?( res?(konstans l:lista): Logikai Üres?:=hossz=0 vége. ElemSzám( m(konstans l: Lista): Egész ElemSzám:=hossz m:=hossz vége. Programozásmódszertan 18 Lista típuskonstrukció 9
2.2.1 Láncolt L ábrázolás (folytatás) rték( k(változó l:lista): TElem Ha aktsehova akkor rték:=listaelem(akt). k:=listaelem(akt).érték A függvf vége. értéke Eljárás Els5re( re(változó l:lista): Ha Üres(l) akkor akt:=fej Eljárás vége. Eljárás Következ5re(Változó l:lista): Ha aktsehova akkor akt:=listaelem(akt).köv Eljárás vége. A függvény értéke NemDef! Programozásmódszertan 19 2.2.1 Láncolt L ncolt ábrázolás (folytatás) Eljárás BeszúrM rmögé(változó l:lista, Konstans e:telem): Változó új j : ListaElem'Mutat 'Mutató gazás fej=sehova esetén BeszúrElej relejére(l,e) re(l,e) aktsehova esetén Lefoglal(új, ListaElem(e, ListaElem(akt).köv)) hiba:=új=sehova Ha nem hiba akkor ListaElem(akt).köv:= v:=új akt:=új; hossz:+1 gazáss végev egyéb b esetben gazáss végev Eljárás vége. Programozásmódszertan 20 Lista típuskonstrukció 10
2.2.1 Láncolt L ábrázolás (folytatás) Eljárás BeszúrElej relejére( re(változó l:lista, Konstans e:telem): Változó új: ListaElem'Mutat 'Mutató új:=fej; Lefoglal(fej,ListaElem(e,új)) j)) hiba:=fej=sehova Ha nem hiba akkor akt:=fej; hossz:+1 fej:=új Eljárás vége. Eljárás Kihagy(Változ ltozó l:lista): Változó el: ListaElem'Mutat 'Mutató Ha aktsehova akkor Ha akt=fej akkor [els5 elem] fej:=listaelem(akt).köv Felszabadít(akt); akt:=fej Programozásmódszertan 21 2.2.1 Láncolt L ncolt ábrázolás (folytatás) [nem aza els5 elem] [el5z5 elem megkeresése:] se:] el:=fej Ciklus amíg ListaElem(el).kövakt akt el:=listaelem(el).köv Ciklus végev ListaElem(el).köv:=ListaElem(akt).k v:=listaelem(akt).köv Felszabadít(akt); akt:=listaelem(el).köv gazáss végev hossz:-1 [nincs aktuális elem] gazáss végev Eljárás vége. Programozásmódszertan 22 Lista típuskonstrukció 11
2.2.1 Láncolt L ábrázolás (folytatás) UtolsóE?( E?(Változó l:lista): Logikai Ha aktsehova akkor UtolsóE?:=ListaElem(akt).k E?:=ListaElem(akt).köv=sehova vége. Hibás?( s?(változó l:lista): Logikai Hibás?:=hiba; hiba:=hamis vége. Infix Operátor Azonos?(Konstans l1,l2:lista):logikai Logikai l1=l2 Operátor vége. v Programozásmódszertan 23 2.2.1 Láncolt L ncolt ábrázolás (folytatás) Infix Operátor LegyenEgyenl5(Változ ltozó l1:lista, Konstans l2:lista): l1:=l2 Operátor vége. v Operátor Ki(Konstans Konstans l:lista): Ki: l Operátor vége. v Operáto tor Be(Változ ltozó l:lista): Be: l Operátor vége. v Inicializálás [minden lista-deklar deklarációkor végrehajtandv grehajtandó] fej:=sehova; akt:=sehova; hossz:=0; hiba:=hamis Modul vége. v Programozásmódszertan 24 Lista típuskonstrukció 12
2 A lista típuskonstrukcit puskonstrukció specifikáci ciója 2.2. A lista meglósítási si moduljai 2.2.2 Folytonos ábrázolás Modul Lista(Típus TElem): Reprezentáci ció Típus ListaElemek=Tömb mb(1..maxszám: TElem) Változó le: ListaElemek akt,hossz: 0..MaxSzám+1 hiba: Logikai Programozásmódszertan 25 Kényelmességb$l; l; l. l. KKövetkez$re, El$z$re 2.2.2 Folytonos ábrázolás (folytatás) Implementáci ció Eljárás Üres( res(változó l:lista): akt:=0; hossz:=0; hiba:=hamis Eljárás vége. Üres?( res?(konstans l:lista): Logikai Üres?:=hossz=0 vége. ElemSzám( m(konstans l: Lista): Egész ElemSzám:=hossz m:=hossz vége. v rték( k(változó l:lista): TElem Ha akt [1..hossz] akkor rték:=le(akt) vége. v A f Programozásmódszertan 26 A függvény értéke NemDef! Lista típuskonstrukció 13
2.2.2 Folytonos ábrázolás (folytatás) Eljárás Els5re( re(változó l:lista): Ha hossz=0 akkor akt:=1 Eljárás s vége. v Eljárás Következ5re( re(változó l:lista): Ha akt [1..hossz] akkor akt:+1 Eljárás s vége. v Eljárás El5z5re( re(változó l:lista): Ha akt [1..hossz] akkor akt:-1 Eljárás s vége. v Programozásmódszertan 27 2.2.2 Folytonos ábrázolás (folytatás) Eljárás Utolsóra( ra(változó l:lista): Ha hossz=0 akkor akt:=hossz Eljárás s vége. v Eljárás BeszúrM rmögé(változó l:lista, Konstans e:telem): Változó i:1..maxszám gazás hossz=0 esetén le(1):=e; akt:=1; hossz:=1 akt=hossz és hossz<maxszám esetén akt:+1; le(akt):=e; hossz:+1 Programozásmódszertan 28 Lista típuskonstrukció 14
2.2.2 Folytonos ábrázolás (folytatás)... akt [1..hossz-1] 1] és hossz<maxszám esetén akt:+1 Ciklus i=hossz-tól akt-ig -1-esével le(i+1):=le(i) Ciklus végev le(akt):=e; hossz:+1 egyéb esetben gazáss végev Eljárás s vége. v Programozásmódszertan 29 2.2.2 Folytonos ábrázolás (folytatás) Eljárás Kihagy(Változ ltozó l:lista): Változó i :1..MaxSzám Ha akt [1..hossz] akkor Ciklus i=akt-tól hossz-1-ig le(i):=le(i+1) Ciklus végev hossz:-1 gazáss végev Eljárás s vége. v UtolsóE?( E?(Változó l:lista): Logikai Ha akt [1..hossz] akkor UtolsóE?:=akt=hossz vége. v Programozásmódszertan 30 Lista típuskonstrukció 15
2.2.2 Folytonos ábrázolás (folytatás) Els5E?( E?(Változó l:lista): Logikai Ha akt [1..hossz] akkor Els5E?:=akt=1 E?:=akt=1 A függvf vége. v értéke Hibás?( s?(változó l:lista): Logikai Hibás?:=hiba; hiba:=hamis vége. v Infix Operátor Azonos?(Konstans l1,l2:lista):logikai Logikai l1=l2 Operátor vége. A függvény értéke NemDef! Programozásmódszertan 31 2.2.2 Folytonos ábrázolás (folytatás) Infix Operátor LegyenEgyenl5(Változ ltozó l1:lista, Konstans l2:lista): l1:=l2 Operátor vége. v Operátor Ki(Konstans Konstans l:lista): Ki: l Operátor vége. v Operáto tor Be(Változ ltozó l:lista): Be: l Operátor vége. v Inicializálás akt:=0; hossz:=0; hiba:=hamis Modul vége. v Programozásmódszertan 32 Lista típuskonstrukció 16
3 Alkalmazási példp ldák 3.1 Kiválogatás tétel újrafogalmazása listára 3.2 Összefuttatás tétel újrafogalmazása listára 3.3 Beszúrásos rendezés Programozásmódszertan 33 3.1 Kiválogat logatás Típus TLista=Lista( =Lista(TElem) ) [a rövidsr vidségg kedvéé éért] Ttul(Konstans e:telem): Logikai egy TElem típust pusú e adatra vonatkozó predikátum tum vége. v Eljárás Kiválogat logatás( s(konstans l:tl TLista, Változó t1:tl TLista) ista): Üres(tl); Els5re(l) [a tl-lel lel szinkron száml mláló nem kell!] Ciklus amíg g nem UtolsóE?(l) Ha Ttul( rték(l)) akkor BeszúrM rmögé(tl,ék(l)) gazáss végev Következ5re(l) Elemfeldolgozás Ciklus végev az utolsóig. Ha Ttul( rték(l)) akkor Az utolsó elem BeszúrM rmögé(tl,ék(l)) feldolgozása Eljárás s vége. v Programozásmódszertan 34 Lista típuskonstrukció 17
3.2 Összefuttatás Részben megvalósítási si szinten (láncoltan) fogalmazzuk meg; x éss y a végénv n törlt rl)dik! Eljárás Összefuttatás( s(változó x,y,z:tlista): Üres(z); Elejére(x); Elejére(y) Ha rték(x) k(x)ék(y) akkor z.fej:=x.fej; z.akt:=z.fej; KövetkezK vetkez5re(x) z.fej:=y.fej; z.akt:=z.fej; KövetkezK vetkez5re(y) gazáss végev Ciklus amíg x.aktsehova és y.aktsehova gazás rték(x)<ék(y) esetén ListaElem(z.akt).köv:=x.akt; z.akt:=x.akt Következ5re(x) Programozásmódszertan 35 3.2 Összefuttatás (folytatás)... rték(x)=ék(y) esetén ListaElem(z.akt).köv:=x.akt; z.akt:=x.akt Következ5re(x); KövetkezK vetkez5re(y) rték(x)>ék(y) esetén ListaElem(z.akt).köv:=y.akt; z.akt:=y.akt Következ5re(y) gazáss végev Ciklus végev Ha x.aktsehova akkor ListaElem(z.akt).köv:=x.akt Ha y.aktsehova akkor ListaElem(z.akt).köv:=y.akt Üres(x); Üres(y) Eljárás s vége. v Programozásmódszertan 36 Lista típuskonstrukció 18
3.3 Beszúrásos sos rendezés Típus TRendezend5=Tömb(1..Max: (1..Max:TElem) TRendezett= Rendezett=Lista(TElem) [növekv vekv5en] en] Eljárás Rendezés(Konstans t:trendezend Rendezend5, Változó l:trendezett) Rendezett): Változó i:egész Üres(l) Ciklus i=1-t4l N-ig Els5re(l); e:=t(i) Ciklus amíg nem UtolsóE?(l) és e> rték(l) Következ5re(l) Ciklus végev Ha e> rték(l) akkor BeszúrM rmögé(l,e) BeszúrEl relé(l,e) Ciklus végev Eljárás s vége. v Programozásmódszertan 37 Megjegyzés -- Változó A Változó -ság oka: valamilyen hiba lehet5sége fönnf nnáll (üres( a lista, vagy nincs kijelölt lt aktuális elem), s ennek visszajelzésére a hiba mez5 változhat. Programozásmódszertan 38 Lista típuskonstrukció 19
Megjegyzés -- Lista x Lista a függvf ggvény értékkészletében: mivel a m<velet m elvégz gzése során, bal kézr5l olyan --a a lista állapotátt meg- határoz rozó-- jellemz5 (is) megváltozhat (pl. az akt- vagy a hiba-mez mez5,, amely els5 látásra nem várhatv rható. Programozásmódszertan 39 Megjegyzés --.Lista/.Elem Az algebrai leírásban a nem aktuális elem értékétt visszaadó függvények (El5z5, Következ5,, Els5,, Utolsó) összetett értékének elemrész szére a '.Elem'.Elem' mez5szelektorral hivatkozunk, a listarész szére '.Lista'-val. Programozásmódszertan 40 Lista típuskonstrukció 20