200 likes | 399 Views
Linearne strukture. Polja jednodimenzionalna (nizovi, vektori) dvodimenzionalna (matrice) višedimenzionalna (tenzori višeg reda) Povezani popis Stogovi Redovi. Osnovni pojmovi. Kako bi se upoznali sa strukturom podataka povezani popis, moramo objasniti:
E N D
Linearne strukture Polja jednodimenzionalna (nizovi, vektori) dvodimenzionalna (matrice) višedimenzionalna (tenzori višeg reda) Povezani popis Stogovi Redovi
Osnovni pojmovi Kako bi se upoznali sa strukturom podataka povezani popis, moramo objasniti: - dinamičko zauzimanje (alociranje) memorije - memorijska adresa (pokazivač) kao tip podataka - formiranje struktura podataka
Dinamičko zauzimanje memorije (1/2) Do sada nam je pozant statički način. (Primjer C naredbe: float V[1000];) Zauzimanje memorije za nizove podataka proširujemo mogućnošću dinamičkog alociranja (zauzimanja) i oslobađanja memorije.
Dinamičko zauzimanje memorije (2/2) Primjer u C-u funkcije iz stdlib.h malloc(…) i free(…), Isto tako u C++ operatori new i delete. float *V; V=(float *)malloc(1000*sizeof(float)); . . . free(V); float V[1000];
Pokazivači (1/2) Memorija računala je linearna i Byte-no orjentirana, tj. svaki Byte u memoriji ima svoju adresu. Sama memorijska adresa (pokazivač, eng. pointer) se može gledati kao poseban tip podataka koji može imati vrijednosti od prve adrese (to je 0) do neke najveće vrijednosti zadnje lokacije u memoriji. Znači to je cijeli broj bez predznaka kojeg najčešće prikazujemo u heksadecimalnom sustavu. !!! Svako ime varijable u nekom višem programskom jeziku predstavlja jednu memorijsku adresu !!!
Pokazivači (2/2) Mi ćemo memorijsku adresu koristiti kao još jedan elementarni tip podataka. Uvijek ćemo ju koristiti tako da joj pridjeljujemo vrijednost neke druge varijable koja je isto memorijska adresa ili ćemo takvim varijablama (koje su memorijske adrese) pridjeliti vrijednost novog dijela memorije kojeg smo zauzeli dinamičkim alociranjem. Osim ova dva načina u memorijsku adresu možemo zapisati i vrijednost NULL. Ta konstanta predstavlja “nepostojeću” memorijsku adresu
Strukture podataka (1/3) Struktura podataka jest skup od dva ili više elementarnih tipova podataka ili već prije definiranih struktura podataka. Znači, dopuštena je ugnježdenost struktura, tj. da jedna struktura bude član druge strukture podataka. Primjer strukture podataka “Student”: } Niz znakova Ime Elementarni tipovi podataka, ili složenije strukture Prezime Niz znakova BrIndeksa Cjelobrojni tip Prosjek Realni tip
Strukture podataka (2/3) Pojedinim elementima strukture podataka pristupa se koristeći operator “.”. Ako bi koristili strukturu S koja je tipa “Student” iz prethodnog primjera, onda su njeni članovi: S.Ime S.Prezime S.BrIndeksa S.Prosjek Primjer strukture podataka “Predmet”: Niz znakova Ime Predavač Niz znakova Studenti Niz struktura “Student” BrSati Cjelobrojni tip ECTS Cjelobrojni tip
Strukture podataka (3/3) • Ako bi koristili strukturu P koja je tipa “Predmet” iz prethodnog primjera, onda možemo • postaviti ECTS bodove predmata sa • P.ECTS = 9 • postaviti Ime predmeta sa • P.Ime = “Strukture podatak i algoritmi” • postaviti Prezime 14. Studenta koji sluša predmet sa • P.Studenti14.Prezime = “Perić”
Pokazivači na idući zapis Definicija povezanog popisa (1/2) Povezani popis (engl. Linked List) je dinamička struktura. Elementi popisa (zapisi) se stavljaju u slobodni dio memorije, a kada pojedini zapis ili cijeli popis više nije potreban, zauzeti dio memorije se oslobađa. Elementi su međusobno povezani adresnim podacima - pokazivačima (engl. Pointer). Osnovni element povezanog popisa Zapis 2 Zapis 1 Zapis 3 Podaci Podaci Podaci Prvi
Definicija povezanog popisa (2/2) • Osnovni element povezanog popisa se sastoji iz 2 dijela: • x - dio s podacima (bilo kakvi elementarni tipovi) • sljedeci - memorijska adresa koja pokazuje idući osnovni element u memoriji Koristiti operator “točkica”! Neka je o osnovni element povezanog popisa o.x - ovako pristupamo dijelu s podatkom o.sljedeci - ovako pristupamo mem. adresi na idućeg Osim osnovnog elementa koristit ćemo još jednu varijalu prvi koja nam je jedina poznata i predstavlja početak povezanog popisa. prvi je memorijska adresa. prvi = NULL znači da je povezani popis prazan.
Formiranje povezanog popisa (1/2) ZADANO: pokazivač prvi i definicija osnovnog elementa p.p. podaci se učitavaju TRAŽI SE: Formirati povezani popis s podacima koji se učitavaju Možemo dodavati svaki novi podatak na kraj popisa, a možemo novog dodavati i na početak povezanog popisa.
Formiranje povezanog popisa (2/2) Algoritam KREIRANJE POVEZANOG POPISA, NOVI ELEMENT NA POČETAK POPISA prvi=NULL Ponavljati Učitatiy Ako je kraj učitanih podataka završiti algoritam novi = nova adresa u dinamičkoj memoriji novi.x = y novi.sljedeci = prvi prvi = novi
Problem obilaska povezanog popisa ZADANO: pokazivač prvi i definicija osnovnog elementa p.p. popis je popunjen s elementima TRAŽI SE: ispisati sve elemente popisa Algoritam OBILAZAK POVEZANOG POPISA trenutni = prvi Sve dokjetrenutni NULL činiti Ispisatitrenutni.x trenutni= trenutni.sljedeci
Zapis 2 ... Zapis n Zapis 1 Podaci Podaci Podaci Povezani popis s pokazivačima na početak i na kraj popisa Podaci NULL prvi zadnji
Zapis 2 ... Zapis n Zapis 1 Podaci Podaci Podaci Dvostruko povezani popis Osnovni element kod dvostruko povezanog popisa sadrži tri komponente: x - dio s podacima prethodni - memorijska adresa, pokazivač na prethodni zapis sljedeci - memorijska adresa, pokazivač na sljedeći zapis Podaci NULL NULL prvi zadnji
Niz vs. Povezani popis n – broj elemenata u nizu i u povezanom popisu Niz Povezani popis Obilazak svih elemenata O(n) O(n) Pristup elementu O(1) O(n) Umetanje elementa O(n) O(1) Brisanje elementa O(n) O(1) Zauzeće memorije O(n) O(n) Iskoristivost samo potpuna slobodne memorije neprekinuti niz slobodne memorije
Problem sortiranja (kod povezanih popisa) ZADANO: Niz V od N elemenata TRAŽI SE: Formirati povezani popis u kojem će elementi biti poredani (sortirani) Elemente uzimati redom iz niza V - podatke iz niza V dodavati kao kod formiranja povezanog popisa, ali ne stavljati nove na početak ni na kraj, već točno na određeno mjesto!
Algoritam INSERT SORT prvi=NULL Za svakii=1 doNčiniti N = novi osnovni element (dinamičko alociranje) N.x = Vi Ako jeprvi = NULL onda /* samo kod dodavanja prvog elementa */ N.sljedeci = NULL prvi = N U suprotnom /* za svaki sljedeći podatak */ T = prvi Ako jeN.x<T.xonda /* ako treba novog dodati na početak */ N.sljedeci=prvi prvi=N U suprotnom /* pretražiti gdje treba ubaciti novog */ Ponavljati P = T T = T.sljedeci Ako jeT=NULL ili N.x<T.x onda prekinuti ponavlj. P.sljedeci = N N.sljedeci = T
Analiza algoritma INSERT SORT U algoritmu koristimo pokazivače na osnovnog elementa N, P i T. N – koristimo za novog osnovnog elementa kojeg kreiramo na dinamički način; P – koristimo kao adresu prethodnog zapisa kada pretražujemo povezani popis; T – koristimo kao trenutačnu adresu prilikom istog pretraživanja. VremenskasloženostalgoritmajesteO(N2)