vezane liste
DESCRIPTION
Strukture podataka i algoritmiTRANSCRIPT
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi 2011/2012
STRUKTURE PODATAKA I ALGORITMI
Vezane liste -‐ Jednostruka linearna
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Apstraktna struktura podataka čiji su elemen> međusobno povezani jednom ili dvjema vezama.
-‐ elemente zovemo čvorovima
-‐ prema broju veza među čvorovima liste zovemo jednostrukima ili dvostrukima
-‐ u vezanoj lis> svaki čvor poznaje samo svog prvog susjeda
• Listu je najlakše vizualizira> kao vlak s lokomo>vom i vagonima
-‐ cijeli vlak predstavlja listu
-‐ vagoni predstavljaju čvorove
-‐ lokomo>va predstavlja pokazivač na listu
2
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Pokazivač na listu (lokomo>va) je od iznimne važnos> za listu
-‐ pokazuje na prvi čvor koji pokazuje na drugi čvor koji pokazuje na treći čvor...
-‐ pristup svim čvorovima u lis> nije moguć bez ovog pokazivača
-‐ zove se head (glava)
-‐ mora bi> inicijaliziran
‣ ili pokazuje na prvi čvor u lis5‣ ili pokazuje ni na što -‐> null
• Za listu čiji head pokazuje na null kažemo da je prazna
3
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Čvorovi u vezanoj lis> sastoje se od
-‐ barem jednog podatkovnog polja koje ga pobliže opisuje
-‐ barem jednog pokazivačkog polja koje ga povezuje s drugim čvorovima
‣ ukoliko je lista jednostruko vezana, to pokazivačko polje se obično zove next (slijedeći) ‣ ukoliko je lista dvostruko vezana, osim polja next, postoji i dodatno pokazivačko polje a koje se obično zove past (prethodni)
4
class Student { public int mb; public string ime; public int dob; public Student next; //public Student past;
public Student(string i, int d, int m) { ime = i; dob = d; mb = m; next = null; } }
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Iako ne toliko važan kao head, i posljednji čvor u lis> je također bitan
-‐ ima i vlas>to ime: tail (rep)
• Ovisno o definiciji posljednjeg čvora u lis> moguća je i dodatna podjela vezanih lista na
-‐ posljednji je onaj koji ne pokazuje ni na jednog drugog -‐> linearna vezana lista
-‐ posljednji je onaj koji pokazuje na prvog u lis> -‐> cirkularna vezana lista
5
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Obzirom na broj veza među čvorovima, te na definiciju posljednjeg čvora, razlikujemo če>ri vrste vezanih lista
-‐ jednostruko vezana linearna
-‐ jednostruko vezana cirkularna
-‐ dvostruko vezana linearna
-‐ dvostruko vezana cirkularna
6
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Čemu uopće liste kad bi i nizovi bili dovoljni?
• Neke operacije nad nizovima su složene
-‐ umetanje novog elementa između dva postojeća
-‐ dodavanje novog elementa nakon što je “kvota” popunjena
-‐ brisanje postojećeg elementa
• U vezanoj lis> sve te operacije su znatno jednostavnije
• Među>m, neke operacije nad listama su opet složenije
-‐ pristup i-‐tom elementu
-‐ sor>ranje svih elemenata
• Što odabra>?
-‐ ovisi o primjeni!
7
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
VEZANA LISTA
• Temeljne operacije nad listama su
-‐ unos u listu
-‐ ispis iz liste (svih ili nekih elemenata)
-‐ pretraživanje unutar liste
-‐ brisanje iz liste (jednog ili više elemenata)
• Svaka od ovih operacija može se i hoće razmatra> nad svim vrstama vezanih lista
8
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS U VEZANU LISTU
• Prije samog unosa potrebno je prvo stvori> novi čvor a to podrazumijeva
-‐ odredi> podatkovna i pokazivačka polja
-‐ pridijeli> memorijski prostor tom novom čvoru
• Najzgodnije je to napravi> putem konstruktora
-‐ prvo dobi> sve podatke od korisnika (ili od pozivne metode)
-‐ potom ključnom riječju new stvori> i inicijalizira> novi čvor
9
Student novi = new Student(i,d,m);
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS U VEZANU LISTU
• Stvaranje novog studenta obavljat će metoda NoviStudent()-‐ na vježbama
-‐ kao ulazni parametar prima varijablu mb (ma>čni broj) i važno je da ju primi kao referencu
-‐ kao rezultat vraća tog novostvorenog studenta
10
static Student NoviStudent(ref int mb) { dohvati ime studenta dohvati dob studenta! ! ! stvori i inicijaliziraj novog studenta! ! ! povećaj matični broj
vrati novog studenta }
ma5čni broj bi trebao bi5 jedinstven o čemu vodi računa pozivna metoda
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS U VEZANU LISTU
• Jednom kad je novi student stvoren, unos je moguć
-‐ na početku liste
-‐ na kraju liste
-‐ unutar liste nakon nekog određenog čvora
• Smisleno je napravi> opću metodu za unos koja bi onda u sebi sadržavala opcije koje bi korisnik odabrao pri svakom pojedinom unosu
• Izrada ove sasvim jednostavne metode (switch) ostavljena je za samostalnu vježbu
• Iako su algoritmi za unos za svaku od če>ri vrste vezanih lista jednaki do na specifičnost pojedine liste, radi jednostavnos> ćemo u početku razmatra> isključivo jednostruko vezanu linearnu (JVL) listu
11
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA POČETAK JVL LISTE
• Algoritam za unos u listu:
(1) usmjeri> novi čvor da pokazuje na prvi čvor u lis>
(2) usmjeri> pokazivač na listu da pokazuje na novi čvor
• Jesu li ovi brojevi tu slučajno?
• Što bi se dogodilo ako bi se poredak obrnuo?
12
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA POČETAK JVL LISTE
13
ako se redoslijed operacija obrne, katastrofalne
posljedice slijede
koje?
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA POČETAK JVL LISTE
14
A!"#$!"#$
A
!"#$
B
A
B
!"#$
A
Unos u praznu listu
Unos u nepraznu listu
!"#$
B
A
B
!"#$
B
A
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA POČETAK JVL LISTE
• Unos će obavlja> metoda UnosPocetak() -‐ na vježbama
-‐ kao parametre prima pokazivače na listu (head) te na novog studenta (novi)
-‐ kao rezultat ne vraća ništa
• Analogna je metodi Push() koju smo razmatrali kod stoga.
15
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA KRAJ JVL LISTE
• Algoritam za unos u listu:
-‐ odredi> posljednji čvor u lis>
-‐ usmjeri> posljednjeg da pokazuje na novog
16
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA KRAJ JVL LISTE
17
Unos u praznu listu
A!"#$!"#$
A
Hm...
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA KRAJ JEDNOSTRUKO VEZANE LINEARNE LISTE
18
!"#$
A B C
NOVI
!"#$
A B C NOVI
!"#$
A B C
NOVINOVI
!"#$%&"'
A B C
NOVINOVI
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS NA KRAJ JEDNOSTRUKO VEZANE LINEARNE LISTE
• Unos će obavlja> metoda UnosKraj() -‐ na vježbama
-‐ kao parametre prima pokazivače na listu (head) te na novog studenta (novi)
-‐ kao rezultat ne vraća ništa
19
Kako odredi> posljednji čvor?
static void UnosKraj(ref Student head, ref Student novi) { ako je lista prazna! ! ! ! head pokazuje na novog ako lista nije prazna! ! ! ! odredi posljednjeg! ! ! ! usmjeri ga na novog }
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Algoritam za unos u listu:
-‐ dobi> redni broj čvora nakon kojeg se unosi npr. n
-‐ smjes>> novi čvor u listu između n-‐tog i (n+1)-‐og
20
Naziru li se potencijalni problemi s ovim algoritmom?
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Algoritam za unos u listu:
-‐ dobi> valjani redni broj čvora nakon kojeg se unosi npr. n
-‐ smjes>> novi čvor u listu nakon n-‐tog čvora
21
if (n == 0)???
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Razlikujemo dvije vrste unosa unutar liste
-‐ ispred određenog čvora
-‐ nakon određenog čvora
• Uz malo lukavstva, svode se na jedan
-‐ ispred n-‐tog => nakon (n-‐1)-‐og
-‐ nakon n-‐tog => ispred (n+1)-‐og
• Unos nakon podrazumijeva
‣ provjeru rednog broja kojeg korisnik unosi‣ unos moguć najranije od nultog ‣ unos moguć najdalje do nakon zadnjeg
22
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Algoritam za unos u listu:
-‐ pronaći traženi čvor nakon kojeg unosimo
-‐ ako je unos prije prvog
‣ unos na početak
-‐ inače
‣ novog postavi5 da pokazuje na sljedbenika‣ traženog postavi5 da pokazuje na novog
23
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Pronalazak n-‐tog čvora radi metoda Nakon() -‐ varijanta, ne mora ovako
-‐ kao parametre metoda prima
‣ pokazivač na listu (head) ‣ cijeli broj nakon kojeg se novi čvor unosi (n)
-‐ kao rezultat metoda vraća ‣ pokazivač na pronađeni čvor ‣ NULL ako nema dovoljno čvorova u lis5 da zadovolji redni broj
• Pozivna metoda dužna je
-‐ osigura> da se ne proslijedi nega>van broj
-‐ ukoliko je n jednak 0 pozva> funkciju UnosPocetak()
24
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
UNOS UNUTAR JVL LISTE
• Unos će obavlja> metoda UnosNakon() -‐ na vježbama
-‐ kao parametre prima
‣ pokazivač na listu (head)‣ pokazivač na novog studenta (novi)
-‐ kao rezultat vraća
‣ ništa, ako se koris5 pomoćna metoda Nakon()‣ bool vrijednost ako se ne koris5
25
static bool UnosNakon(ref Student head, ref Student novi, int n) { ako je n = 0! ! ! ! unesi na početak! ! ! ! vrati istinu ako je n > 0! ! ! ! šetaj kroz listu dok ne nađeš n.ti čvor! ! ! ! ako ga nađeš! ! ! ! umetni novog između njega i n+1.og! ! ! ! vrati istinu! ! ! ! ako ga ne nađeš ! ! ! ! vrati laž }
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS
• Unos bez ispisa je kao juha bez soli
• Ispis podrazumijeva
-‐ ispis jednog čvora
-‐ ispis svih čvorova u lis>
-‐ ispis liste po pola
26
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS JEDNOG
• Ispis točno jednog čvora će obavlja> metoda IspisJednog() -‐ na vježbama
-‐ kao ulazne parametre prima
‣ čvor koji se ima ispisa5‣ redni broj čvora koji se ispisuje
-‐ kao izlaz ne vraća ništa
• Parametar redni_broj_čvora ima dvostruku ulogu
-‐ ako je 0 tada naznačujemo kako nas zanima samo ispis tog čvora, ne i njegov redni broj
-‐ ako je > 0 tada nam je bitno dodatno još ispisa> i redni broj
-‐ nekada će jedna primjena bi> korisnija od druge, zgodno je ima> obje
27
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS CIJELE LISTE
• Temeljna ideja
-‐ ukoliko je lista prazna, ispisa> poruku o tome
-‐ ukoliko je lista neprazna ispisa> podatke prvog čvora
-‐ preći na idući čvor i ponovlja> postupak sve dok ne dođemo do kraja
28
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS LISTE PO POLA
• Dva su temeljna pristupa
-‐ računajući broj čvorova u lis>
-‐ koristeći brzi/spori pokazivač
29
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS LISTE PO POLA -‐ DULJINA
• Temeljna ideja
-‐ odredi> ukupan broj čvorova u lis> -‐ n
-‐ ispisa> čvorove
‣ od prvog do n/2-‐tog‣ od n/2-‐tog do posljednjeg
-‐ u slučaju neparnog broja jedna polovica je očito dulja
30
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
ISPIS LISTE PO POLA -‐ BRZI/SPORI
• Temeljna ideja
-‐ uves> dva pokazivača (brzi i spori) i oba usmjeri> na prvi čvor
‣ spori pokazivač pomica5 za po jedan čvor prema kraju liste‣ brzi pokazivač pomica5 za po dva čvora prema kraju liste
-‐ pomica> oba pokazivača sve dok brzi ne dođe do NULL
-‐ kada brzi dođe do NULL, spori je točno na pola liste
-‐ ispisa> čvorove
‣ od prvog do sporog‣ od sporog do kraja
-‐ u slučaju neparnog broja jedna polovica je očito dulja
31
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
PRETRAŽIVANJE
• Temeljna ideja
-‐ utvrdi> kriterij za pretragu
-‐ pronaći traženi čvor
-‐ vra>> pokazivač na nj
• Rezultat pretrage je
-‐ NULL
-‐ traženi čvor
• Ovisno o jedinstvenos> kriterija, moguce je dobi> vise rezultata pretrage, što valja uze> u obzir pri njihovom ispisu
32
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
PRETRAŽIVANJE
• Ako je kriterij za pretraživanje ma>čni broj, tada su stvari jednostavne.
-‐ učita> mb s >pkovnice
-‐ prošeta> kroz listu i utvrdi> postoji li takav mb
‣ ako postoji ispisa5 čvor s 5m mb-‐om‣ ako ne ispisa5 poruku da takvog nema
• Ako je kriterij za pretraživanje ime ili dob, tada su stvari bitno složenije
-‐ kojeg studenta ispisa>?
‣ prvog u lis5 s 5m imenom‣ sve u lis5 s 5m imenom
-‐ što vra>> kao rezultat pretraživanja?
33
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE
• Pod brisanjem čvora iz liste podrazumijevamo
-‐ uklanjanje čvora iz liste
-‐ oslobađanje memorije koju je taj čvor zauzimao za nas radi “škovacin” po prestanku izvođenja programa.
• Brisa> je moguće
-‐ prvi čvor u lis>
-‐ posljednji čvor u lis>
-‐ čvor unutar liste prema kriteriju
-‐ sve čvorove unutar liste prema istom kriteriju
34
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE PRVOG ČVORA U LISTI
35
!"#$
A B C D
!"#$
B C D
!"#$
A B C D
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE POSLJEDNJEG ČVORA U LISTI
• Temeljna ideja
-‐ pronaći pretposljednji čvor u lis>
-‐ postavi> ga da pokazuje na novog
36
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE POSLJEDNJEG ČVORA U LISTI
37
!"#$
A B C D
!"#$
A B C D
%"&'(')(*#+'
!"#$
A B C
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE UNUTARNJEG ČVORA PREMA KRITERIJU
• Temeljna ideja
-‐ pronaći prethodnika traženog čvora
-‐ postavi> prethodnika da pokazuje na sljedbenika traženog čvora
38
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE UNUTARNJEG ČVORA PREMA KRITERIJU
39
!"#$
A B C D E
!"#$
A B C D
%#&'("%!)$*+,
E
-.&"$/"*+,!"#$
A B C D
%#&'("%!)$*+,
E
-.&"$/"*+,!"#$
A B D E
© Ivan Bilobrk -‐ Odjel za Informa5ku -‐ PMFSTStrukture podataka i algoritmi / 40
BRISANJE SVIH ČVOROVA PREMA KRITERIJU
• Ovisno o postojanju kriterija sve dok je lista neprazna
-‐ ako brišemo bez kriterija
‣ ponavlja5 postupak brisanja prvog čvora u lis5
-‐ ako je kriterij bitan
‣ ponavlja5 postupak brisanja čvora prema kriteriju‣ moguće je spremi5 i mb-‐ove upitnih čvorova u pomoćni niz koji se proslijedi metodi za brisanje
40