Még mindig dinamikus memóriakezelés. Mégpedig, logikai adatszerkezetek:

Remélhetôleg mindenki hallott már a stack-rôl. Ez egy igen egyszerű adatszerkezet, amit úgy kell elképzelni, mint egy zsákot(vagy egy vermet). beledobálhatunk egy csomó dolgot, de kivenni mindig csak azt tudjuk, ami legfölül van(amit utoljára dobtunk be). Így aztán a cuccok fordított sorrendben jönnek ki. Elôször az utoljára bedobott, utoljára az elsô. A pc-ben ez az adatszerkezet igen gyakran használt. Magának a processzornak vannak veremkezelô utasításai és regiszterei. A stack-et mindenki használja tudta nélkül is, hiszen a lefordított gépi kódú program tutira fogja használni (paraméterátadás, lokális változók stb.). Az exe program saját stack-et, a com pedig a DOSét. A vermet maguk a megszakításrutinok is használják. Ez a stack természetesen nem dinamikus, mérete(1 szegmens) és az elemek mérete(16/32 bit) korlátozott, magas szintű programozási nyelvbôl közvetlenül nem elérhetô. De könnyen szükségünk lehet ilyen adatszerkezetre, úgyhogy csináljuk meg dinamikusan.

Verem:

Szóval, ha a vermet dinamikusan programozzuk, egy olyan láncolt listát kell modelleznünk, melyben mindegyik elem az ôt megelôzôre mutat. Ha a verembe beteszünk egy értéket, az mindig a sor végére kerül, és arra az elemre mutat, ami elôtte volt a vége, tehát az ôt megelôzôre. Ha a verembôl kiveszünk egy értéket azt is mindig a sor végérôl tesszük, ekkor a kivett elem által mutatott elem lesz az utolsó. Ezen kívül az elsô és utolsó elemet kitüntetettnek tekintjük, hiszen, ha ezek helyét nem tudnánk a memóriában csak a levegôben lógna az egész.

Ennek a gyakorlati megvalósításához szükség van a pointerekre, a struktúrákra, és egy kis cast-olásra. Ezen dolgokat kíséreltem meg az elôzô pár számban elmagyarázni. Nem tudom milyen sikerrel, mert sem építô jellegű, sem romboló jellegű(pedig már ennek is örülnék) kritikát nem kaptam.

Egy kis forráskód, aztán magyarázat:

//header-ek #include <malloc.h> #include <mem.h> //típusok typedef Tertek int; //ilyen típusú elemeket akarunk tárolni //(bármi lehet, akár struktúra is) typedef struct //egy elem típusa {   void *prev;   //mutató az elôzô elemre   Tertek ertek; //az elem valódi értéke } Telem;        //típus neve //változók struct {   Telem *begin; //mutató az elsô elemre   Telem *end;   //mutató az utlsó elemre   int elemnum;  //ennyi elem van } verem={NULL,NULL,0}; //változó neve és kezdôértéke int verembe(const Tertek ertek) {   Telem *newelem;   if((newelem=(Telem *)malloc(sizeof(Telem)))!=0)   {     if(verem.elemnum)     {      newelem->prev=(void *)verem.end;      verem.end=newelem;     }     else     {      verem.begin=newelem;      verem.end=newelem;     }     verem.elemnum++;     // verem.end->ertek=ertek; //érték átadása     memcpy(&verem.end->ertek,&ertek,sizeof(Tertek));     return(1);   } else return(0); } int verembol(Tertek *ertek) {   Telem *old;   if (verem.elemnum)   {     // *ertek=verem.begin->ertek; //ertek atadasa     memcpy(ertek,&verem.end->ertek,sizeof(Tertek));     old=verem.end;     verem.end=(Telem *)old->prev; //kovetkezo elem az utoso     free(old); //regi elem megszuntetese     verem.elemnum--;     return(1);   }   return(0); }

Egy pár új dolog azért becsúszott. Pl.: typedef. Segítségével típust tudunk csinálni. Használata:

typedef
név definíció.

Ilyen egyszerű. A forráskód a veremkezeléshez minimálisan szükséges 2 függvényt, a hozzájuk tartozó típusokat és egy darab változót mely az egész veremre vonatkozó adatokat tárolja. Új dolog még a memcpy függvény. Ez a memóriában való másolgatásra használható. Azért került a programba, mert így nem csak alaptípust tudunk értekként elrakni, hanem összetettet is. Használata: memcpy(void *mit, void *hova,int meret); Ha biztosak vagyunk abban, hogy a Tertek típus csak alaptípust takarhat, akkor persze a függvény használata elkerülhetô, helyette egy sima értékadás is megteszi.(felette levô sor)

Röviden ennyi a veremrôl. Persze sokféle modellt lehet alkotni. Lehet visszafele láncolt, vagy oda-vissza, vagy minden elemhez tartozhat másik kettô(bináris fa). El lehet vele lenni. A lemezmellékleten a sor gyakorlati megvalósítása található.