11E Muszë stwierdziê, ûe jestem pod wraûeniem. Nigdy nie byîem przekonany do twórczoôci Quentina Tarrantino. Wedîug mnie "Bad Lieutenant" ("Zîy porucznik") byî przesadnie brutalny. Nie podobaî mi sië. Natomiast ostatnie dzieîo -- "Pulp Fiction" -- jest po prostu rewelacyjne. Mimo nieprzeciëtnej dozy przemocy (czego bardzo nie lubië) film moûe zachwyciê. Rzeczywiôcie, zgodnie z nazwâ, jest to brukowa powieôê, jednak mistrzowsko pokazana. Poleciîbym ten film wszystkim kursantom E, jednak jest pewna przeszkoda -- "Pulp Fiction" jest, sîusznie zresztâ, dozwolony od 18 lat! Rafaî Wiosna Dziô na warsztacie mamy... Listy linkowane Wiem, wiem, ûe Lotny Patrol Lingwistyczny wydaî na mnie wyrok, a ciëûarówki wypeînione ich bojówkami juû tu jadâ. Brzydko to wyglâda i brzmi, jednak, jak sâdzë, utarîo sië sîowo "linkowaê", szczególnie w ôrodowisku programistów, a wîaônie do nich kierujë ten kurs. Amiga E ma pewnâ cechë, która jest bardzo rzadko spotykana (zwykle obsîuga list îâczonych, ang. linked lists, jest realizowana zewnëtrznymi procedurami, nie jest wbudowana "w jëzyk"). Znowu jak na dîoni widaê, ûe autor E wziâî najlepsze cechy kilku jëzyków, w tym miëdzy innymi jëzyka Lisp, który ûywi sië listami. Do miana listy linkowanej mogâ pretendowaê E-listy oraz E-ciâgi, gdyû to wîaônie te typy danych moûna obsîugiwaê za pomocâ pewnych funkcji, oferowanych przez E. Listë linkowanâ moûna porównaê do normalnej listy list, z tym ûe poszczególne jej elementy sâ porozrzucane po pamiëci, nie zajmujâ jednego ciâgîego kawaîka. Kaûdy z elementów takiej linkowanej listy otrzymuje dodatkowy parametr (niedostëpny dla programisty) -- wskaúnik do elementu nastëpnego. W szczególnym wypadku, kiedy dany element jest ostatnim w liôcie, wskaúnik ma wartoôê NIL (czyli zero). Co prawda autor E nie okreôliî zasady, ûe typy danych w linkowanej liôcie majâ byê te same (tzn. lista ma sië skîadaê tylko z E-list lub tylko E-ciâgów), jednak nie powinno sië zbytnio mieszaê -- wszak nie ma w E funkcji IsString() czy IsList(), które mogîyby odpowiedzieê na pytanie, czy dana dana jest ciâgiem czy listâ. Do obsîugi list linkowanych sîuûâ cztery funkcje. >Link(COMPLEX1,COMPLEX2)<. Funckja ta îâczy COMPLEX1 z COMPLEX2 (mogâ to byê dwie E-listy, dwa E-ciâgi lub E-lista i E-ciâg). W ekstremalnych wypadkach COMPLEX2 moûe mieê wartoôê NIL, co przydaje sië przy obcinaniu "ogona" linkowanej liôcie (jak juû wspomniaîem, element takiej listy, który wskazuje na NIL, jest traktowany jako ostatni). Nielinkowane E-ciâgi i E-listy majâ wskaúnik nastëpnego elementu ustawiony na NIL. Parametrem zwracanym przez funkcjë jest wskaúnik do COMPLEX1. Jest on potrzebny do poruszania sië po liôcie. Sîuûy do tego funcja >Next(COMPLEX)<. Zwraca ona wskaúnik do nastëpnego elementu wskazywanego przez COMPLEX. Jeûeli jest on ostatnim elementem listy, zwracany jest NIL. (Koniecznie naleûy sprawdziê, czy parametr COMPLEX nie jest przypadkiem NIL, gdyû inaczej dziaîanie funkcji nie jest okreôlone i moûe doprowadziê do zawieszenia sië komputera!). Oto przykîad uûycia Link() i Next(). (Zapis "->" oznacza "wskazuje/wskazujâcy na"). DEF s[23]:STRING, t[7]:STRING, lt[41]:LIST, lnk -> Najpierw tworzymy linkowalnâ listë lnk:=Link(lt,t) -> lista skîada sië z dwóch elementów: lt->t lnk:=Link(s,lt) -> teraz jest trzyelementowa: s->lt->t -> Utworzyliômy trzyelementowâ listë: s->lt->t->NIL -> Przykîad "wëdrówki" po liôcie (lnk wskazuje na s) lnk:=Next(lnk) -> Teraz lnk wskazuje na lt->t lnk:=Next(lnk) -> Teraz lnk wskazuje na t lnk:=Next(lnk) -> Teraz lnk ma wartoôê NIL, co oznacza koniec listy Warto zauwaûyê, ûe powinieneô trzymaê gdzieô wskaúnik na "gîowë" listy. Amiga E ma bardzo prostâ implementacjë list linkowalnych, umoûliwiajâcâ "wëdrówkë" tylko w przód. Moûna to nazwaê "listâ jednostronnie linkowanâ". Brak jest moûliwoôci wykonania funkcji Previous(), która zwracaîaby adres POPRZEDNIEGO elementu "listy linkowanej obustronnie". Tak wiëc, gdy powëdrujesz sobie funkcjâ Next() na koniec listy, utracisz tym samym jej gîowë (pierwszy element), chyba ûe zapamiëtasz jâ wczeôniej w jakiejô zmiennej. Wracajâc do funkcji Next(), moûna jâ wywoîaê z parametrem NIL i nic sië nie stanie (a dokîadniej -- zwróci NIL). Bardzo podobnâ funkcjâ, operujâcâ na listach linkowanych, jest >Forward(COMPLEX,LICZBA)<. Zwraca ona wskaúnik do elementu listy odlegîego od COMPLEX o LICZBA elementów. Jak moûna zauwaûyê, nast:=Next(lnk) to to samo co nast:=Forward(lnk,1) Instrukcja nast:=Forward(lnk,5) zwróci w zmiennej nast wskaônik do piâtego elemetu po lnk. Aby pozbyê sië ogona linkowanej listy, naleûy uûyê funkcji >DisposeLink(COMPLEX)<. Usunie ona z pamiëci wszystkie zlinkowane do COMPLEX elementy. Oto przykîad: -> Zakîadam, ûe mamy listë a->b->c->d->NIL ogon:=Link(b,NIL) DisposeLink(c) -> usuwa ogon c->d->NIL -> Teraz lista wyglâda tak: a->b->NIL W tym miejscu chciaîbym podkreôliê, ûe nie wolno îâczyê E-list lub E-ciâgów statycznych, gdyû mija sië to z celem. Pamiëtacie mój wywód na temat danych statycznych w poprzednim odcinku? Elementy list linkowanych powinny byê alokowane dynamicznie, za pomocâ funkcji List() i String()! Listy linkowalne sâ bardzo pomocne przy budowaniu kompleksowych struktur danych, a dokîadniej list dynamicznie alokowanych, tzn. takich, które mogâ sië rozszerzaê lub zmniejszaê, w zaleûnoôci od wyników dziaîania programu. Bardzo dobrym przykîadem na linkowane listy jest program D.e znajdujâcy sië w katalogu Src/Utils. * Tym razem odcinek jest krótszy niû zwykle, stwierdziîem, ûe nie ma sensu mëczyê Was na plaûy duûâ porcjâ informacji. W nastëpnym numerze zacznie sië prawdziwe miësko: wbudowane funkcje graficzno-intuicyjne (tzn. takie, które uûywajâ Intuition). Postaram sië wyjaôniê tajniki programowania systemu, chociaû polecam teû lekturë kursu (tfu!) C.