Dinamičke strukture podataka

Download Report

Transcript Dinamičke strukture podataka

Programski jezici
Dinamičke strukture podataka
Dinamičke strukture podataka





Statičke i dinamičke strukture podataka
Pokazivači
Korišćenje pokazivača
Pokazivači u C-u
Lančane liste u C-u
Statičke i dinamičke strukture podataka


Statičke strukture - zauzimanje memorijskog
prostora vrši se u fazi kompajliranja programa.
Jednostavnije su za primenu i brže.
Dinamičke strukture - zauzimanje memorijskog
prostora vrši se u fazi izvršavanja programa,
memorijski prostor se koristi racionalnije i
moguće je menjati strukturu u toku izvršavanja
programa.
Dinamičke strukture



Osnovna dinamička struktura – lista
Lista je osnova za definisanje linearnih struktura
podataka tipa magacina, redova, različitih tablica
sa unapred nepoznatim brojem elemenata, kao i
nelinearnih struktura kao što su stabla, grafovi i
mreže
Primer primene dinamičkih struktura – retka ili
slabo popunjena matrica u kojoj veći broj
elemenata ima vrednost nula

Pamte se nenulti elementi i njihova lokacija u matrici
Pokazivači



Mogućnost definisanja tipova podataka koji se
sastoje od neograničenog skupa pokazivača na
vrednosti određenog tipa podataka
Tip pokazivača se obično povezuje sa nekim
tipom podatka, najčešće sa strukturnim tipom
kojim se definišu slogovi koji se povezuju u
dinamičku strukturu podataka
U slogovima se obično nalazi jedan ili više
pokazivača istog tipa preko kojih se slogovi
povezuju u određenu strukturu podataka
Pokazivači



Nad pokazivačima su definisane jedino operacije
poređenja u smislu jednakosti i nejednakosti
Svakom tipu pokazivača pripada i vrednost NIL
(prazan pokazivač) koja ne pokazuje ni na jedan
element strukture
U programskim jezicima se koriste različite oznake za
predstavljanje pokazivača, ali je sintaksa naredbi za
njihovo definisanje slična


type Pokazivac = ^T; T = record ... ;
var P : Pokazivac;
Korišćenje pokazivača

Pokazivači se obično koriste za definisanje
struktura podataka tipa listi
Magacin
 Red
 Ciklički red

Magacin
Operacije nad magacinom



Moguće su samo na vrhu magacina
Dodavanje novog sloga u magacin
Brisanje sloga iz magacina
Red
L
Info
Link
Info
Link
R
.
.
.
Info
Link
NIL
Operacije nad redom


Dodavanje slogova (vrši se sa desne strane)
Izbacivanje slogova (vrši se sa leve strane)
Ciklički red
R
L
Info
Link
Info
Link
...
Info
Link
Pokazivači u C-u
int a[10], *pa, *pb, x, y; /* niz, pokazivači, podaci; */
pa = & a[4];
/* pa pokazuje na a[4]; */
x = *(pa +3)
/* x = a[7]; */
y = *pa + 3
/* y = a[4] + 3; */
*pa++;
/* povećava se vrednost pokazivača*/
(*pa) ++; /* povećava se pokazivani podatak*/
pb = &a[2];
/* pb pokazuje na a[2]; */
if (pa < pb) …
/* poređenje pokazivača; */
Lančane liste u C-u






Omogućavaju pamćenje većeg broja podataka istog tipa u
operativnoj memoriji.
Za svaki element ponaosob rezerviše se prostor za njegovo
smeštanje onog trenutka kada se pojavi potreba za tim elementom.
U trenutku kada element više nije potreban, on se nezavisno od
ostalih elemenata briše iz operativne memorije.
Da bi se ova logika podržala, svaki element u lančanoj listi sadrži i
pokazivač na sledeći element liste.
Da bi se pristupilo elementima ovakve strukture, potrebno je znati
adresu prvog elementa u listi.
Pokazivač koji ukazuje na prvi element liste naziva se glavnim
pokazivačem liste, odnosno glavom.
Lančane liste u C-u

stuktura lančane liste
Lančane liste u C-u

Za predstavljanje elemenata liste koristi se sledeći
tip podataka:
typedef struct element
{
int info;
struct element* next;
} cvor;
Lančane liste u C-u

Glavni pokazivač liste je pokazivač na prvi element u listi. On mora
biti definisan kao pokazivač na navedenu strukturu:
void main()
{
cvor *glava=NULL;
:
}

U radu sa lančanom listom, najbitiniji postupci su: dodavanje
novog elementa listi, izbacivanje elementa iz liste i obilazak liste –
tj. pristup svakom elementu liste radi neke obrade.

dodavanje novog elementa listi koja predstavlja niz celih brojeva uređen u
neopadajućem redosledu
cvor *dodaj(cvor *glava, int broj)
{
cvor *tekuci, *prethodni, *novi;
tekuci = glava;
prethodni = NULL;
while( tekuci != NULL && tekuci->info < broj )
{
prethodni = tekuci;
tekuci = tekuci->next;
}
novi=(cvor*)malloc(sizeof(cvor));
novi->info=broj;
novi->next=tekuci;
if ( prethodni == NULL )
glava=novi;
else
prethodni->next=novi;
return glava;
}

Brisanje zadatog elementa iz liste koja predstavlja niz celih brojeva uređen u
neopadajućem redosledu
cvor *brisi(cvor *glava, int broj)
{
cvor *tekuci, *prethodni;
tekuci = glava;
prethodni = NULL;
while( tekuci != NULL && tekuci->info < broj )
{
prethodni = tekuci;
tekuci = tekuci->next;
}
if ( tekuci != NULL && broj==tekuci->info )
{
if ( prethodni == NULL )
glava=glava->next;
else
prethodni->next = tekuci->next;
free(tekuci);
}
else
printf( "broj %d ne postoji u listi\n", broj );
return glava;
}

Štampanje elementa liste
void stampaj(cvor* glava)
{
cvor *tekuci = glava;
while ( tekuci != NULL )
{
printf("%d, ", tekuci->info );
tekuci = tekuci->next;
}
printf("\n");
}
Pitanja
???