Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Σχετικά έγγραφα
Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συνδεδεµένες οµές εδοµένων. Εισαγωγή στις Συνδεδεµένες οµές εδοµένων

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

4. Συνδεδεμένες Λίστες

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιεπαφές και Εσωτερικές κλάσεις Interfaces and Inner Classes. ιεπαφές - Interfaces

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Δομές Δεδομένων & Αλγόριθμοι

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

υναµικές οµές εδοµένων

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Δομές Δεδομένων (Data Structures)

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Generics και η κλάση ArrayList. Εισαγωγή στα Generics

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Εξαιρέσεις. try, catch, finally, throw, throws

Συλλογές, Στοίβες και Ουρές

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Αντικειμενοστρεφής Προγραμματισμός

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Βασικές Έννοιες Δοµών Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Βασικές οµές εδοµένων

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Διαδικασιακός Προγραμματισμός

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Οντοκεντρικός Προγραμματισμός

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Δομές Δεδομένων & Αλγόριθμοι

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

FAIL PASS PASS οριακά

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

JDSL Java Data Structures Library

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εισαγωγή στην επιστήμη των υπολογιστών. Οργάνωση εδομένων Κεφάλαιο 11ο ομές εδομένων

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Προγραµµατισµός Ι (ΗΥ120)

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

2.1 Αντικειµενοστρεφής προγραµµατισµός

Κλάσεις και Αντικείµενα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Στοίβες με Δυναμική Δέσμευση Μνήμης

Στοίβες. ΟΑΤ της Στοίβας. Περιγραφή και Υλικό Ανάγνωσης. Αφηρηµένοι Τύποι εδοµένων (AΤ )

Διάλεξη 08: ΛίστεςΙΙ Κυκλικές Λίστες. Διδάσκων: Παναγιώτης Ανδρέου

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Αντικειμενοστραφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Επιµέλεια Θοδωρής Πιερράτος

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Λογισµικό (Software SW) Γλώσσες

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Transcript:

Προγραµµατισµός ΙΙ Ηγλώσσααντικειµενοστραφούς προγραµµατισµού Java ιδάσκων ηµήτριος Κατσαρός, Ph.D. @ Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας ιάλεξη 13η: 30/08/2006 1

Συνδεδεµένες οµές εδοµένων Linked Data Structures 2

Εισαγωγή στις Συνδεδεµένες οµές εδοµένων Μια συνδεδεµένη δοµή δεδοµένων (linked data structure) αποτελείται από κάψουλες δεδοµένων γνωστές ως κόµβοι (nodes) που συνδέονται µε συνδέσµους (links) Οι σύνδεσµοι παροµοιάζονται µε βέλη και επιτρέπουν µιαςδιαδροµής µεταβάσεις από κόµβο σε κόµβο Στη Java, οι κόµβοι υλοποιούνται ως αντικείµενα κάποιας κλάσης κόµβου Τα δεδοµένα σε έναν κόµβο αποθηκεύονται σε instance variables Οι σύνδεσµοι υλοποιούνται ως αναφορές (references) Μια reference είναι µια διεύθυνση µνήµης, και αποθηκεύεται σε µια µεταβλητή τύπου κλάσης Εποµένως, ένας σύνδεσµος είναι και ο ίδιος µια instance variable τύπου ίδιου µε τον τύπο κλάσης του κόµβου 3

Συνδεδεµένες Λίστες στη Java Το απλούστερο είδος συνδεδεµένης δοµής δεδοµένων είναι η συνδεδεµένη λίστα (linked list) Μια συνδεδεµένη λίστα (ΣΛ) αποτελείται από µια απλή αλυσίδα κόµβων, καθένας από τους οποίους συνδέεται µε τον επόµενό του µε έναν σύνδεσµο Οπρώτοςκόµβος λέγεται κόµβος-κεφαλή (head node) Ο τελευταίος κόµβοςυπηρετείτορόλοτου προσδιοριστή-τέλους (end marker) 4

Κόµβοι και Σύνδεσµοι σε Συνδεδεµένη Λίστα 5

Μια απλή κλάση Συνδεδεµένης Λίστας Σε µια ΣΛ, κάθε κόµβος είναι ένα αντικείµενο µιας κλάσης κόµβου Σηµειώστε ότι κάθε κόµβος τυπικά αναπαρίσταται ως ένα κουτί που περιέχει ένα ή περισσότερα κοµµάτια δεδοµένων Κάθε κόµβος περιέχει δεδοµένα και σύνδεσµο σε έναν άλλο κόµβο Κάθε τµήµα τωνδεδοµένων αποθηκεύεται ως µια instance variable του κόµβου Τα δεδοµένα αναπαριστώνται ως πληροφορία που περιέχεται στο κουτί του κόµβου Οι σύνδεσµοι υλοποιούνται ως references σε έναν κόµβο και αποθηκεύονται ως µια instance variable τύπου κόµβου Οι σύνδεσµοι τυπικά απεικονίζονται ως βέλη που δείχνουν από έναν κόµβο σε κάποιον άλλο 6

Μια κλάση κόµβου (1/3) 7

Μια κλάση κόµβου (2/3) 8

Μια κλάση κόµβου (3/3) 9

Μια απλή κλάση Συνδεδεµένης Λίστας Ο πρώτος κόµβος ονοµάζεται κεφαλή της λίστας Ολόκληρη η λίστα µπορεί να διασχιστεί εάν ξεκινήσουµε από την κεφαλή της και επισκεφτούµε κάθε επόµενο κόµβο µε τησειρά Υπάρχει συνήθως µια µεταβλητή του ίδοιυ µε κάθε κόµβο (π.χ., head) που περιέχει µια reference στον πρώτο κόµβο της λίστας Όµως, δεν είναι ο κόµβος-κεφαλή, ούτε και είναι κάποιος κόµβος Απλά περιέχει µια reference στον κόµβοκεφαλήnode 10

Μια απλή κλάση Συνδεδεµένης Λίστας Ένα αντικείµενο που αντιπροσωσπεύει µια ΣΛ περιέχει τη µεταβήτή head ως µια instance variable της κλάσης Ένα αντικείµενο που αντιπροσωσπεύει µια ΣΛ δεν περιέχει όλους του κόµβους της λίστας άµεσα Αλλά, χρησιµοποιεί την instance variable head για να εντοπίζει τον πρώτο κόµβο της λίστας Η κεφαλή της λίστας και κάθε κόµβος της λίστας περιέχουν µια instance variable που αντιστοιχεί σε έναν σύνδεσµο καιπαρέχειµια reference στον επόµενο κόµβο της λίστας Εποµένως, αφού µπορούµε ναεντοπίσουµε την κεφαλή της λίστας, µπορούµε ναφτάσουµε καισε κάθε άλλο κόµβο της λίστας 11

Μια κενή Λίστα σηµατοδοτείται µε null Η instance variable head περιέχει µια reference στον πρώτο κόµβο της λίστας Εάν η λίστα είναι κενή, αυτή η instance variable τίθεται στην τιµή null Σηµείωση: Αυτό ελέγχεται µε χρήσητου==, και µε τη µέθοδο equals Ο constructor της ΣΛ θέτει την instance variable, που αντιστοιχεί στην κεφαλή, σε τιµή null Αυτό σηµατοδοτεί ότι η δηµιουργηθείσα ΣΛ είναι κενή 12

Μια κλάση Συνδεδεµένης Λίστας (1/6) 13

Μια κλάση Συνδεδεµένης Λίστας (2/6) 14

Μια κλάση Συνδεδεµένης Λίστας (3/6) 15

Μια κλάση Συνδεδεµένης Λίστας (4/6) 16

Μια κλάση Συνδεδεµένης Λίστας (5/6) 17

Μια κλάση Συνδεδεµένης Λίστας (6/6) 18

Σηµατοδοτώντας το τέλος µιας ΣΛ Ο τελευταίος κόµβος της ΣΛ θα πρέπει να εχει την instance variable που αντιστοιχεί στον σύνδεσµο σε τιµή null Με τον τρόπο αυτό µπορούµε να ελέγξουµε εάνο κόµβος είναι ο τελευταίος της λίστας ή όχι Σηµείωση: Αυτό ελέγχεται µε χρήσητου==, και όχι µε τηµέθοδο equals 19

ιασχίζοντας µια ΣΛ Εάν µια ΣΛ περιέχει κόµβους, µπορεί να διασχιστεί ως εξής: Θέτουµε µια τοπική µεταβλητή στην τιµή του κόµβουκεφαλή (αναφορά) Έτσι έχουµε τη θέση του πρώτου κόµβου Μετά την προσπέλαση του πρώτου κόµβου, η µέθοδος προσπέλασης για την instance variable του συνδέσµου παρέχει τη θέση του επόµενου κόµβου Επαναλαµβάνουµε αυτή τη διαδικασία µέχρι η θέση του επόµενου κόµβου να γίνει ίση µε null 20

ιασχίζοντας µια ΣΛ 21

Προσθέτοντας έναν κόµβο σε µια ΣΛ Η µέθοδος add προσθέτει έναν κόµβο στην αρχή της ΣΛ Έτσι ο νέος κόµβος γίνεται η νέα κεφαλή της ΣΛ Η µεταβλητή head δίνει τη θέση του πρώτου κόµβου της λίστας Εποµένως, όταν δηµιουργείται ένας νέος κόµβος, το πεδίο του link τίθεται ίσο µε head Κατόπιν, η head τίθεται ίση µε τον νέο κόµβο 22

Προσθέτοντας έναν κόµβο στην αρχή της ΣΛ 23

ιαγράφοντας τον κόµβο-κεφαλή από µια ΣΛ Η µέθοδος deleteheadnode διαγράφει τον πρώτο κόµβο από τη ΣΛ Αφήνει την µεταβλητή head να δείχνει (δηλ., να περιέχει µια reference) στον δεύτερο κόµβο της λίστας Ο διαγεγραµµένος κόµβος θα συλλεγεί αυτόµατα και η µνήµη που καταλάµβανε θα διατεθεί εκ νέου στο σύστηµα 24

Επίδειξη µιας ΣΛ (1/3) 25

Επίδειξη µιας ΣΛ (2/3) 26

Επίδειξη µιας ΣΛ (3/3) 27

Inner κλάση για τον κόµβο Σηµειώστε ότι η κλάση της ΣΛ εξαρτάται από µια εξωτερική κλάση για τον κόµβο Μια ΣΛ ή µια παρόµοια δοµή δεδοµένων µπορεί να γίνει αυτο-περιεχόµενη εάν κάνουµε την κλάση του κόµβου να είναι µια inner κλάση Εάν ορίσουµε µια inner κλάση για τον κόµβο καλό είναι να την κάνουµε private, εκτός και εάν χρησιµοποιείται αλλού Αυτό θα απλοποιήσει τον ορισµό της κλάσης γιατί θα εξαφανίσει την ανάγκη να ορίσουµε accessor και mutator µεθόδους Αφού οι instance variables είναι private, µπορούν να προσπελαστούν άµεσα (by name) από µεθόδους της outer class 28

Παγίδα: Κενά ασφάλειας Οι αρχικές κλάσεις για τον κόµβο και τη ΣΛ όπως αναπτύχθηκαν έχουν ένα επικίνδυνο κενό ασφάλειας Η accessor µέθοδος της κλάσης node επιστρέφει µια reference σε έναν node Θυµηθείτε ότι εάν µια µέθοδος επιστρέφει µια reference σε µια instance variable µιας mutable κλάσης, τότε ο περιορισµός private restriction πάνω σε αυτή την instance variables µπορεί εύκολα να παρακαµφθεί Ο ευκολότερος τρόπος για να φτιάξουµε αυτότο πρόβληµα είναι να κάνουµε την κλάση node να είναι private inner κλάσης της κλάσης της linked list 29

Μια κλάση Linked List µε Inner κλάση για τον Node (1/6) 30

Μια κλάση Linked List µε Inner κλάση για τον Node (2/6) 31

Μια κλάση Linked List µε Inner κλάση για τον Node (3/6) 32

Μια κλάση Linked List µε Inner κλάση για τον Node (4/6) 33

Μια κλάση Linked List µε Inner κλάση για τον Node (5/6) 34

Μια κλάση Linked List µε Inner κλάση για τον Node (6/6) 35

Μια Generic Συνδεδεµένη Λίστα Μπορούµε να δηµιουργήσουµε µια ΣΛ της οποίας η κλάση Node έχει παράµετρο τύπου (type parameter) T για τον τύπο των δεδοµένων που θα αποθηκεύονται στον κόµβο Εποµένως, µπορεί να αποθηκεύει αντικείµενα οποιασδήποτε κλάσης, ακόµα και τύπων που περιλαµβάνουν πολλαπλές instance variable Ο τύπος για το πραγµατικό αντικείµενο ενσωµατώνεται στην παράµετρο τύπου T Για το µεγαλύτερο µέρος, αυτή η κλάση µπορεί να έχει τις ίδιες µεθόδους, να κωδικοποιηθεί µε τον ίδιο τρόπο, όπως και το προηγούµενο παράδειγµα ΣΛ Μόνο διαφορά είναι η χρήση της παραµέτρου τύπου αντί για τον πραγµατικό τύπο 36

Κλάση Generic Συνδεδεµένης Λίστας (1/9) 37

Κλάση Generic Συνδεδεµένης Λίστας (2/9) 38

Κλάση Generic Συνδεδεµένης Λίστας (3/9) 39

Κλάση Generic Συνδεδεµένης Λίστας (4/9) 40

Κλάση Generic Συνδεδεµένης Λίστας (5/9) 41

Κλάση Generic Συνδεδεµένης Λίστας (6/9) 42

Κλάση Generic Συνδεδεµένης Λίστας (7/9) 43

Κλάση Generic Συνδεδεµένης Λίστας (8/9) 44

Κλάση Generic Συνδεδεµένης Λίστας (9/9) 45

είγµα κλάσης για τα δεδοµένα µιας Generic ΣΛ (1/2) 46

είγµα κλάσης για τα δεδοµένα µιας Generic ΣΛ (2/2) 47

Επίδειξη µιας Generic ΣΛ (1/2) 48

Επίδειξη µιας Generic ΣΛ (2/2) 49

Παγίδα: Χρήση του Node αντί για Node<T> Σηµείωση: Αυτή η παγίδα εξηγείται µε παράδειγµα οποιαδήποτε ονόµατα µπορούν να αντικαταστήσουν τα Node και την παράµετρο <T> Όταν ορίσαµε την κλάση LinkedList3<T>, ο τύπος των κόµβων είναι Node<T>, ΌΧΙ Node Εάν παραλείψουµε το<t>, αυτό είναι λάθος για το οποίο ο compiler µπορεί να σηµατοδοτήσει ή όχι ένα error message (εξαρτάται από τις λεπτοµέρειες του κώδικα), και εάν το κάνει, το µήνυµα λάθους θα είναι παράξενο Θα πρέπει να ελέγχουµε για κάποιο <T> που λείπει όταν ένα πρόγραµµα που χρησιµοποιεί κόµβους µε παραµέτρους τύπου δίνει παράξενα µηνύµατα ή δεν εκτελείται σωστά 50

Generic ΣΛ: Η µέθοδος equals Όπως και οι άλλες κλάσεις, µια κλάση ΣΛ θα πρέπει να έχει κανονικά µια µέθοδο equals Η µέθοδος equals µπορεί να οριστεί µε διάφορους τρόπους ιαφορετικοί ορισµοί µπορεί να είναι κατάλληλοι για διαφορετικές εφαρµογές υο τέτοιοι τρόποι είναι οι εξής: 1. Οι ΣΛ περιέχουν τα ίδια δεδοµένα (πιθανόν µε διαφοετική διάταξη) 2. Περιέχουνταίδιαδεδοµένα στην ίδια σειρά Φυσικά, ο τύπος που ενσωµατώνεται στη θέση του T πρέπει να έχει ξαναορίσει τη µέθοδο equals 51

Μέθοδος equals για την ΣΛ του Display 15.7 (1/2) 52

Μέθοδος equals για την ΣΛ του Display 15.7 (2/2) 53

Απλοί Copy Constructors και µέθοδος clone Υπάρχει ένας απλός τρόπος να ορίζουµε τους copy constructors και τη µέθοδο clone για δοµές δεδοµένων όπως οι ΣΛ υστυχώς, αυτή η προσέγγιση παράγει µόνο shallow copies Η private βοηθητική µέθοδος copyof χρησιµοποιείται και από τον copy constructor και από την µέθοδο clone Ο copy constructor χρησιµοποιεί την copyof για να δηµιουργήσει ένα αντίγραφο της λίστας των κόµβων Η µέθοδος clone πρώτα ενεργοποιεί τη µέθοδο clone της superclass, και κατόπιν χρησιµοποιεί την copyof για να δηµιουργήσει έναν κλώνο της λίστας των κόµβων 54

Μια Generic ΣΛ: privateµέθοδος copyof Η private βοηθητική µέθοδος copyof δέχεται ένα όρισµα τοοποίοείναιµια αναφορά στον κόµβο-κεφαλή µιας ΣΛ, και επιστρέφει µια reference στον κόµβοκεφαλή ενός αντιγράφου αυτής της ΣΛ ιασχίζει την Σλ που αποτελεί το όρισµα κόµβο-ανά-κόµβο και δηµιουργεί ένα αντίγραφο κάθε κόµβου Οι νέοι κόµβοι προστίθενται στο τέλος της ΣΛ που φτιάχνεται κατά τη διαδικασία Όµως, παρόλο που αυτή η διαδικασία παράγει µια ΣΛ µε νέους κόµβους, η νέα λίστα δεν είναι πραγµατικά ανεξάρτητη επειδή το αντικείµενο για τα δεδοµένα δεν κλωνοποιείται 55

Copy Constructor και clone για µια Generic ΣΛ (1/6) 56

Copy Constructor και clone για µια Generic ΣΛ (2/6) 57

Copy Constructor και clone για µια Generic ΣΛ (3/6) 58

Copy Constructor και clone για µια Generic ΣΛ (4/6) 59

Copy Constructor και clone για µια Generic ΣΛ (5/6) 60

Copy Constructor και clone για µια Generic ΣΛ (6/6) 61

Παγίδα: Η clone είναι protected στην Object Θα ήταν προτιµότερο να κλωνοποιήσουµε τα δεδοµένα που ανήκουν στην λίστα, της οποίας φτιάχνουµε αντίγραφο, µέσα στη µέθοδο copyof ως εξής: nodereference = new Node((T)(position.data).clone(), null); Όµως, αυτό δεν επιτρέπεται, και αυτός ο κώδικας δεν κάνει compile Το error message θα δηλώσει ότι η clone είναι protected στο Object Παρόλο που ο χρησιµοποιούµενος τύπος είναι ο T, και όχι Object, οποιαδήποτε κλάση µπορεί να ενσωµατωθεί αντί του T Όταν η κλάση γίνεται compiled, το µόνο που γνωρίζει η Java είναι ότι ο T είναι µια κλάση απόγονος της Object 62

Exceptions Μια generic δοµή δεδοµένων είναι πιθανόν να έχει µεθόδους που πετάνε exceptions Καταστάσεις όπως όταν ένα null όρισµα σε έναν copy constructor µπορεί να αντιµετωπιστούν µε διαφορετικό τρόπο σε διαφορετικές περιστάσεις Εάν αυτό συµβεί, είναι καλύτερο να πετάξουµε µια NullPointerException, και να αφήσουµε τον προγραµµατιστεί που χρησιµοποιεί τη ΣΛ να χειριστεί την εξαίρεση Μια NullPointerException είναι µια unchecked exception: δεν χρειάζεται να την πιάσουµε ήνατην δηλώσουµε σεµια πρόταση throws 63

Υπόδειξη: Χρησιµοποιήστε µια παράµετρο τύπου µε όριαγιαµια καλύτερη clone Μια λύση στο πρόβληµα αυτό είναι να τοποθετούµε ένα όριο στην παράµετρο τύπου T ώστε αυτή να ικανοποιεί ένα κατάλληλο interface Παρόλο που δεν υπάρχει standard interface που το κάνει αυτό, είναι εύκολο να ορίσουµε κάποιο Για παράδειγµα, θα µπορούσε να οριστεί ένα PubliclyCloneable interface 64

Υπόδειξη: Χρησιµοποιήστε µια παράµετρο τύπου µε όριαγιαµια καλύτερη clone Οποιαδήποτε κλάση που υλοποιεί το PubliclyCloneable interface θα έχει τις εξής ιδιότητες: 1. Θα υλοποιεί το Cloneable interface επειδή το PubliclyCloneable extends Cloneable 2. Θα πρέπει να υλοποιεί µια public clone µέθοδο 3. Η µέθοδος clone της κλάσης θα πρέπει να δηµιουργεί ένα deep copy 65

Το interface PubliclyCloneable 66

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (1/8) 67

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (2/8) 68

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (3/8) 69

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (4/8) 70

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (5/8) 71

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (6/8) 72

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (7/8) 73

Generic ΣΛ µε clone µέθοδο που φτιάχνει deep copy (8/8) 74

ΣΛ µε clone που φτιάχνει deep copy Μερικές από τις λεπτοµέρειες της µεθόδου clone στην προηγούµενη κλάση ΣΛ ίσως είναι δυσνόητες, αφού και ο επόµενος κώδικας θα επιστρέψει επίσης ένα deep copy: public LinkedList<T> clone() { return new LInkedList<T>(this); } Όµως, επειδή η κλάση υλοποιεί το PubliclyCloneable το οποίο, µε τη σειρά του, extends το Cloneable, άρα η κλάση υλοποιεί και το Cloneable interface, όπως καθορίζεται από το Java documentation 75

Κλάση PubliclyCloneable (1/4) 76

Κλάση PubliclyCloneable (2/4) 77

Κλάση PubliclyCloneable (3/4) 78

Κλάση PubliclyCloneable (4/4) 79

Επίδειξη της deep copy clone (1/3) 80

Επίδειξη της deep copy clone (2/3) 81

Επίδειξη της deep copy clone (3/3) 82

Υπόδειξη: Το Cloning είναι υπόθεση Όλα ή Τίποτα Όταν ορίζεται µια µέθοδος clone για κάποια κλάση, τότε θα πρέπει να ακολουθεί τις επίσηµες οδηγίες της Java Ειδικότερα, θα πρέπει να υλοποιεί το Cloneable interface 83

Επαναλήπτες - Iterators Μια συλλογή αντικειµένων, όπως οι κόµβοι µιας ΣΛ, πρέπει συχνά να προσπελάζονται µε τη σειρά ώστε να εκτελεστεί κάποια λειτουργία του προγράµµατος Ένας επαναλήπτης (iterator) είναι ένα αντικείµενο που επιτρέπει τη διάσχιση µιας λίστας µε τον τρόπο αυτό Μπορεί να δηµιουργθεί µια κλάση ΣΛ η οποία να έχει µια κλάση iterator ως inner κλάση της Εάν οι µεταβλητές iterator πρόκειται να χρησιµοποιηθούν εκτός της κλάσης της ΣΛ, τότε η inner κλάση iterator θα πρέπει να είναι public Η κλάση ΣΛ θα έχει µια µέθοδο iterator η οποία θα επιστρέφει έναν iterator στο καλούν αντικείµενο εδοµένης µιας ΣΛ list, αυτό µπορεί να γίνει ως εξής: LinkedList2.List2Iterator i = list.iterator(); 84

Επαναλήπτες - Iterators Οι βασικές µέθοδοι που χρησιµοποιούνται από έναν iterator είναι οι εξής: restart: Θέτει τον iterator στην αρχή της λίστας hasnext: Προσδιορίζει εάν υπάρχει κάποιο άλλο (επόµενο) στοιχείο στη λίστα next: ίνει το επόµενο στοιχείο της λίστας 85

Μια ΣΛ µε Iterator (1/6) 86

Μια ΣΛ µε Iterator (2/6) 87

Μια ΣΛ µε Iterator (3/6) 88

Μια ΣΛ µε Iterator (4/6) 89

Μια ΣΛ µε Iterator (5/6) 90

Μια ΣΛ µε Iterator (6/6) 91

Χρήση ενός iterator (1/6) 92

Χρήση ενός iterator (2/6) 93

Χρήση ενός iterator (3/6) 94

Χρήση ενός iterator (4/6) 95

Χρήση ενός iterator (5/6) 96

Χρήση ενός iterator (6/6) 97

To interface Iterator της Java Η Java ένα interface µε όνοµα Iterator που καθορίζει πώς η Java επιθυµεί να συµπεριφέρεται ένας iterator Παρόλο που οι iterators που εξετάστηκαν µέχρι στιγµής δεν ικανοποιούν αυτό το interface, όµως µπορούν εύκολα να ξαναοριστούν, ώστε να το ικανοποιούν 98

Προσθήκη και διαγραφή κόµβων Ένας iterator χρησιµοποιείται κανονικά για την προσθήκηήδιαγραφήκόµβων σε µια ΣΛ εδοµένων των µεταβήτων τύπου iterator µε ονόµατα position και previous, οι επόµενες δυο γραµµές κώδικα θα διαγράψουν έναν κόµβο στη θέση position: previous.link = position.link; position = position.link; Σηµείωση: η µεταβλητή previous δείχνει στον κόµβο πριν από τη θέση position 99

ιαγραφή κόµβου (1/2) 100

ιαγραφή κόµβου (2/2) 101

Προσθήκη και διαγραφή κόµβων Θυµηθείτε ότι η Java υποστηρίζει automatic garbage collection Σε πολλές άλλες γλώσσσες προγραµµατισµού ο προγραµµατιστής πρέπει να κρατά έλεγχο των κόµβωνπουδιαγράφηκανκαινα επιστρέφει ρητά (free στη C, delete στην C++) την µνήµη που δέσµευαν στο σύστηµα Αυτή η διαδικασία λέγεται explicit memory management Οι µεταβλητές τύπου iterator position και previous µπορούν επίσης να χρησιµοποιηθούν για να προσθέσουµε ένανκόµβο Η previous θα δείχνει στον κόµβο πριν από το σηµείο εισαγωγής, και η position θα δείχνει στον κόµβο µετά το σηµείο εισαγωγής Node temp = new Node(newData,position); previous.link = temp; 102

Προσθήκη κόµβου µεταξύ δυο άλλων (1/2) 103

Προσθήκη κόµβου µεταξύ δυο άλλων (2/2) 104

Παραλλαγές µιας ΣΛ Μια συνήθης ΣΛ επιτρέπει µετακίνηση κατά µια κατέυθυνση µόνο Όµως, µια ιπλά Συνδεδεµένη Λίστα ( ΣΛ) έχει ένα σύνδεσµο που κάνει reference στον επόµενο κόµβο, και ένα σύνδεσµο που κάνει reference στον προηγούµενο κόµβο Η κλάση node για µια ΣΛ µπορεί να είναι κάπως έτσι: private class TwoWayNode { private String item; private TwoWayNode previous; private TwoWayNode next;... Επιπλέον, οι constructors και οι µέθοδοι στην ΣΛ θα πρέπει να τροποποιηθούν για να λάβουν υπόψη τους τον επιπλέον σύνδεσµο 105

Η ιπλάσυνδεδεµένη Λίστα ( ΣΛ) 106

Ηδοµή της Στοίβας (Stack) Η Στοίβα δεν είναι απαραίτητα µια Συνδεδεµένη δοµή, αλλά µπορεί να υλοποιηθεί και ως τέτοια Μια στοίβα είναι µια δοµή που µετακινεί στοιχεία σε φορά αντίστροφη από αυτή µε την οποία εισήχθησαν (LIFO: Last In First Out) Μια ΣΛ η οποία κάνει εισαγωγές και διαγραφές µόνο από την κεφαλή της λίστας είναι µια στοίβα! 107

Ηδοµή τηςουράς(queue) Η Ουρά είναι µια δοµή δεδοµένων που διαχειρίζεται τα δεδοµένα της µε τρόπο firstin/first-out fashion (FIFO), όπως µια γραµµή (ουρά) σε µια τράπεζα Οι πελάτες προστίθονται στο τέλος της γραµµής και εξυπηρετούνται από την αρχή της γραµµής Μια ουρά µπορεί να υλοποιηθεί µια ΣΛ Όµως, µια ουρά χρειάζεται ένα δείκτη και στα δυο άκρα της ουράς, δηλ. στην κεφαλή (head) και στο τέλος (tail) της ΣΛ Οι κόµβοι διαγράφονται από το µπροστινό µέρος (front), και προστίθονται στο πίσω µέρος (back) της ουράς 108

Μια κλάση Ουράς (1/5) 109

Μια κλάση Ουράς (2/5) 110

Μια κλάση Ουράς (3/5) 111

Μια κλάση Ουράς (4/5) 112

Μια κλάση Ουράς (5/5) 113

Επίδειξη µιαςκλάσηςουράς(1/2) 114

Επίδειξη µιαςκλάσηςουράς(2/2) 115