4. Adatszerkezetek


   Ebben a fejezetben adatszerkezetekkel kétféle  szempontból
foglalkozunk. Egyrészt olyan feladatokat adunk, amelyek adat-
szerkezetek megvalósításával, másrészt pedig olyanokat,  ame-
lyek adatszerkezetek alkalmazásával kapcsolatosak.
   Ahogyan az algoritmusok körében használunk elemi  utasítá-
sokat, illetve a végrehajtás menetét  szervező  utasításokat,
ugyanúgy az adatok körében is megkülönböztetünk elemi, illet-
ve összetett adatokat (adatszerkezeteket).
   Háromféle összetételi módot használunk: az elsőnél az adat
néhány, esetleg különböző típusú  elemibb  adat  egymásutánja
(rekord), a másodiknál a részekre  osztás  többféleképpen  is
megtörténhet (alternatív szerkezet, rekord), míg  a  harmadik
esetén azonos tipusú elemek sokaságából. Az első kettővel  az
adatfeldolgozásról szóló fejezetben foglalkozunk.
   A harmadik esetben halmazról beszélünk, ha az  elemek  kö-
zött nincs semmiféle sorrend, sorozatról, ha  minden  elemhez
egyértelműen tartozik egy következő elem, hierarchikus  szer-
kezetről (fa), ha egy elem után több következő is lehet,  il-
letve hálós szerkezetről (gráf), ha több előző is lehet.
   A fejezetben vizsgált adatszerkezetek:

      - lista,
      - verem,
      - sor,
      - tömb, táblázat,
      - fa,
      - gráf,
      - adatállományok.

Javasolt irodalom:

1. J. Nievergelt - J.C. Farrar -  E.M. Reingold:  Matematikai
   problémák megoldásainak számítógépes módszerei.
   Műszaki Könyvkiadó, 1977.
2. O.J. Dahl  -  E.W. Dijkstra  -  C.A.R. Hoare:  Struktúrált
   programozás.
   Műszaki Könyvkiadó, 1978.
3. Varga L.: Rendszerprogramok elmélete és gyakorlata.
   Akadémiai Kiadó, 1978.
4. A.V. Aho - J.E. Hopcroft - J.D. Ullman:  Számítógép  algo-
   ritmusok tervezése és analízise.
   Műszaki Könyvkiadó, 1982.
5. N. Wirth: Algoritmusok + adatstruktúrák = programok.
   Műszaki Könyvkiadó, 1982.
6. D.E. Knuth: A számítógépprogramozás mővészete, 1.
   Műszaki Könyvkiadó, 1987.
7. Számítástechnika középfokon.
   OMIKK, 1987.


4.1 Lista


   LISTA adatszerkezetről beszélünk,  ha  az  elemek  fizikai
sorrendjétől eltérő logikai sorrendet jelölünk ki mutatók se-
gítségével. Egy elem mutatója a logikai sorrendben mindig  az
őt követő elem fizikai helyét mutatja.
   Ezt az adatszerkezetet gyakran kell  alkalmazni.  Hasznos,
ha az adathalmazunk olyan nagy, hogy nem tudjuk egy  megenge-
dett tárolási egységben elhelyezni. Ilyenkor  a  'csomagokat'
egymásután fűzve elérhetjük a megfelelő  méretet.  Használjuk
akkor is, ha egy adategység olyan nagy,  hogy  mozgatása  sok
időt vesz igénybe és mi rendezett adathalmazt szeretnénk lét-
rehozni. Ebben az esetben azért lesz a lista praktikus,  mert
itt az elemek logikai sorrendje nem  feltétlenül  kell,  hogy
megegyezzen a fizikai sorrenddel. LISTA használatával az ele-
meket tetszőleges számú szempont szerint  fel  tudjuk  fűzni,
így az adatok mozgatása nélkül lehet többféle  rendezettséget
felépíteni.
   Célszerű a használata akkor is, ha az adathalmazban gyako-
ri a törlés, illetve a beszúrás művelete.


4.2 Verem


   A VEREM olyan adatszerkezet, amelynél mindig  az  utoljára
berakott elemet tudjuk megnézni, illetve megnézni és levenni.
—j adatot csak a VEREM tetejére lehet rakni.
   Eljárások, rekurzió megvalósítása  lényegesen  egyszerűbb,
ha tudunk vermet használni a paraméterek  és  a  visszatérési
cím tárolására. Ezt az adatszerkezetet általában önállóan nem
használjuk, hanem mindig valamilyen  jellegű  feladat  megol-
dására (pl. fabejárásnál hol kell  a  bejárást  folytatni,  a
QUICKSORT rendezésnél milyen szakaszokat  kell  még  rendezni
stb.). Ezeket a feladatokat a megfelelő  részeknél  helyeztük
el, így itt csak néhány általános jellegű feladatot közlünk.
   Az alfejezet végén található feladatok  a  FORTH  nyelvhez
kapcsolódnak. Ebben a nyelvben szinte minden  adatot  verembe
kell helyezni, s ott végezni velük műveleteket. A FORTH nyelv
emiatt néhány újabb műveletet definiál veremkezelésre: a fel-
ső két elem cseréje, a legfelső megduplázása, a felső  alatti
megduplázása, a felső három ciklikus cseréje stb.


4.3 Sor


   Olyan adatszerkezettel foglalkozunk ebben az alfejezetben,
amelyet sokszor alkalmazunk, talán anélkül, hogy tudnánk  ró-
la. Az adathalmaz elemeit csak olyan sorrendben tudjuk olvas-
ni, ahogyan beraktuk. Akkor hasznos az adatok ilyen  tárolása
például, ha adatállományt küldünk egy gépről egy másik  gépre
és a két eszköz sebessége nem  azonos.  Ilyenkor  létrehoznak
egy ideiglenes adattárolót, un. puffert, amelynek az a  funk-
ciója, hogy a küldött  adathalmazt  fogadja,  majd  ha  nincs
több, vagy elfogyott a hely  a  pufferben,  akkor  továbbítsa
feldolgozásra. Természetes, hogy  az  adatok  sorrendjét  nem
változtatja meg, hisz furcsa is  lenne,  ha  egy  nyomtatandó
szöveg betűit felcserélné.
   A feladatok modellezni próbálják az adatszerkezetet,  majd
egészen összetett problémákon keresztül mutatják meg  a  gya-
korlatban is előforduló feladatok nehézségét.
   Az alfejezetben szereplő  diszkrét  szimulációs  feladatok
megoldásához  szükségeses  valószinűségszámítási   ismeretek.
Ezek alapján lehet meghatározni  a  'rendszertelenül  érkező'
elemek (vásárlók, autók stb.) érkezésének eloszlását.


4.4 Tömbök; táblázatok


   Gyakran adódik olyan probléma, hogy az adathalmaz  elemeit
nem sorban egymás után szeretnénk elérni.  Ilyenkor  célszerű
táblázatok (vagy másként: mátrixok, tömbök) alkalmazása.
   A táblázatokkal kapcsolatos feladatokat csoportosítani le-
het például a következő szempontok szerint. Az egyik  csopor-
tot azok alkotják, melyekben nem a mátrix egésze a  lényeges,
csak az egyes elemek. Ilyen feladatok például a TBLZATOKban
való keresés, elemek valamilyen szempont szerinti csoportosí-
tása. A másik feladatcsoport lehetne, a MTRIX  egészére  vo-
natkozó SZMITSOK elvégzése (mátrixszorzás, összeadás stb.).
A harmadik problémakört a mátrixok  tárolásaival  kapcsolatos
feladatok alkotják. Ez egyrészt azért fontos, mert a memóriá-
ban csak sorban, egymás után helyezkedhetnek  el  az  adatok,
mégis meg kell valahogyan oldani az indexek alapján az elemek
elérését.
   Egy másik jellemző problémakör  az  elemek  tárolása.  Sok
egyforma elem esetén célszerű csak  a  különbözőket  tárolni.
Ezt ketté lehet választani. Nem mindegy ugyanis, hogy a  sok-
szor előforduló  elemek  valamilyen  szabályos  elrendezésben
szerepelnek, vagy szétszórtan. Az első esetben  lehet  azt  a
megoldást választani, hogy a tárolandó elemeket sorban lerak-
juk a memóriába és egy un.  CMFÜGGVÉNY  segítségével,  adott
koordinátákból kiszámítjuk a memóriabeli helyét. Ha nem talá-
lunk a nullától különböző elemek elhelyezkedésében  semmilyen
rendszert, akkor HÉZAGOSAN KITÖLTÖTT MTRIXokkal van dolgunk.


4.5 Fa és gráf


   Halmazbeli elemek közti kapcsolatokat gyakran  kell  olyan
formában leírni, hogy azt számítógéppel is kezelni  lehessen.
Tipikus feladatok közé tartozik például két  helység  közötti
legrövidebb út megtalálása. Egy ilyen  gráfot  többféleképpen
is meg lehet adni. Egyik módja, hogy megadjuk az  élek  által
összekötött csúcsokat, máik lehetőség, hogy ún. csúcsmátrixot
veszünk fel. Ebben a megszámozott  csúcsokat  felírjuk  'víz-
szintesen' és 'függőlegesen', majd  az  így  kapott  mátrixba
1-est írunk oda, ahol a két csúcs között  él  van.  Speciális
gráfként természetesen fákat is lehet ábrázolni, sőt  speciá-
lis, bináris fát is. A bináris fák használata nagyon tanácsos
nagy adathalmaz tárolásakor, ha valamilyen rendezettséget vá-
runk el. Ilyenkor ugyanis optimális felírási  sorrend  esetén
nagyon kevés lépés kell egy elem kiválasztásához.


4.6 Adatállományok


   A számítógépek egyik legfontosabb alkalmazási területe  az
adatfeldolgozás. Nagy  adathalmaz  kezelése  elképzelhetetlen
lenne olyan eszközök nélkül, amelyek az adatok maradandó  tá-
rolását teszik  lehetővé.  Az  ilyen  eszközökön  létrehozott
adatállományokat file-oknak is nevezzük. Többek között  hasz-
nálunk szekvenciális, relatív (direkt elérésű) adatállományo-
kat az adatok tárolására. Ezek szervezésével,  lehetőségeinek
kihasználásával foglalkozik ez az alfejezet. A konkrét megva-
lósítások nagyon gépfüggőek ezért az  Olvasóra  bízzuk,  hogy
azt a saját gépén megvalósítsa.