04. spa1 - kruzne liste

21
KRUŽNE LISTE I KRUŽNE LISTE SA GRANIČNIKOM Strukture podataka i algoritmi 1

Upload: helena-halonen

Post on 08-Dec-2015

22 views

Category:

Documents


2 download

DESCRIPTION

bh

TRANSCRIPT

Page 1: 04. SPA1 - Kruzne Liste

KRUŽNE LISTE I

KRUŽNE LISTE SA GRANIČNIKOM

Strukture podataka i algoritmi 1

Page 2: 04. SPA1 - Kruzne Liste

Kružne liste

Motivacija: bolje iskoristiti pokazivač poslednjeg

elementa

Može da pokazuje na prvi element umesto na null

Tada svi elementi postaju ravnopravni

Na koji element da pokazuje spoljašnji pokazivač?

pig dog rat cat

dog

Page 3: 04. SPA1 - Kruzne Liste

Kružne liste

Java klasa koja implementira čvor kružne JPL:

public class CSLLNode {

Object element;

CSLLNode succ;

public CSLLNode (Object elem, CSLLNode

succ) {

this.element = elem;

this.succ = succ;

}

}

Page 4: 04. SPA1 - Kruzne Liste

Kružne liste

Java klasa koja implementira zaglavlje kružne JPL:

Spoljašnji pokazivač će pokazivati na poslednji element u listi (zbog efikasnijeg ubacivanja na kraj)

public class CSLL {

CSLLNode last;

public CSLL () {

// Pravi praznu JPL.

this.last = null;

}

...

}

Page 5: 04. SPA1 - Kruzne Liste

Prolazak kroz kružnu JPL

public void printFirstToLast () {

// Stampa sve elemente od prvog do poslednjeg.

if (last != null) {

CSLLNode curr = this.last.succ;

while (curr != this.last) {

System.out.println(curr.element);

curr = curr.succ;

}

System.out.println(curr.element);

}

}

Page 6: 04. SPA1 - Kruzne Liste

Ubacivanje na početak

public void insertFirst (Object elem) {

// Ubacuje elem na pocetak liste

CSLLNode ins = new CSLLNode(elem, null);

if (this.last == null) {

ins.succ = ins;

this.last = ins;

} else {

ins.succ = this.last.succ;

this.last.succ = ins;

}

}

Page 7: 04. SPA1 - Kruzne Liste

Ubacivanje na kraj

public void insertLast (Object elem) {

// Ubacuje elem na kraj liste

CSLLNode ins = new CSLLNode(elem, null);

if (this.last == null) {

ins.succ = ins;

} else {

ins.succ = this.last.succ;

this.last.succ = ins;

}

this.last = ins;

}

Page 8: 04. SPA1 - Kruzne Liste

Brisanje prvog

public void deleteFirst() {

// Brise prvi element

if (this.last != null)

if (this.last.succ == this.last)

this.last = null;

else

this.last.succ = this.last.succ.succ;

}

Page 9: 04. SPA1 - Kruzne Liste

Traženje elementa

public CSLLNode find (Object elem) {

// Pronalazi elem u JPL, vraca null ako elem ne postoji

if (this.last != null) {

CSLLNode curr = this.last.succ;

while (curr != this.last &&

!curr.element.equals(elem))

curr = curr.succ;

if (curr.element.equals(elem))

return curr;

else

return null;

} else

return null;

}

Page 10: 04. SPA1 - Kruzne Liste

Kružne liste

Ostale operacije analogno kao kod “obične” JPL

Page 11: 04. SPA1 - Kruzne Liste

Kružne liste sa graničnikom

Motivacija: da li je moguće izbeći posebne

slučajeve kod:

Ubacivanja u praznu listu

Izbacivanja elementa iz jednoelementne liste

Držimo u listi stalno jedan čvor koji nije element liste

Graničnik (stražar, zaglavlje)

Page 12: 04. SPA1 - Kruzne Liste

Kružne liste sa graničnikom

Spoljašnji pokazivač pokazuje na graničnik

--- dog rat cat

---

---

dog

Page 13: 04. SPA1 - Kruzne Liste

Kružne liste sa graničnikom

Java klasa koja implementira čvor kružne JPL:

public class CSLLNode {

Object element;

CSLLNode succ;

public CSLLNode (Object elem, CSLLNode

succ) {

this.element = elem;

this.succ = succ;

}

}

Page 14: 04. SPA1 - Kruzne Liste

Kružne liste sa graničnikom

Java klasa koja implementira zaglavlje kružne JPL:

Spoljašnji pokazivač će pokazivati na graničnik koji se nalazi pre prvog i posle poslednjeg elementa

public class CSLLH {

CSLLNode header;

public CSLLH () {

// Pravi praznu JPL sa granicnikom.

this.header = new CSLLNode("", null);

this.header.succ = this.header;

}

...

}

Page 15: 04. SPA1 - Kruzne Liste

Prolazak kroz kružnu JPL sa

graničnikom

public void printFirstToLast () {

// Stampa sve elemente od prvog do posl.

CSLLNode curr = this.header.succ;

while (curr != this.header) {

System.out.println(curr.element);

curr = curr.succ;

}

}

Page 16: 04. SPA1 - Kruzne Liste

Ubacivanje na početak

public void insertFirst (Object elem) {

// Ubacuje elem na pocetak liste

CSLLNode ins = new CSLLNode(elem, null);

ins.succ = this.header.succ;

this.header.succ = ins;

}

Page 17: 04. SPA1 - Kruzne Liste

Ubacivanje na kraj

public void insertLast (Object elem) {

// Ubacuje elem na kraj liste

CSLLNode ins = new CSLLNode("", null);

ins.succ = this.header.succ;

this.header.succ = ins;

this.header.element = elem;

this.header = ins;

}

Page 18: 04. SPA1 - Kruzne Liste

Brisanje prvog

public void deleteFirst() {

// Brise prvi element

this.header.succ = this.header.succ.succ;

}

Da li ovo radi i kod prazne liste?

Page 19: 04. SPA1 - Kruzne Liste

Traženje elementa

Stavimo element koji tražimo u graničnik

Prolazimo kroz listu dok ne nadjemo element

Pronalazimo ga sigurno barem u graničniku (nema

provere za kraj liste)

Ako smo stigli do graničnika – element ne postoji u listi

Inače – postoji, vraćamo pokazivač na nađeni čvor

Page 20: 04. SPA1 - Kruzne Liste

Traženje elementa

public CSLLNode find (Object elem) {

// Pronalazi elem u JPL, vraca null ako // elem ne postoji

this.header.element = elem;

CSLLNode curr = this.header.succ;

while (!curr.element.equals(elem))

curr = curr.succ;

if (curr != this.header)

return curr;

else

return null;

}

Page 21: 04. SPA1 - Kruzne Liste

Kružne liste sa graničnikom

Ostale operacije analogno kao kod “obične” JPL