04. spa1 - kruzne liste

Post on 08-Dec-2015

21 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

bh

TRANSCRIPT

KRUŽNE LISTE I

KRUŽNE LISTE SA GRANIČNIKOM

Strukture podataka i algoritmi 1

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

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;

}

}

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;

}

...

}

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);

}

}

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;

}

}

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;

}

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;

}

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;

}

Kružne liste

Ostale operacije analogno kao kod “obične” JPL

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)

Kružne liste sa graničnikom

Spoljašnji pokazivač pokazuje na graničnik

--- dog rat cat

---

---

dog

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;

}

}

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;

}

...

}

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;

}

}

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;

}

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;

}

Brisanje prvog

public void deleteFirst() {

// Brise prvi element

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

}

Da li ovo radi i kod prazne 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

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;

}

Kružne liste sa graničnikom

Ostale operacije analogno kao kod “obične” JPL

top related