220 likes | 415 Views
Algoritmi i strukture podataka. Jednostruko i dvostruko povezane liste. Općenita linearna jednostruko povezana lista. podatak je moguće u listu umetnuti: na početak liste (isto kao na stog) iza nekog elementa na listi. glava. 45. 63. 15. Primjer.
E N D
Algoritmi i strukture podataka Jednostruko i dvostruko povezane liste
Općenita linearna jednostruko povezana lista • podatak je moguće u listu umetnuti: • na početak liste (isto kao na stog) • iza nekog elementa na listi glava 45 63 15 Algoritmi i strukture podataka
Primjer • Napisati program koji će pročitati niz cijelih brojeva i od njih oblikovati linearnu jednostruko povezanu listu tako da podaci budu u rastućem nizu. Ispisati redom sadržaj liste. Učitavati podatke koje se želi brisati iz liste. Program se završava kad se upiše podatak koji ne postoji u listi. • Lista Algoritmi i strukture podataka
Dvostruki pokazivači i adrese • glavapsadrži adresu pokazivača na prvi član liste, tj. &(atom*) ili &(&(atom)) • *glavap sadrži pokazivač na prvi član liste, tj (atom*) ili (&atom) • **glavap je prvi član liste, tj. atom **glavap=*glava=atom *glavap=glava=&atom 63 15 glavap glava glavap=&glava=&(&atom) Algoritmi i strukture podataka
Traženje, dodavanje i brisanje elemenata • pretraživanje liste – od glave dok se ne pronađe traženi element • element možemo dodati: • na početak liste (tad mijenjamo glavu) • negdje iza postojećeg elementa liste • na posljednje mjesto • ispred elementa koji je veći od onog koji umećemo • element koji brišemo može biti: • na početku liste (tad pomičemo glavu na sljedeći element) • negdje iza postojećeg elementa liste • treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji se nalazi iza onog kojeg brišemo • obavezno obrisati memoriju koju je zauzimao brisani element Algoritmi i strukture podataka
Pretraživanje liste Zašto se ne koristi dvostruki pokazivač? // trazenje elementa liste // vraca pokazivac na trazeni element ili NULL ako ga ne nadje atom *trazi (atom *glava, int element) { atom *p; for (p = glava; p != NULL; p = p->sljed) { if (p ->element == element) return p; } return NULL; } element 64 p glava 45 64 95 15 Algoritmi i strukture podataka
Dodavanje na početak liste int dodaj (atom **glavap, int element) { atom *novi; if ((novi = (atom *) malloc(sizeof(atom))) == NULL) return 0; novi->element = element; if (*glavap == NULL || (*glavap)->element >= element) { // Dodavanje na pocetak liste novi->sljed = *glavap; *glavap = novi; }.... element 15 *glavap 45 64 95 15 Algoritmi i strukture podataka
Dodavanje unutar liste int dodaj (atom **glavap, int element) { atom *novi, *p; if ((novi = (atom *) malloc(sizeof(atom))) == NULL) return 0; novi->element = element; // ako element dodajemo unutar liste for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed); novi->sljed = p->sljed; p->sljed = novi; ... element 71 p *glavap 45 64 95 71 Algoritmi i strukture podataka
Brisanje elementa s početka liste int brisi (atom **glavap, int elem) { atom *p; for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed)); if (*glavap) { p = *glavap; *glavap = (*glavap)->sljed; free (p); return 1; } else return 0; } elem 45 p *glavap 45 64 95 71 Algoritmi i strukture podataka
Brisanje elementa iz sredine liste Zašto smijemo mijenjativrijednost glavap? int brisi (atom **glavap, int elem) { atom *p; for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed)); if (*glavap) { p = *glavap; *glavap = (*glavap)->sljed; free (p); return 1; } else return 0; } elem 71 Što pohranjujemo uglavap? p *glavap 45 64 71 95 glavap *glavap *glavap Algoritmi i strukture podataka
Liste s više ključeva - I • Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1 znakova). Oblikovati listu po rastućem matičnom broju i listu po abecedi. Podaci su upisani samo jednom! Za zadani matični broj pronaći pripadno prezime. glavaPrez 53533 21373 33433 glavaMBR Ferić Berić Perić Algoritmi i strukture podataka
Liste s više ključeva - II • za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na slijedeći atom: • (*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap • &((*glavap)->smbr) je adresa tog pokazivača • alternativno rješenje s varijablom pom (pom je isto što i glavap) • pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element • *pom je pokazivač na prethodni atom • (*pom)->smbr je pokazivač na trenutni atom • kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na novi atom • VisestrukaLista Algoritmi i strukture podataka
Dvostruko povezana lista • Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći atom i pokazivač na prethodni atom. • Lista ima glavu i rep. • Primjer: RedListom2 • funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp) rep glava repp glavap Algoritmi i strukture podataka
Objektno orijentirana realizacija jednostruke linearne liste Interni podaci o realizaciji liste struct podatak { int kljuc; int element; }; class Lista { private: struct atom { podatak stavka; atom *sljed; }; atom *glava; atom *rep; } Algoritmi i strukture podataka
Članske funkcije klase Lista public: Lista (); void DodajNaPocetak (podatak stavka); void DodajNaKraj (podatak stavka); bool DodajSortirano (podatak stavka, bool uzlazno); bool NadjiPoKljucu (int kljuc, podatak & stavka); bool BrisiSPocetka (podatak& stavka); bool BrisiZadanog (int kljuc, podatak& stavka); void BrisiSve (); void IspisiListu (); ~Lista (); }; ListaOO Algoritmi i strukture podataka
Zadaci za vježbu • U memoriji oblikovati jednostruko povezanu listu. Pojedini element sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati sortirano po matičnom broju studenta. Napisati funkciju koja će ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata: Maticni broj Ime i prezime Prosjecna ocjena xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA x.xx … Prototip funkcije je: void ispisi (atom *glava); Algoritmi i strukture podataka
Zadaci za vježbu • U memoriji oblikovati linearnu listu. U pojedini atom liste upisati: • matični broj studenta (4 znamenke) • ime i prezime (30+1 znakova) • ocjenu (cijeli broj) • pokazivač na sljedeći atom • Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže ocjenu 1. Prototip funkcije je: void brisi (atom **glava); Algoritmi i strukture podataka
Zadaci za vježbu • Strukturu red realizirati kao memorijski rezidentnu listu. Jedan element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba napisati funkciju koja dodaje i funkciju koja briše element iz reda. Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije, vraća 0. • Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na zadnji element, a elementi se skidaju iz reda od glave liste. Algoritmi i strukture podataka
Zadaci za vježbu • Napisati funkciju za oblikovanje memorijski rezidentne linearne jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i naziv artikla (15+1 znakova). Lista je poredana po šifri artikala. Napisati funkciju za pronalaženje člana liste sa zadanom šifrom artikla. Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je naziv artikla. Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest. Algoritmi i strukture podataka
Zadaci za vježbu • Napisati funkciju za oblikovanje uzlazno poredane liste. Listu pohraniti u neformatiranu datoteku lista. Napisati funkciju za logičko brisanje čvora sa zadanim ključem. Ulazni podatak je zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste. Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0 ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom sadrži: • kućni telefonski broj (4 znamenke) • prezime (15+1 slovo) • ime (15+1 slovo) • Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću -1. Algoritmi i strukture podataka
Zadaci za vježbu • Napisati funkciju za oblikovanjem jednostruko povezane silazno poredane liste. Lista je pohranjena u neformatiranom obliku u datoteci. Glava liste je zapisana na početku datoteke. Funkcija vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije. Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo). Šifra jest ključ. • Prototip funkcije je: int dodaj (int sifra, char* naziv, const char *ime_dat); Algoritmi i strukture podataka
Zadaci za vježbu • Zadan je niz ulaznih podataka tipa int: 11, 15, 12, 5, 4, 10 Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci pohranjeni kao jednostruko povezana lista sortirana rastućim redosljedom. Upisati adrese i vrijednosti pojedinih zapisa. Pretpostaviti da je glava liste upisana na početku datoteke. • Napisati program za oblikovanje i brisanje dvostruko povezane liste, analogno onome za jednostruko povezanu listu. Algoritmi i strukture podataka