1 / 17

Algoritmi i strukture podataka

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 )

toni
Download Presentation

Algoritmi i strukture podataka

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algoritmi i strukture podataka Red

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

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

  8. 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

  9. 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

  10. 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

  11. Red izveden listom Prazan red izlaz ulaz Neprazan red izlaz 52 42 ulaz • RedListom Algoritmi i strukture podataka

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

More Related