Οντοκεντρικόσ Ρρογραμματιςμόσ Ενότθτα 8: C++ ΒΙΒΛΙΟΗΚΗ STL, ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Δομζσ Δεδομζνων Ιωάννθσ Χατηθλυγεροφδθσ Ρολυτεχνικι Σχολι Τμιμα Μθχανικών Η/Υ & Ρλθροφορικισ
Δομζσ Δεδομζνων
Ειςαγωγι Δομζσ ςτακεροφ μεγζκουσ o Arrays, structs Δυναμικζσ δομζσ δεδομζνων o Το μζγεκοσ αυξάνεται και μειώνεται κατά τθν εκτζλεςθ του προγράμματοσ o Διαςυνδεμζνεσ λίςτεσ (Linked lists) Είςοδοσ και αφαίρεςθ από οποιοδιποτε ςθμείο o Στοίβεσ (Stacks) Είςοδοσ και αφαίρεςθ από τθν κορυφι o Ουρζσ (Queues) Είςοδοσ από το τζλοσ, αφαίρεςθ από τθν αρχι o Δυαδικά Δζντρα (Binary trees) Αποδοτικι αναηιτθςθ/ταξινόμθςθ 3/20
Αυτό-αναφερόμενθ κλάςθ Αυτό-αναφερόμενεσ κλάςεισ (Self-referential) o Ζχουν δείκτθ ςε αντικείμενο τθσ ίδια κλάςθσ o Σφνδεςθ μεταξφ τουσ για ςχθματιςμό χριςιμων δομών Lists, stacks, queues, trees o Η δομι τερματίηεται με το τελευταίο ςτοιχείο να δείχνει ςτο NULL class Node { public: Node( int ); private: int data; Node *nextptr; }; 4/20
Δζςμευςθ/Αποδζςμευςθ Μνιμθσ Δυναμικι δζςμευςθ μνιμθσ o Δζςμευςθ και απελευκζρωςθ μνιμθσ κατά τθν εκτζλεςθ o Δθμιουργία και αφαίρεςθ κόμβων Τελεςτισ new o Επιςτρζφει δείκτθ ςτο νζο αντικείμενο που δθμιουργεί Node *newptr = new Node( 5 ); Ρετάει εξαίρεςθ bad_alloc αν δεν υπάρχει διακζςιμθ μνιμθ Τελεςτισ delete o Αποδεςμεφει τθν μνιμθ που δεςμεφτθκε κατά τθν δθμιουργία Delete newptr; o Ρροςοχι: Δεν διαγράφεται ο δείκτθσ, απλά αποδεςμεφεται θ κζςθ ςτθν οποία εξακολουκεί να δείχνει. 5/20
Διαςυνδεμζνθ Λίςτα Διατθρεί δείκτθ ςτο πρώτο ςτοιχείο (Node) τθσ λίςτασ Κάκε ςτοιχείο διακζτει δείκτθ προσ το επόμενο οπότε μποροφμε να τα διαπεράςουμε ςειριακά Το τελευταίο ςτοιχείο δείχνει ςτο null (zero), ςθματοδοτώντασ ότι φτάςαμε ςτο τζλοσ τθσ λίςτασ Δυναμικι Λίςτα Κόμβου προςτίκενται και αφαιροφνται ανάλογα τισ ανάγκεσ Η τιμι που αποκθκεφεται ςτον κόμβο (value) μπορεί να είναι οποιοδιποτε τφπου Λειτουργίεσ: Είςοδοσ κόμβου ςτθν αρχι Είςοδοσ κόμβου ςτο τζλοσ Αφαίρεςθ κόμβου από τθν αρχι Αφαίρεςθ κόμβου από το τζλοσ 6/20
Τφποι Διαςυνδεμζνων Λιςτών Τφποι Διαςυνδεμζνων Λιςτών o Μονά ςυνδεδεμζνθ Λίςτα Pointer to first node Διαπζραςθ προσ μια κατεφκυνςθ μόνο (το τελευταίο δείχνει ςτο null) o Κυκλικι, μονά ςυνδεδεμζνθ Πμοια, αλλά το τελευταίο δείχνει ςτο πρώτο o Διπλά ςυνδεδεμζνθ Κάκε κόμβοσ ζχει δείκτθ ςτο επόμενο και ςτο προθγοφμενο ςτοιχείο Διαπζραςθ και προσ τισ δφο κατευκφνςεισ Ο τελευταίοσ κόμβοσ δείχνει ςτο null ωσ επόμενο Ο πρώτοσ κόμβοσ δείχνει ςτο null ωσ προθγοφμενο o Κυκλικι, διπλά ςυνδεδεμζνθ Πμοια, αλλά το πρώτο δείχνει ςτο τελευταίο και αντόςτροφα 7/20
Στοίβα Στοίβα (Stack) o Κόμβοι προςτίκενται και αφαιροφνται από τθν κορυφι Ρεριοριςμζνθ ζκδοςθ διαςυνδεμζνθσ λίςτασ o Δομι: Last-in, first-out (LIFO) o Ο πάτοσ τθσ ςτοίβασ δείχνει ςτο null Λειτουργίεσ o Push: προςκικθ κόμβου ςτθν κορυφι o Pop: Αφαίρεςθ κόμβου από τθν κορυφι 8/20
Υλοποίθςθ ςτοίβασ class Node{ private: int value; Node* next; public: Node (int valuein, Node* nextin): value(valuein), next(nextin) {} ~Node() {} int getvalue() const {return value;} Node* getnext() const {return next;} }; class Stack{ private: Node* top; public: Stack(){ top=0; } ~Stack() { Node* A; while(top!=0){ A=top; top=top->getnext(); delete A; } } void push(int k){ Node* n = new Node(k,top); top = n; } int pop(){ if (top==0) return 0; Node* A=top; int k=top->getvalue(); top=top->getnext(); delete A; return k; } }; int main() { Stack s; s.push(1); s.push(2); s.push(3); cout<< s.pop(); // 3 cout<< s.pop(); // 2 cout<< s.pop(); // 1 cout<< s.pop(); // 0 return 0; } 9/20
Ουρά Ουρά (Queue) o Σαν γραμμι αναμονισ o Είςοδοσ ςτο τζλοσ(ουρά), αφαίρεςθ από τθν αρχι. o Δομι: First-in, first-out (FIFO) Λειτουργίεσ o Enqueue: Κόμβοι προςτίκενται ςτο τζλοσ (ουρά - tail) o Dequeue: αφαίρεςθ από μπροςτά (κεφαλή - head) 10/20
Δζντρα Δζντρα - Trees o Μθ-γραμμικζσ δομζσ δφο διαςτάςεων o Οι κόμβοι ζχουν δφο ι περιςςότερεσ ςυνδζςεισ o Τα δυαδικά ζχουν ακριβώσ 2 ςυνδζςεισ/δείκτεσ από τουσ οποίουσ μπορεί ζνασ ι και οι δφο να είναι null (π.χ φφλλα του δζντρου) Ορολογία o ίηα Root: ο πρώτοσ κόμβοσ του δζντρου o Οι ςυνδζςεισ/δείκτεσ ενόσ κόμβου αναφζρονται ςτα παιδιά του o Φφλλο Leaf: κόμβοσ χωρίσ παιδιά 11/20
Δυαδικό Δζντρο Αναηιτθςθσ Δυαδικό δζντρο αναηιτθςθσ o Οι τιμζσ ςτο αριςτερό υπο-δζντρο κάκε κόμβου είναι μικρότερεσ από τθν τιμι του πατζρα o Οι τιμζσ ςτο δεξιό υπο-δζντρο κάκε κόμβου είναι μεγαλφτερεσ από τθν τιμι του πατζρα o Δεν επιτρζπονται διπλζσ τιμζσ o Γριγορθ αναηιτθςθ, log2n ςυγκρίςεισ για ιςορροπθμζνα δζντρα 50 22 80 11 40 70 98 2 13 35 46 72 12/20
Δυαδικό Δζντρο Αναηιτθςθσ Είςοδοσ κόμβων o Χριςθ αναδρομικισ ςυνάρτθςθσ o Ξεκινάει από τθν ρίηα o Αν ο τρζχον κόμβοσ είναι άδειοσ, ειςαγωγι του κόμβου ςε αυτόν (τζλοσ αναδρομισ) o Αλλιώσ, Αν θ τιμι του νζου κόμβου είναι μεγαλφτερθ από του τρζχοντα κόμβου, ειςαγωγι ςτο δεξιά υποδζντρο (αναδρομικι κλιςθ) Αν θ τιμι του νζου κόμβου είναι μικρότερθ από του τρζχοντα κόμβου, ειςαγωγι ςτο αριςτερά υποδζντρο (αναδρομικι κλιςθ) Αλλιώσ (ίδια τιμι), αγνόθςε τον κόμβο (υπάρχει ιδθ) 13/20
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από το Κεφάλαιο 19 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 14/20
Χρθματοδότθςθ Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Το ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Ρρογράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εκνικοφσ πόρουσ. 15/20
Σθμείωμα Ιςτορικοφ Εκδόςεων Ζργου Το παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 16/20
Σθμείωμα Αναφοράσ Copyright: Ρανεπιςτιμιον Ρατρών, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Ρρογραμματιςμόσ». Ζκδοςθ: 1.0. Ράτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 17/20
Σθμείωμα Αδειοδότθςθσ Το παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Ραρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «Σθμείωμα Χριςθσ Ζργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ Σθμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το Σθμείωμα Αναφοράσ το Σθμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ Σθμειωμάτων το Σθμείωμα Χριςθσ Ζργων Τρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 19/20
Σθμείωμα Χριςθσ Ζργων Τρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 20/20