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

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - 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: Λίστες ΙΙ Κυκλικές Λίστες

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FAIL PASS PASS οριακά

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

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

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

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

JDSL Java Data Structures Library

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

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

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Δομημένος Προγραμματισμός

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

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

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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 1

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

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

Μια απλή κλάση Συνδεδεµένης Λίστας Ο πρώτος κόµβος ονοµάζεται κεφαλή της λίστας Ολόκληρηηλίσταµπορείναδιασχιστείεάν ξεκινήσουµε απότηνκεφαλήτηςκαιεπισκεφτούµε κάθε επόµενο κόµβο µε τησειρά Υπάρχει συνήθως µια µεταβλητή του ίδοιυ µε κάθε κόµβο (π.χ., 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 4

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

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

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

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

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

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 10

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

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

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

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

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

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

Επίδειξη µιας 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 17

Μέθοδος 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 18

Μια Generic ΣΛ: private µέθοδος copyof Η private βοηθητική µέθοδος copyof δέχεται ένα όρισµα το οποίο είναι µια αναφορά στον κόµβο-κεφαλή µιας ΣΛ, και επιστρέφει µια reference στον κόµβοκεφαλή ενός αντιγράφου αυτής της ΣΛ ιασχίζει την Σλ που αποτελεί το όρισµα κόµβο-ανά-κόµβο και δηµιουργεί ένα αντίγραφο κάθε κόµβου Οι νέοι κόµβοι προστίθενται στο τέλος της ΣΛ που φτιάχνεται κατά τη διαδικασία Όµως, παρόλο που αυτή η διαδικασία παράγει µια ΣΛ µε νέους κόµβους, η νέα λίστα δεν είναι πραγµατικά ανεξάρτητη επειδή το αντικείµενο για τα δεδοµένα δεν κλωνοποιείται 55 Copy Constructor και clone για µια Generic ΣΛ (1/6) 56 Copy Constructor και clone για µια Generic ΣΛ (2/6) 57 19

Copy Constructor και clone για µια Generic ΣΛ (3/6) 58 Copy Constructor και clone για µια Generic ΣΛ (4/6) 59 Copy Constructor και clone για µια Generic ΣΛ (5/6) 60 20

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 21

Υπόδειξη: Χρησιµοποιήστε µια παράµετρο τύπου µε όρια για µια καλύτερη 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 22

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

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

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 25

Κλάση PubliclyCloneable (1/4) 76 Κλάση PubliclyCloneable (2/4) 77 Κλάση PubliclyCloneable (3/4) 78 26

Κλάση PubliclyCloneable (4/4) 79 Επίδειξη της deep copy clone (1/3) 80 Επίδειξη της deep copy clone (2/3) 81 27

Επίδειξη της 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 28

Επαναλήπτες - Iterators Οι βασικές µέθοδοι που χρησιµοποιούνται από έναν iterator είναι οι εξής: restart: Θέτει τον iterator στην αρχή της λίστας hasnext: Προσδιορίζει εάν υπάρχει κάποιο άλλο (επόµενο) στοιχείο στη λίστα next: ίνει το επόµενο στοιχείο της λίστας 85 Μια ΣΛ µε Iterator (1/6) 86 Μια ΣΛ µε Iterator (2/6) 87 29

Μια ΣΛ µε Iterator (3/6) 88 Μια ΣΛ µε Iterator (4/6) 89 Μια ΣΛ µε Iterator (5/6) 90 30

Μια ΣΛ µε Iterator (6/6) 91 Χρήση ενός iterator (1/6) 92 Χρήση ενός iterator (2/6) 93 31

Χρήση ενός iterator (3/6) 94 Χρήση ενός iterator (4/6) 95 Χρήση ενός iterator (5/6) 96 32

Χρήση ενός 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 33

ιαγραφή κόµβου (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 34

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

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

Μια κλάση Ουράς (1/5) 109 Μια κλάση Ουράς (2/5) 110 Μια κλάση Ουράς (3/5) 111 37

Μια κλάση Ουράς (4/5) 112 Μια κλάση Ουράς (5/5) 113 Επίδειξη µιαςκλάσηςουράς(1/2) 114 38

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