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
???