Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

Σχετικά έγγραφα
οµές (structures) και Eνώσεις (unions)

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

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

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

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

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

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

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Εισαγωγή στους Η/Υ. Ενότητα 2α: Χάρτης Karnaugh (Βοηθητικό υλικό)

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

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

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

Προγραμματισμός Η/Υ. Ενότητα 6: Πίνακες και Δείκτες

Διοικητική Λογιστική

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

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

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

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

Εισαγωγή στους Αλγορίθμους

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

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

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Εισαγωγή στους Η/Υ. Ενότητα 5α: Λειτουργικά Συστήματα ΙΙ (Παραδείγματα Διαδρομών)

Κβαντική Επεξεργασία Πληροφορίας

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

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

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Εισαγωγή στους Υπολογιστές

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

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

Κβαντική Επεξεργασία Πληροφορίας

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 4: Συναρτήσεις

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Βέλτιστος Έλεγχος Συστημάτων

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

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

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

Διδακτική Πληροφορικής

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Εισαγωγή στον δομημένο προγραμματισμό

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

Διοίκηση Επιχειρήσεων

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Βάσεις Περιβαλλοντικών Δεδομένων

Μυελού των Οστών Ενότητα #1: Ερωτήσεις κατανόησης και αυτόαξιολόγησης

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Ψηφιακή Επεξεργασία Εικόνων

Διοικητική Λογιστική

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

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

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

Προγραμματισμός Η/Υ. 6 η ενότητα: Συναρτήσεις. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Βάσεις Περιβαλλοντικών Δεδομένων

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

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 5

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Δομές Δεδομένων Ενότητα 1

Εισαγωγή στους Αλγορίθμους Ενότητα 11η Άσκηση - Σταθμισμένος Χρονοπρογραμματισμός Διαστημάτων

Αερισμός. Ενότητα 1: Αερισμός και αιμάτωση. Κωνσταντίνος Σπυρόπουλος, Καθηγητής Σχολή Επιστημών Υγείας Τμήμα Ιατρικής

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Β. Διαφορικός Λογισμός

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Κβαντική Επεξεργασία Πληροφορίας

Ευφυής Προγραμματισμός

Προγραμματισμός Η/Υ. 7 η ενότητα: Αρχεία. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Ιστορία της μετάφρασης

Εισαγωγή στην Πληροφορική

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 4: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΔΕΝΤΡΑ

Έλεγχος και Διασφάλιση Ποιότητας Ενότητα 4: Μελέτη ISO Κουππάρης Μιχαήλ Τμήμα Χημείας Εργαστήριο Αναλυτικής Χημείας

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Transcript:

Προγραμματισμός Η/Υ Ενότητα 9: Νίκος Καρακαπιλίδης, Καθηγητής Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

Σκοποί ενότητας Κατανόηση της έννοιας της Δομής (struct) 2

Περιεχόμενα ενότητας Η έννοια της Δομής Δομές και συναρτήσεις Δείκτες σε Δομές Ενώσεις Εισαγωγή στις Δυναμικές Δομές Δεδομένων 3

Μέρος 1 ο Η έννοια της Δομής

Η έννοια της Δομής Ορισμός, δήλωση, αρχικοποίηση, αναφορά, ένθεση

Η έννοια της Δομής Αφαιρετικότητα Διεργασίες Δεδομένα Παράδειγμα: «Ποια είναι η διεύθυνσή σου;» Οδός, αριθμός, Τ.Κ., πόλη 6

Η έννοια της Δομής Διαχείριση ομάδων δεδομένων διαφορετικού τύπου τα οποία έχουν σχέση μεταξύ τους Κάθε δεδομένο έχει το δικό του όνομα Παράβαλε: τύπος πίνακα Γλώσσες Προγραμματισμού Εγγραφή (record) Πεδίο (field) Δομή (structure) Ευκολότερος χειρισμός τέτοιων δεδομένων 7

Ορισμός Δομής Γενική μορφή Ετικέτα Δομής struct <όνομα δομής> { <τύπος 1 ου μέλους> <όνομα 1 ου μέλους>; <τύπος 2 ου μέλους> <όνομα 2 ου μέλους>; Μέλη ή Πεδία <τύπος n ου μέλους> <όνομα n ου μέλους>; }; struct <όνομα δομής> { <τύπος μέλους> <όνομα 1 ου μέλους>, <όνομα 2 ου μέλους>; }; 8

Ορισμός Δομής Παραδείγματα struct rectangle { int x1, y1; /* συντεταγμένες κάτω αριστερής γωνίας */ int x2, y2; /* συντεταγμένες πάνω δεξιάς γωνίας */ int line_color; /* χρώμα εξωτερικής γραμμής */ int fill_color; /* χρώμα σχήματος */ }; 9

Ορισμός Δομής struct Person { char firstname[15]; char lastname[15]; char gender; /* M ή F */ int age; }; 10

Δήλωση μεταβλητών Γενική μορφή struct <όνομα δομής> <όνομα μεταβλητής>; ή struct <όνομα δομής> <λίστα ονομάτων μεταβλητών>; 11

Δήλωση μεταβλητών Εναλλακτική μορφή Ταυτόχρονα με τον ορισμό της δομής struct <όνομα δομής> { <τύπος 1 ου μέλους> <όνομα 1 ου μέλους>; <τύπος 2 ου μέλους> <όνομα 2 ου μέλους>; <τύπος n ου μέλους> <όνομα n ου μέλους>; } <λίστα ονομάτων μεταβλητών>; 12

Δήλωση μεταβλητών Παραδείγματα struct rectangle { int x1, y1; int x2, y2; int line_color; int fill_color; } rect1, rect2; Συνίσταται να γίνεται διαχωρισμός του ορισμού από τις δηλώσεις ή 13

Δήλωση μεταβλητών ή (με την προϋπόθεση ότι έχει προηγηθεί ο ορισμός της δομής rectangle) struct rectangle rect1, rect2; Δήλωση πίνακα Δομών struct Person people[10]; 14

Απόδοση αρχικών τιμών Απόδοση τιμών στα μέλη της Δομής struct Person x = { Νίκος, Ιωάννου, M, 43}; struct Person people[10] = { { Νίκος, Ανδρέου, M, 43}, { Μαρία, Γεωργίου, F, 38}, { Βασίλης, Λάκης, Μ, 28} }; Αρχικοποιούνται τα τρία πρώτα στοιχεία του πίνακα 15

Αναφορά στα μέλη μιας Δομής Μέσω της κατασκευής <όνομα μεταβλητής>.<όνομα μέλους> Παραδείγματα rect1.x1 rect2.line_color if (x.age > 40) printf( %s age: %d \n, x.lastname, x.age); 16

Ένθεση Δομών Δομές μπορεί να φωλιάζουν η µία μέσα στην άλλη, δημιουργώντας έτσι πιο πολύπλοκες δομές struct family { struct Person father; struct Person mother; int num_of_child; struct Person children[5]; }; 17

Ένθεση Δομών int main(void){ struct Person x, y, z; struct family fml; fml.num_of_child = 2; strcpy(fml.father.firstname, Joe ); strcpy(fml.children[0].firstname, Mary ); } 18

Μέρος 2 ο Δομές και συναρτήσεις

Δομές και συναρτήσεις

Δομές και συναρτήσεις Επιτρεπτές πράξεις σε μια δομή είναι: η αντιγραφή της η απόδοση τιμής σε αυτή σαν σύνολο η εξαγωγή της διεύθυνσής της η προσπέλαση των µελών της 21

Δομές και συναρτήσεις Μεταβλητές τύπου δομής μπορούν να περαστούν ως ορίσματα σε συναρτήσεις όπως επίσης και να επιστραφούν ως αποτελέσματα συναρτήσεων struct Person inc_age (struct Person x){ x.age += 1; return x; } struct Person x1, x2; x2 = inc_age(x1); 22

Δομές και συναρτήσεις Μη επιτρεπτή πράξη Σύγκριση δύο δομών (x1 == x2) Προβλήματα Να γράψετε συνάρτηση η οποία παίρνει δύο παραμέτρους τύπου struct Person και τις συγκρίνει Να γράψετε συνάρτηση η οποία παίρνει ως δεδομένο εισόδου μια οικογένεια (τύπου struct family) και ένα άτομο (τύπου struct Person) και αν το άτομο δεν ανήκει ήδη στα παιδιά της οικογένειας τότε το προσθέτει Αλγόριθμοι; 23

Μέρος 3 ο Δείκτες σε Δομές

Δείκτες σε Δομές

Δείκτες σε Δομές Η μεταβλητή addr1 που ορίζεται από τη δήλωση struct address addr1 έχει κάποια διεύθυνση Η έκφραση &addr1 δίνει τη διεύθυνση της δομής addr1 26

Δείκτες σε Δομές Η πρόταση struct address *addr_ptr = &addr1; έχει ως επακόλουθο ότι ο δείκτης addr_ptr δείχνει στη δομή addr1 παρέχοντας έτσι ένα εναλλακτικό τρόπο πρόσβασης στα μέλη της. Πολύ συχνή χρήση δεικτών σε δομές 27

Δείκτες σε Δομές Παρέχεται ο εναλλακτικός συμβολισμός: (*p).µέλος_δοµής = p->µέλος_δοµής Παραδείγματα struct Person p; struct address addr[10];... struct address *addr_ptr = &addr[0]; initperson(&p); addr_ptr++;... void initperson(struct Person *p){ strcpy( p->firstname, Aνδρέας ); strcpy( p->lastname, Ανδρέου ); p->gender = M ; p->age = 43; } 28

Μέρος 4 ο Ενώσεις

Ενώσεις Η χρήση των Ενώσεων

Ενώσεις Γενικά Η ένωση (union) είναι κατασκευή της C που μοιάζει με αυτή της δομής (structure) Η διαφορά έγκειται στο ότι τα μέλη των ενώσεων επικαλύπτουν το ένα το άλλο, μοιράζονται δηλαδή ένα κοινό κομμάτι μνήμης Ο συνολικός χώρος που καταλαμβάνει η ένωση είναι αυτός που απαιτεί το μέλος με το μεγαλύτερο μέγεθος Ο τύπος union χρησιμοποιείται στη C για τη δήλωση μεταβλητών που μπορούν να αποθηκεύσουν σε διαφορετικές στιγμές δεδομένα διαφορετικών τύπων και μεγεθών στην ίδια περιοχή μνήμης 31

Ενώσεις Παράδειγμα: Έστω ότι θέλουμε μια σταθερά σε ένα πρόγραμμα να δέχεται είτε μια ακέραια τιμή (int) είτε μια πραγματική τιμή (float). Θα μπορούσαμε να δηλώσουμε: struct { int ival; float fval; } constant; και να τοποθετούμε τη σταθερά µας σε ένα από τα δύο πεδία της δομής ανάλογα µε την τιμή της. Μειονέκτημα: αυτής της λύσης είναι ότι σπαταλά άσκοπα μνήμη (δεσμεύει μνήμη για δύο πεδία ενώ θα χρησιμοποιηθεί κάθε φορά µόνο το ένα) 32

Ενώσεις Χρήση ένωσης (union) Η προηγούμενη δήλωση γίνεται ως εξής: union { int ival; float fval; } constant; H μνήμη που δεσμεύεται σε αυτή την περίπτωση είναι η μέγιστη που απαιτείται για αποθήκευση ακριβώς μιας μεταβλητής από οποιονδήποτε από τους τύπους των πεδίων Η τιμή που ανακτάται κάθε φορά είναι η αυτή που αποθηκεύτηκε πιο πρόσφατα κατά την εκτέλεση. Είναι ευθύνη του προγραμματιστή να παρακολουθεί και να γνωρίζει ποιος τύπος είναι αποθηκευμένος σε μια ένωση 33

Παράδειγμα #define INT_TYPE 1; #define REAL_TYPE 2; struct item { int type; union { int ival; float fval; } constant; } struct item x; if (x.type == INT_TYPE) printf( value of const = %d\n, x.constant.ival); if (x.type == REAL_TYPE) printf( value of const = %f\n, x.constant.fval); 34

Μέρος 5 ο Εισαγωγή στις Δυναμικές Δομές Δεδομένων

Εισαγωγή στις Δυναμικές Δομές Δεδομένων Δυναμική διαχείριση μνήμης

Δυναμικές Δομές Δεδομένων Ίσως η σημαντικότερη καινοτομία που συναντάμε μέχρι τώρα κατά τη γνωριμία μας με τη γλώσσα C Ένα πρόγραμμα κατά την εκτέλεσή του μπορεί να ζητά δυναμικά μνήμη για την αποθήκευση δεδομένων καθώς και να ελευθερώνει δυναμικά τη μνήμη που δεν χρειάζεται 37

Δυναμικές Δομές Δεδομένων Ως σήμερα, δηλώναμε εκ των προτέρων μέσω απλών μεταβλητών ή πινάκων το μέγιστο αριθμό θέσεων μνήμης που ένα πρόγραμμα μπορεί να χειριστεί κατά την εκτέλεσή του Έτσι μηνύματα όπως Array is full ήταν πολύ συνηθισμένα όταν ο πίνακας γέμιζε Η υλοποίηση τύπων δεδομένων όπως η λίστα, η στοίβα και η ουρά μπορεί να μη βασιστεί σε πίνακες οι οποίοι μας αναγκάζουν να ορίσουμε τις διαστάσεις τους και συνεπώς το μέγιστο πλήθος στοιχείων που μπορούμε να αποθηκεύσουμε 38

Δυναμική Δέσμευση Μνήμης void *malloc(size) Η malloc() επιστρέφει ένα δείκτη στο χώρο μνήμης που δέσμευσε δυναμικά και στον οποίο μπορούμε να αποθηκεύσουμε ένα αντικείμενο μεγέθους size. Η malloc() επιστρέφει NULL όταν η αίτηση δεν μπορεί να ικανοποιηθεί (δεν υπάρχει άλλη διαθέσιμη μνήμη για να δοθεί) 39

Δυναμική Δέσμευση Μνήμης Παράδειγμα: Η malloc(sizeof(int)) δεσμεύει μνήμη για την αποθήκευση ενός ακεραίου και επιστρέφει ένα δείκτη (τη διεύθυνση δηλαδή) του χώρου μνήμης που δέσμευσε. Προσοχή: Επειδή στη C μιλάμε πάντα για δείκτες ενός συγκεκριμένου τύπου πρέπει πάντα να κάνουμε cast τον δείκτη που επιστρέφει η malloc() στον αντίστοιχο τύπο. Δηλαδή: (int *) malloc(sizeof(int)) 40

Δυναμική Δέσμευση Μνήμης Παράδειγμα δηλώσεων και κλήσεων int*nump; nump = (int *) malloc(sizeof(int)) ; Δέσμευση μνήμης για έναν ακέραιο Φύλαξη της διεύθυνσης της μνήμης αυτής σε έναν δείκτη *nump = 17;... free(nump); Αποθήκευση ενός ακεραίου στη μνήμη που δεσμεύσαμε μέσω του δείκτη Αργότερα σε περίπτωση που δεν χρειαζόμαστε πια άλλο τη μνήμη αυτή μπορούμε (για λόγους οικονομίας) να την επιστρέψουμε στο σύστημα Σημαντική είναι η χρήση της sizeof(type) η οποία μας επιστρέφει το μέγεθος αντικειμένου τύπου type και μας διευκολύνει στην εύρεση του ποσού μνήμης που απαιτείται για την αποθήκευση ενός αντικειμένου τύπου type 41

Αυτοαναφορικές δομές Χρήση δυναμικής δέσμευσης μνήμης Για την αποθήκευση όχι τόσο ακεραίων ή άλλων απλών τύπων δεδομένων αλλά αντικειμένων τύπου structure. Αυτό γιατί μπορούμε μέσω αντικειμένων τύπου structure να φτιάξουμε κόμβους, να τους συνδέσουμε μεταξύ τους και να δημιουργήσουμε έτσι μία συνδεδεμένη λίστα ή άλλες εξελιγμένες δομές όπως στοίβες, ουρές, λίστες αναμονής, δέντρα κλπ. 42

Αυτοαναφορικές δομές Απλός ορισμός κόμβου μιας συνδεδεμένης λίστας struct node { }; int data; struct node *next; Προσέξτε ότι ένα πεδίο της δομής που υλοποιεί τον κόμβο είναι δείκτης στην ίδια δομή που ορίζεται. Αυτό το φαινόμενο στις δομές τύπου structure το ονομάζουμε αυτοαναφορικές δομές (self-referential structures) 43

Αυτοαναφορικές δομές Συνδεδεμένη λίστα με κόμβους τύπου struct node head data next 17 data next 9 data next 14 NULL 44

Αυτοαναφορικές δομές struct node *head, *p1, *p2; head = (struct node *) malloc (sizeof(struct node)); p1 = (struct node *) malloc (sizeof(struct node)); p2 = (struct node *) malloc (sizeof(struct node)); head->data = 17; p1->data = 9; p2->data = 14; head->next = p1; p1->next = p2; p2->next = NULL; Σημ.: οι δείκτες p1 και p2 είναι βοηθητικοί για την υλοποίηση της λίστας 45

Η δήλωση typedef στη C Η C παρέχει μέσω της δήλωσης typedef τη δημιουργία νέων ονομάτων σε τύπους δεδομένων που ήδη υπάρχουν Προσοχή: δεν δημιουργούμε νέους τύπους δεδομένων Απλά βαφτίζουμε με νέα ονόματα τύπους που ήδη υπάρχουν 46

Η δήλωση typedef στη C Παραδείγματα typedef int Akeraios; typedef char *String; typedef struct node NODE; /* το struct node έχει οριστεί νωρίτερα */ Akeraios String NODE en, I, arr[20]; p, lineptr[maxlines]; n1, n2, *pn; 47

Η δήλωση typedef στη C Πολλές φορές «βαφτίζουμε» μία δομή ταυτόχρονα με τον ορισμό της typedef struct node { int data; struct node *next; } NODE; 48

Η δήλωση typedef στη C Είναι καλή συνήθεια να χρησιμοποιούμε ως όνομα στο typedef το ίδιο το όνομα της δομής αλλά με κεφαλαία γράμματα Χρήση της δήλωσης typedef Δημιουργεί πιο αναγνώσιμο και πιο κατανοητό κώδικα Το να δηλώσεις NODE *ptr; είναι πιο κατανοητό από το να δηλώσεις ένα δείκτη σε μία πολύπλοκη δομή (struct node *ptr;) Ο κώδικας γίνεται πιο λιτός. Παράδειγμα: ptr = (NODE *)malloc(sizeof(node)); 49

Στοίβες Μια στοίβα είναι μια λίστα στοιχείων που συνοδεύεται από τις διαδικασίες push, για εισαγωγή στοιχείου στη λίστα pop, για εξαγωγή του τελευταία εισαγομένου στοιχείου της λίστας 50

Στοίβες Για ευκολία στην διεκπεραίωση των δύο διαδικασιών θα ήταν χρήσιμο να γνωρίζουμε ανά πάσα στιγμή που βρίσκεται το τέλος της λίστας (και το μέγεθός της) 17 data next top size 3 9 13 NULL data next data next 51

Ουρές Μια ουρά είναι μια λίστα στοιχείων που συνοδεύεται από τις διαδικασίες queque, για εισαγωγή στοιχείου στη λίστα unqueue, για εξαγωγή του στοιχείου που εισήχθηκε πρώτο στη λίστα α 1 α 2... α n-1 α n 52

Ουρές Για ευκολία στην διεκπεραίωση των δύο διαδικασιών θα ήταν χρήσιμο να γνωρίζουμε ανά πάσα στιγμή που βρίσκεται το τέλος της λίστας (και το μέγεθός της) data next data next data next 17 9 13 NULL head tail length 3 53

Τέλος Ενότητας

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στο πλαίσιο του εκπαιδευτικού έργου των διδασκόντων. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 55

Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Πατρών, Πολυτεχνική Σχολή, Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών. Νίκος Καρακαπιλίδης, Δημήτρης Σαραβάνος. Νίκος Καρακαπιλίδης, Δημήτρης Σαραβάνος «Προγραμματοσμός Η/Υ. Ειδικά θέματα Δομών Δεδομένων». Έκδοση: 1.0. Πάτρα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: https://eclass.upatras.gr/courses/mech1207/ 56

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 57

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους. 58

Σημείωμα Χρήσης Έργων Τρίτων Οποιοδήποτε έργο στην παρούσα ενότητα, έχει δημιουργηθεί από τους διδάσκοντες του μαθήματος ή/και την Τμηματική Ομάδα Εργασίας και παρέχεται με την ίδια άδεια CC BY-NC-SA 4.0 59