180 likes | 381 Views
Algoritmi i strukture podataka. Red. Red. red ( queue ) je linearna lista kod koje se umetanje u listu izvodi na jednom, a brisanje iz liste na njenom drugom kraju načelo FirstInFirstOut ( FIFO ) koriste se dva indeksa ( ulaz i izlaz )
E N D
Red • red (queue) je linearna lista kod koje se umetanje u listu izvodi na jednom, a brisanje iz liste na njenom drugom kraju • načelo FirstInFirstOut (FIFO) • koriste se dva indeksa (ulaz i izlaz) • kraj reda na kojem se vrši umetanje naziva se ulaz(stražnji kraj - rear) • drugi kraj je izlaz (prednji kraj - front) • funkcije: dodaj, skini 1 -4 7 2 ulaz izlaz Algoritmi i strukture podataka
Cirkularnost • učinkovit način realizacije reda statičkom strukturom je jednodimenzionalno polje zadane podatkovne strukture koje se koristi cirkularno • cirkularnost se ostvaruje uporabom operatora modulo (%) • jedan element niza je prazan • time se omogućuje razlikovanje praznog i punog reda • prazan red: ulaz == izlaz • puni red: (ulaz + 1) % maxelemenata == izlaz • kad bi cijeli niz bio ispunjen, morali bismo imati brojač elemenata • RedPoljem Algoritmi i strukture podataka
Cirkularna lista 15 0 ulaz 14 1 -4 2 21 13 2 19 3 12 9 -5 11 4 8 12 5 10 5 3 1 9 6 izlaz 8 7 Algoritmi i strukture podataka
Prazan red realiziran cirkularnim poljem 15 0 ulaz 14 1 13 2 3 12 11 4 10 5 9 6 izlaz 8 7 Algoritmi i strukture podataka
Puni red realiziran cirkularnim poljem 15 0 ulaz 14 1 -4 2 21 1 13 2 19 4 3 12 9 0 -5 -1 11 4 8 21 12 11 10 5 3 9 6 izlaz 8 7 Algoritmi i strukture podataka
Dodavanje elemenata u red int dodaj (int element, int red[], int n, int izlaz, int *ulaz) { if (((*ulaz+1) % n) == izlaz) return 0; (*ulaz)++; *ulaz %= n; red [*ulaz] = element; return 1; } ulaz izlaz 15 0 14 1 2 7 -4 5 13 2 #define MAXRED 16 dodaj(5, red, MAXRED, izlaz, &ulaz); dodaj(2, red, MAXRED, izlaz, &ulaz); dodaj(7, red, MAXRED, izlaz, &ulaz); dodaj(-4, red, MAXRED, izlaz, &ulaz); dodaj(1, red, MAXRED, izlaz, &ulaz); 3 1 2 3 12 8 1 4 11 0 -1 9 6 5 10 7 4 9 6 7 8 Algoritmi i strukture podataka
Skidanje elemenata iz reda realiziranog cirkularnim poljem int skini (tip *element, tip red[], int n, int *izlaz, int ulaz) { if (ulaz == *izlaz) return 0; (*izlaz) ++; *izlaz %= n; *element = red[*izlaz]; return 1; } ulaz izlaz 15 0 14 1 2 7 -4 5 13 2 #define MAXRED 16 skini(&broj, red, MAXRED, izlaz, &ulaz); skini(&broj, red, MAXRED, izlaz, &ulaz); skini(&broj, red, MAXRED, izlaz, &ulaz); 3 1 2 3 12 8 1 4 11 0 -1 9 6 5 10 7 4 9 6 7 8 Algoritmi i strukture podataka
Skidanje elemenata iz reda realiziranog cirkularnim poljem - II int skini (tip *element, tip red[], int n, int *izlaz, int ulaz) { if (ulaz == *izlaz) return 0; (*izlaz) ++; *izlaz %= n; *element = red[*izlaz]; return 1; } ulaz izlaz 15 0 14 1 2 7 -4 5 13 2 #define MAXRED 16 skini(&broj, red, MAXRED, &izlaz, ulaz); skini(&broj, red, MAXRED, &izlaz, ulaz); skini(&broj, red, MAXRED, &izlaz, ulaz); skini(&broj, red, MAXRED, &izlaz, ulaz); 3 1 2 3 12 8 1 4 11 0 -1 9 6 5 10 7 4 9 6 7 8 Algoritmi i strukture podataka
Realizacija reda listom • problem kod realizacije poljem jest mogućnost popunjenja • u stvarnosti veličina reda nije ograničena • realnija je realizacija listom typedef struct at atom; struct at { int element; struct at *sljed; }; 52 Algoritmi i strukture podataka
Red izveden listom Prazan red izlaz ulaz Neprazan red izlaz 52 42 ulaz • RedListom Algoritmi i strukture podataka
Dodavanje elementa u red realiziran listom int DodajURed (int element, atom **ulaz, atom **izlaz) { atom *novi; if (novi = malloc (sizeof (atom))) { novi->element = element; novi->sljed = NULL; if (*izlaz == NULL) *izlaz = novi; // ako je red bio prazan else (*ulaz)->sljed = novi; // inace, stavi na kraj *ulaz = novi; // zapamti zadnjeg return 1; } return 0; } atom *ulaz = NULL;atom *izlaz = NULL; dodaj(52, &ulaz, &izlaz); izlaz ulaz 52 Algoritmi i strukture podataka
Dodavanje novog elementa int DodajURed (int element, atom **ulaz, atom **izlaz) { atom *novi; if (novi = malloc (sizeof (atom))) { novi->element = element; novi->sljed = NULL; if (*izlaz == NULL) *izlaz = novi; // ako je red bio prazan else (*ulaz)->sljed = novi; // inace, stavi na kraj *ulaz = novi; // zapamti zadnjeg return 1; } return 0; } atom *ulaz = NULL;atom *izlaz = NULL; DodajURed(52, &ulaz, &izlaz); DodajURed(42, &ulaz, &izlaz); izlaz ulaz 52 42 Algoritmi i strukture podataka
Skidanje elementa s reda int SkiniIzReda (int *element, atom **ulaz, atom **izlaz) { atom *stari; if (*izlaz) { // ako red nije prazan *element = (*izlaz)->element; // element koji se skida stari = *izlaz; // zapamti trenutni izlaz *izlaz = (*izlaz)->sljed; // novi izlaz free (stari); // oslobodi memoriju skinutog if (*izlaz == NULL) *ulaz = NULL; // prazan red return 1; } return 0; } izlaz ulaz 52 42 SkiniIzReda(&broj, &ulaz, &izlaz); stari Algoritmi i strukture podataka
Skidanje zadnjeg elementa iz reda int SkiniIzReda (int *element, atom **ulaz, atom **izlaz) { atom *stari; if (*izlaz) { // ako red nije prazan *element = (*izlaz)->element; // element koji se skida stari = *izlaz; // zapamti trenutni izlaz *izlaz = (*izlaz)->sljed; // novi izlaz free (stari); // oslobodi memoriju skinutog if (*izlaz == NULL) *ulaz = NULL; // prazan red return 1; } return 0; } izlaz ulaz 42 SkiniIzReda(&broj, &ulaz, &izlaz); SkiniIzReda(&broj, &ulaz, &izlaz); stari Algoritmi i strukture podataka
Dvostruki pokazivači • funkcija za dodavanje elementa imala je prototip • radi se o dvostrukim pokazivačima – zašto ih koristimo? • u glavnom programu ulaz je deklariran kao pokazivač na strukturu atom i inicijalno je postavljen na NULL • u funkciji DodajURed moramo promijeniti ono na što pokazuju ulaz i izlaz • kad bismo koristili prototip i u njemu varijable ulaz i izlaz , te bi varijable vrijedile samo u funkciji • to ne bi bilo dobro, jer se te promjene moraju vidjeti u glavnom programu! • zato funkciji predajemo adrese varijabli ulaz i izlaz • to su pokazivači na pokazivače int DodajURed (int element, atom **ulaz, atom **izlaz); int DodajURed (int element, atom *ulaz, atom *izlaz); • RedListomPogresan Algoritmi i strukture podataka
Objektno-orijentirana realizacija reda • slično kao kod stoga! • od korisnika se izolira provedba • razlika je u tome da stog poljem može biti pun, dok stog listom raste koliko mu dopušta raspoloživa memorija • izbor realizacije stoga utječe samo na jednu naredbu u pozivnom programu: #if 1 RedP *red = new RedP; #else RedL *red = new RedL; #endif • RedOboje Algoritmi i strukture podataka