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

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

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

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Προγραμματισμός Δομές Δεδομένων

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

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

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Ανάπτυξη και Σχεδίαση Λογισμικού

Φροντιστήριο 4 Σκελετοί Λύσεων

ιαφάνειες παρουσίασης #5 (β)

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

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

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

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

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

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

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

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

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

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

Εισαγωγή στον Προγραμματισμό

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Εργαστήριο 5. Εαρινό Εξάμηνο

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 19η: Δομές δεδομένων

Εισαγωγή στον Προγραμματισμό

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Δομημένος Προγραμματισμός (ΤΛ1006)

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

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Ανάπτυξη και Σχεδίαση Λογισμικού

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Ανάπτυξη και Σχεδίαση Λογισμικού

Σημειώσεις έκτης και έβδομης εβδομάδας

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης (Κεφάλαιο , KNK-2ED)

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

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

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

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

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

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

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

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

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

Transcript:

Διάλεξη 6: Διαχείριση Μνήμης & Δυναμικές Δομές Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυναμικές Δομές Δεδομένων Γενικά Δυναμική Δέσμευση/Αποδέσμευση Μνήμης Δομή τύπου structure Αυτοαναφορικές δομές Η δήλωση typedef στη C Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ 6-1

Δυναμικές Δομές Δεδομένων Στατική Δομή Δεδομένων Η απαιτούμενη μνήμη για την εκτέλεση του προγράμματος δεσμεύεται κατά την αρχικοποίηση του προγράμματος. π.χ. struct person { char name[30], int age} costas, marios; // πριν την έναρξη του προγράμματος δεσμεύονται 34Bytes * 2 Δυναμική Δομή Δεδομένων Eνα πρόγραμμα κατά την εκτέλεσή του θα μπορεί να ζητά δυναμικά μνήμη για την αποθήκευση δεδομένων καθώς και να ελευθερώνει δυναμικά τη μνήμη που δεν χρειάζεται. Συνεπώς το μέγιστο πλήθος στοιχείων που μπορούμε να αποθηκεύσουμε δεν χρειάζεται να είναι γνωστό εκ των πρότερων αλλά μπορεί να ορίζετε κατά την διάρκεια εκτέλεσης του προγράμματος. 6-2

Δυναμικές Δομές Δεδομένων Θα μάθουμε πως μπορούμε να ζητήσουμε κατά την εκτέλεση του προγράμματος μνήμη από το λειτουργικό σύστημα και να την επιστρέψουμε όταν μας είναι πλέον άχρηστη. Όταν το λειτουργικό σύστημα δεν είναι σε θέση να μας δώσει άλλη μνήμη τότε και μόνο τότε το πρόγραμμά μας θα τυπώνει μηνύματα αδυναμίας αποθήκευσης πληροφοριών, κάτι που συμβαίνει όμως σπάνια και συνήθως όταν κάνουμε αλόγιστη χρήση της μνήμης. Τα σύγχρονα λειτουργικά συστήματα κάνουν χρήση εικονικής μνήμης (virtual memory). Δηλαδή χρησιμοποιείται μέρος της δευτερεύουσας μνήμης (hard disk) σαν λογική συνέχεια της κύριας μνήμης Ουσιαστικά η κύρια μνήμη εξαντλείτε μόνο αν εξαντληθεί η δευτερεύουσα μνήμη. 6-3

Δυναμική Δέσμευση Μνήμης void *malloc(num_of_bytes): η malloc() δεσμευει δυναμικά ένα συνεχόμενο block μνήμης (μεγέθους num_of_bytes) και επιστρέφει ένα δείκτη στο χώρο μνήμης που δέσμευσε. Η malloc() επιστρέφει NULL όταν η αίτηση δεν μπορεί να ικανοποιηθεί (δηλαδή δεν υπάρχει άλλη διαθέσιμη μνήμη για να δοθεί). Για παράδειγμα η malloc(sizeof(int)) δεσμεύει μνήμη για την αποθήκευση ενός ακεραίου και επιστρέφει ένα δείκτη (τη διεύθυνση δηλαδή) του χώρου μνήμης που δέσμευσε. Γιατί sizeof(int) και όχι απλά 4 => portability (αν κάποια πλατφόρμα χρησιμοποιεί 2 Bytes για αναπαράσταση ακεραίων τότε το πρόγραμμα μας εξακολουθεί να είναι σωστό!) Στη C μιλάμε πάντα για δείκτες ενός συγκεκριμένου τύπου πρέπει πάντα να κάνουμε cast τον δείκτη που επιστρέφει η malloc() στον αντίστοιχο τύπο. Δηλαδή (int *) malloc(sizeof(int)) 6-4

Δυναμική Δέσμευση Μνήμης (συν) Έτσι κάνοντας τις παρακάτω δηλώσεις και κλήσεις: int *nump; // δήλωση δείκτη (χωρίς δέσμευση μνήμης) // δέσμευση μνήμης για αναπαράσταση ενός ακέραιου. nump = (int *) malloc(sizeof(int)); // αρχικοποίηση περιεχομένου *nump = 17; // αποδέσμευση μνήμης free(nump); Σημαντική είναι η χρήση της sizeof(type) η οποία μας επιστρέφει το μέγεθος αντικειμένου τύπου type και μας απελευθερώνει από τη δυσκολία εύρεσης του ποσού μνήμης που απαιτείται για την αποθήκευση ενός αντικειμένου τύπου type. 6-5

Aυτοαναφορικές δομές struct Employee { char name[20]; int age; struct Employee manager; }; Στην πιο πάνω δομή θα δοθεί compile error, γιατί το struct Employee χρησιμοποιείται κατά την διάρκεια της δήλωσης του. Εντούτις μπορούμε να ορίσουμε δομές που αναφέρονται στον εαυτό τους, όπως στην προκειμένη περίπτωση δομή Employee όπου για κάθε στοιχείο της έχουμε πεδίο που αναφέρεται στον διευθυντή του εργοδοτημένου, χρησιμοποιώντας δείκτες: struct Employee { char name[20]; int age; struct Employee *manager; }; printf("%d", sizeof(struct Employee)); επιστρέφει 28 6-6

Δομή structure Αυτοαναφορικές δομές Όταν χρησιμοποιούμε δυναμική δέσμευση μνήμης συνήθως το κάνουμε για την αποθήκευση όχι τόσο απλών τύπων δεδομένων (int, float, char κλπ.) αλλά αντικειμένων τύπου structure. Αυτό γιατί μπορούμε μέσω αντικειμένων τύπου structure να φτιάξουμε κόμβους, να τους συνδέσουμε μεταξύ τους και να δημιουργήσουμε έτσι μία συνδεδεμένη λίστα ή άλλες εξελιγμένες δομές όπως στοίβες, ουρές, λίστες αναμονής, δέντρα κλπ. Ένας απλός ορισμός κόμβου μιας συνδεδεμένης λίστας είναι ο εξής: struct node { int data; struct node *next; }; Προσέξτε ότι ένα πεδίο της δομής που υλοποιεί τον κόμβο είναι δείκτης στην ίδια δομή που ορίζεται. Αυτό το φαινόμενο όπως είπαμε ονομάζεται αυτοαναφορική δομή (self-referential structures). 6-7

Αυτοαναφορικές δομές (συν.) Παρόμοια μπορούμε να ορίσουμε παραλλαγή αυτοαναφορικών δομών όπου δύο δομές αναφέρονται η μια στην άλλη. Αυτό αντιμετωπίζεται ως εξής: struct s1 {... struct s2 *p;... }; struct s2 {... struct s1 *q;... }; 6-8

Δομή τύπου structure (συν.) Έχοντας λοιπόν καθορίσει τη μορφή ενός κόμβου μπορούμε να φανταστούμε πως θα είναι μία συνδεδεμένη λίστα με κόμβους τύπου struct node που ορίσαμε νωρίτερα: head data next data next data next 17 NULL 9 14 6-9

Δομή τύπου structure (συν.) Μια λίστα 10 στοιχείων θα μπορούσε να υλοποιηθεί ως εξής: struct node *head, *temp; int i; head = (struct node *) malloc (sizeof(struct node)); temp = head; for(i=0; i<10; i++) { temp->data = i; if (i==9) break; temp->next = (struct node *) malloc(sizeof(struct node)); temp = temp->next; } temp->next = NULL; temp = head; struct node { int data; struct node *next; }; Σημείωση: ο δείκτης temp είναι βοηθητικός για την υλοποίηση της λίστας. for(i=0; i<10; i++) { printf("%d %d\n", temp->data, temp->next); temp = temp->next; } 6-10

Η δήλωση typedef στη C Η C παρέχει μέσω της δήλωσης typedef τη δημιουργία νέων ονομάτων σε τύπους δεδομένων που ήδη υπάρχουν. Προσοχή: δεν δημιουργούμε νέους τύπους δεδομένων. Απλά βαφτίζουμε με νέα ονόματα τύπους που ήδη υπάρχουν. Μερικά παραδείγματα είναι τα εξής: typedef int Akeraios; typedef struct node NODE; /* το struct node έχει οριστεί νωρίτερα */ Έτσι ορισμοί μεταβλητών μπορούν να υπάρξουν τώρα ως εξής: Akeraios NODE len, I, arr[20]; head, tail, *temp; 6-11

Η δήλωση typedef στη C (συν.) Πολλές φορές βαφτίζουμε μία δομή ταυτόχρονα με τον ορισμό της, όπως στο παράδειγμα: typedef struct node { int data; } NODE; struct node *next; Είναι καλή συνήθεια να χρησιμοποιούμε ως όνομα στο typedef το ίδιο όνομα της δομής αλλά με κεφαλαία γράμματα. Γιατί να χρησιμοπoιούμε τη δήλωση typedef ; 1. Γιατί δημιουργεί πιο αναγνώσιμο και πιο κατανοητό κώδικα. Το να δηλώσεις NODE *ptr; είναι πιο κατανοητό από το να δηλώσεις ένα δείκτη σε μία πολύπλοκη δομή (struct node *ptr; ). 2. Ο κώδικας γίνεται πιο λιτός. Π.χ. ptr = (NODE *)malloc(sizeof(node)); 6-12

Δομή τύπου structure (συν.) Τώρα μια λίστα 10 στοιχείων θα μπορούσε να υλοποιηθεί και ως εξής: NODE *head, *temp; int i; head = (NODE *) malloc (sizeof(node)); temp = head; for(i=0; i<10; i++) { temp->data = i; if (i==9) break; temp->next = (NODE *) malloc(sizeof(node)); temp = temp->next; } temp->next = NULL; temp = head; typedef struct node { int data; struct node *next; } NODE ; Σημείωση: ο δείκτης temp είναι βοηθητικός για την υλοποίηση της λίστας. for(i=0; i<10; i++) { printf("%d %d\n", temp->data, temp->next); temp = temp->next; } 6-13