Απλά (και διπλά) συνδεδεµένες Συνδεδεμένη Λίστα ΣΛ Μια αλυσίδα κόµβων όπου κάθε κόµβος δείχνει στον επόµενό του 12 99 37 18 null O κάθε κόµβος έχει 2 τµήµατα: data: τα δεδοµένα (ή µια αναφορά προς αυτά) next: µια αναφορά προς τον επόµενο κόµβο της λίστας Ο τελευταίος κόµβος έχει null Xρειάζεται να διατηρούµε µια αναφορά προς τον Πρώτο κόµβο της λίστας ιατηρούµε και ένα δείκτη στο Τελευταίο κόµβο της λίστας. VK 23
Χρήση ΣΛ Υλοποίηση Κόμβου Πότε χρησιµοποιώ Λίστα Όταν διαπερνώ γραµµικά τα στοιχεία Αντίθετα όταν θέλω προσπέλαση στο ν-ιοστό στοιχείο καλύτερα Πίνακα Όταν θέλω να αλλάζω συχνά την σειρά των στοιχείων και η µετακίνηση κοστίζει. Υλοποίηση Κόμβου public class Node { private Object data; private Node next; public Node(Object d, Node n) { data=d; next=n; } Όταν θέλω να διατηρώ πολλαπλές ταξινοµήσεις των ίδιων στοιχείων π.χ ταξινόµηση σπουδαστή µε ΑΜ, επώνυµο & όνοµα,τµήµα κτλ. } public Node() { this(nulll,null); } //μέθοδοι get/set VK 24
Πρόσβαση σε κόμβο ΣΛ first Node Συνδεδεµένη λίστα µε 3 κόµβους εν υπάρχει άµεσος τρόπος πρόσβασης σε έναν οποιονδήποτε κόµβο της. Ο µόνος που «γνωρίζει» την ύπαρξη ενός κόµβου είναι ο προηγούµενόςτου, καθώς κρατά την διεύθυνσή του στο πεδίο του next. Για να έχουµε πρόσβαση σε έναν κόµβο πρέπει να περάσουµε στην σειρά από όλους τους προηγούµενους αρχίζοντας από τον πρώτο κόµβο VK 25
current Node Πρόσβαση σε κόμβο ΣΛ first Node Συνδεδεµένη λίστα µε 3 κόµβους Την διατρέχουµε ξεκινώντας από τον πρώτο κόµβο, currentnode=firstnode µετακινούµενοι µέσω του πεδίου του next currentnode=currentnode.next H διαδικασία αυτή µετακίνησης στον επόµενο κόµβο, γίνεται επαναληπτικά, όσες φορές χρειάζεται, ώστε να τοποθετηθούµε στον επιθυµητό κόµβο. VK 26
ΕΙΣΑΓΩΓΗ ΝΕΟΥ κόμβουστην αρχή ΣΛ data input Node first Node Συνδεδεµένη λίστα µε 4 κόµβους Ένας νέος κόμβος inputnode μπορεί να εισαχθεί σε οποιοδήποτε σημείο της λίστας, θα εξετάσουμε δυο περιπτώσεις στην αρχή και το τέλος της λίστας. insertfirst:εισάγει ένα στοιχείο στην αρχήτης λίστας insertlast: εισάγει ένα στοιχείο στο τέλος της λίστας INSERT FIRST (data) Οπρώτος κόμβος θα είναι ο inputnode και επόμενός του (το next) θαείναι οfirstnode inputnode=new Node(data,firstNode) //κλήση δομητή firstnode=inputnode Ή με μια εντολή: firstnode=new Node(data,firstNode) VK 27
ΕΙΣΑΓΩΓΗ ΝΕΟΥ κόμβου στο τέλος ΣΛ first Node input Node data Συνδεδεµένη λίστα µε 4 κόµβους lastnode Μπορούμε να διατηρούμε και ένα κόμβο lastnodeστο τέλος της λίστας INSERT LAST (data) O νέος κόμβος inputnode θα εισαχθεί στο τέλος της λίστας και θαέχει επόμενό τουnull(τέλος λίστας). Ο προηγούμενός του inputnode, θα είναι ο lastnode inputnode =new Node(data,null) // κλήση δομητή lastnode.next= inputnode lastnode= inputnode Ή με μια εντολή:lastnode= lastnode.next= new Node(data,null) VK 28
ΕΙΣΑΓΩΓΗ ΝΕΟΥ κόμβου ΣΛ input Node data first Node last Node Εισαγωγή σε άδεια λίστα - isempty() Όταν είναι άδεια η λίστα δηλ. όταν (firstnode==null) τότε firstnode = lastnode = new Node(data,null) Αλλιώς (όταν έχει μέσα στοιχεία) Ή εισάγω στην αρχή firstnode=new Node(data,firstNode) Ή εισάγω στην τέλος lastnode= lastnode.next= new Node(data,null) VK 29
ΔΙΑΓΡΑΦΗ πρώτου κόμβουσλ ο REMOVE FIRST () Θαδιαγραφεί ο πρώτος κόμβος που έχει σαν data τo o: Object o= firstnode.data θα γίνει πρώτος κόμβος firstnode ο επόμενός του (το next) firstnode= firstnode.next Αν η λίστα είναι άδεια θα δημιουργηθεί ListEmptyException Αν έχει ένα μόνο κόμβο η λίστα θα μείνει άδεια ( firstnode= lastnode =null ) VK 30
current ΔΙΑΓΡΑΦΗ τελευταίου κόμβουσλ current REMOVE LAST () Θα διαγραφεί ο τελευταίος κόμβος που έχει σαν data τo o Object o= lastnode.data current pre LastNode Τελευταίος κόμβος θα γίνει ο προηγούμενός του. Για να βρεθεί πρέπει να διατρέξω την λίστα ξεκινώντας από τον πρώτο κόμβο. Νode current =firstnode while current.next!= lastnode current=current.next Βγαίνοντας από το while έχω βρεί τον προηγούμενο του lastnode current.next=null //ο προηγούμενος θα δείξει null lastnode=current ο VK 31
Λίστα σαν Πίνακας Υλοποίηση σαν ένας πίνακας L από (ομοειδή) αντικείμενα έστω 10 θέσεων. L.length ισούται με 10 private Object[] L; L.size() ισούται με 5 //last first insertfirst (l6) Add insertlast (l7) -1 0 1 2 3 4 5 6 7 8 9 10 l2 l1 l3 l4 l5 D two indexes (first-2δείκτεςέναςγια το πρώτο και ένας για το τελευταίο-last) Delete l1: removefirst() l5: removelast() Λίστα διαγραφή και εισαγωγή στοιχείων και από τις δυο μεριές. Ορίζονται τα insertlast(object), insertfirst(object) removelast(), removefirst(), getlast() getfirst() Άλλο το µέγεθος της λίστας size:5 άλλο του πίνακα length:10 VK 32
Λίστα σαν Πίνακας Υλοποίηση σαν ένας πίνακας L από (ομοειδή) αντικείμενα έστω 10 θέσεων. insertlast(object) L[last++]=l7; insertlast(l7) -1 0 1 2 3 4 5 6 7 8 9 10 two indexes l3 l1 l2 l4 l5 l6 first last Εστω ότι ο δείκτης last στο τέλος του πίνακα ΕΙΚΟΝΙΚΗ ΥΠΕΡΧΕΙΛΙΣΗ (µε γεµάτες τις τελευταίες θέσεις) LAST ΕΙΚΟΝΙΚΗ ΥΠΕΡΧΕΙΛΙΣΗ (µε γεµάτες τις πρώτες θέσεις) FIRST To full() ορίζεται σαν (size() == L.length) // (6==10) Bάζοντας στοιχεία φθάνω στο last=q.length αλλά δεν είναι full() Τότε πρέπει να γίνει ευθυγράµµιση alignmentlast(), καθορίζοντας όµως πόσες είναι οι ελεύθερες θέσεις : free = L.length-size(); free /=2 ; //τις µοιράζω VK 33
class ArrayQueue { private Object[] S; private int top = 0; ΣΤΟΙΒΑ-ΟΥΡΑ-ΛΙΣΤΑ class ArrayQueue { private Object[] Q; private int first = 0; private int last = 0; private void alignment() class ArrayList {private Object[] L; private int first = 0; private int last = 0; private void alignmentfirst() private void alignmentlast() 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 public int size() public boolean isempty() public boolean isfull() public void push(object element) throws StructureFullException public Object pop() public Object top() public boolean contains(object obj) public boolean equals(datastructure otherstructure) public void clear() } public int size() public boolean isempty() public boolean isfull() public void enqueue(object element) throws StructureFullException public Object dequeue() public Object front() public boolean contains(object obj) public boolean equals(datastructure otherstructure) public void clear() } public int size() public boolean isempty() public boolean isfull() public void insestlast(object element) throws StructureFullException public void insestfirst(object element) throws StructureFullException public Object removelast() public Object removefirst() public Object getlast() public Object getfirst() public boolean contains(object obj) public boolean equals(datastructure otherstructure) public void clear() VK 34 }