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

Σχετικά έγγραφα
Διάλεξη 19η: Δομές δεδομένων

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Ι. Δομές & Ενώσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

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

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

Περιεχόμενα. Πρόλογος... 21

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

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

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

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

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

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

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

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

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

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

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

Περιεχόμενα. Πρόλογος... 17

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

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

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

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

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

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

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

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

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

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Ενδεικτική περιγραφή μαθήματος

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

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

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

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

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

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

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

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

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

Προγραμματισμό για ΗΜΥ

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

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

Δεδομένα, Τύποι και Τιμές

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

Transcript:

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

Δομές Δεδομένων (Data Structures) Καινούργιοι τύποι δεδομένων που αποτελούνται από την ομαδοποίηση υπαρχόντων τύπων δεδομένων Ομαδοποίηση πληροφορίας που δεν μπορεί να αποθηκευτεί σε μία μόνον μεταβλητή από τους δοσμένους τύπους της C Συλλογή μη διατεταγμένων και ομοιογενών τιμών Πλεονέκτημα: Καλύτερη οργάνωση διαχείριση πληροφορίας πιο ευέλικτος σχεδιασμός Όνομα Τίτλος #Ταυτότητας Μισθός Χρόνια Κώστας διευθυντής Α322442 1500 4 ΠΛ Υπάλληλος Β323144 1000 5 ΑΛ Υπάλληλος Β321421 800 2 ΒΛ Υπάλληλος Β134325 750 1 Προγραμματισμός 2

Ορισμός Δομών Ορισμός νέου τύπου δομής struct employee { char *name; char title[20]; char id[8]; double salary; int years; }; name id e years title salary Τα name, title, id, salary, years ονομάζονται τα μέλη ή πεδία της δομής To employee ονομάζεται η ετικέτα της δομής Προγραμματισμός 3

Αναπαράσταση στη μνήμη name title id salary years struct employee Προγραμματισμός 4

Δήλωση Μεταβλητών Τύπου Δομής struct employee e1, e2; struct employee *pe; struct employee manager = { AB, manager, A11111, 2000, 2}; struct employee e3 = {0}; // μηδενίζει όλα τα στοιχεία Προγραμματισμός 5

Πρόσβαση στα Περιεχόμενα της Δομής struct point { } ; int x; int y; struct point p; Με τον τελεστή. (τελεία) αποκτούμε πρόσβαση στα μέλη της δομής p.x = 10; p.y = 20; Προγραμματισμός 6

Εμφωλιασμένες Δομές Δομές ως μέλη άλλων δομών είναι επιτρεπτά: struct point { int x; int y; }; struct rectangle { struct point topleftcorner; struct point bottomrightcorner; } rect1; Πρόσβαση με διαδοχικές τελείες (.) rect1.topleftcorner.x = 10; rect1 topleftcorner x y bottomrightcorner x y Παίρνουμε το πεδίο x του πεδίου topleftcorner της μεταβλητής rect1 Προγραμματισμός 7

Πίνακες από Δομές Όπως και για κάθε άλλο τύπο: struct point { int x; int y; } p; struct point points[100]; points[2].x = 10; Προγραμματισμός 8

Χρήση Δομών Σαν κανονικές μεταβλητές για την αποθήκευση πληροφορίας Σαν ορίσματα σε Συναρτήσεις: void printemployee( struct employee e); Σαν επιστρεφόμενες τιμές από συναρτήσεις: struct employee newemployee(char *name, char *pos, char *id, double sal, int y); Σαν επιστρεφόμενες τιμές από συναρτήσεις ως δείκτες: struct employee *newemployee(char *name, char *pos, char *id, double sal, int y); Σε ποια περίπτωση θα χρησιμοποιούσατε το κάθε ένα; Προγραμματισμός 9

Δείκτες σε Δομές struct employee { char *name; char title[20]; char id[8]; double salary; int years; }; // Δήλωση της δομής employee struct employee *e; // Δήλωση της μεταβλητής e ως δείκτης σε δομή. struct employee d; // Δήλωση της μεταβλητής d ως δομή τύπου employee e = &d; // το e παίρνει τιμή την διεύθυνση της δομής d int *pi = &(d.years); // το e είναι δείκτης σε πίνακα 100 στοιχείων struct employee e = new employee[100]; // C++ e = (employee *) malloc(100*sizeof(struct employee)); /* C */ e[0].salary = 1000; Προγραμματισμός 10

Δείκτες σε Δομές struct employee *e; Πρόσβαση στα περιεχόμενα του δείκτη (*e) τα περιεχόμενα του δείκτη είναι η δομή (*e).title το πεδίο title της δομής που δείχνει ο e e[0].title συνώνυμο του παραπάνω e->title συνώνυμο του παραπάνω Προσοχή στις προτεραιότητες των τελεστών: (*e).title *e.title είναι ισοδύναμο με *(e.title) που δεν είναι αποδεκτό για την συγκεκριμένη δήλωση του e Προγραμματισμός 11

Αριθμητική δεικτών struct employee *e; e++; Προχωράει κατά sizeof(struct employee); Προγραμματισμός 12

Επιτρεπτές Πράξεις σε Δομές struct point { int x; int y; } p1, p2; Αντιγραφή p1 = p2; Απόδοση τιμής σαν σύνολο με λίστα σταθερών τιμών για τα μέλη: p1 = {5, 6}; Εξαγωγή διεύθυνσης: &p1 Προσπέλαση των μελών: p1.x ΔΕΝ ΕΠΙΤΡΕΠΕΤAI η σύγκριση δομών fread(), fwrite() Προγραμματισμός 13

Δομή Δεδομένων: Πίνακας Οργάνωση των δεδομένων: το ένα μετά το άλλο στην μνήμη Τελεστές: Δημιουργία πίνακα με συγκεκριμένο αριθμό στοιχείων Αποδέσμευση πίνακα με συγκεκριμένο αριθμό στοιχείων Εισαγωγή στοιχείου σε συγκεκριμένη θέση Ανάκτηση ενός στοιχείου από δεδομένη θέση Αλγόριθμοι: τους περιέχει ο μεταγλωττιστής της C int a[100]; ή a = (int *)malloc(100 * sizeof(int)); με το πέρας της εμβέλειας του a ή free(a); a[34] = 7; b = a[36]; Προγραμματισμός 14

Πίνακας Οργάνωση των δεδομένων: θεωρούμε τα δεδομένα μας διατεταγμένα (το ένα ακολουθεί το άλλο) //Δημιουργία struct employee *newemployee(int number) { struct employee *e; int i; e = new employee [number]; for (i = 0; i < number; ++i) e[i].salary = 1000; } return e; //Διαγραφή //Αναζήτηση //Εκτύπωση Προγραμματισμός 15

Πρόγραμμα Δημιουργεί ένα δυναμικό πίνακα από τυχαία σημεία του χώρου. Υπολογίζει όλα τα δυνατά τρίγωνα που δημιουργούνται από τα σημεία αυτά και τα εκτυπώνει. Μετά διαγράφει τυχαία κάποια μέλη του πίνακα και τυπώνει ξανά τα τρίγωνα. Μετά αποδεσμεύει τη μνήμη του πίνακα. Προγραμματισμός 16

typedef Ορισμός νέων ονομάτων για τους τύπους των μεταβλητών typedef τυπος όνομα; Κάνει συνώνυμο το όνομα με τον τύπο typedef unsigned long int size_t Το size_t γίνεται συνώνυμο του unsigned long int Αντί unsigned long int var1; size_t var; Προγραμματισμός 17

Παραδείγματα typedef typedef struct employee employee; employee e; typedef struct employee { char *name; char title[20]; } Employee; Χωρίς την typedef μπροστά δηλώνει μια μεταβλητή τύπου struct employee. Με την typedef δηλώνει ότι το όνομα Employee είναι συνώνυμο του struct employee. Προγραμματισμός 18

Unions Παρόμοια με τα structs union time { long simpledate; double percisedate; } mytime; Κρατείται ο «μεγαλύτερος» τύπος Προγραμματισμός 19

Unions: Example int main() { union data { char a; int x; float f; } mydata; int mode = 1; mydata.a = 'A'; printf("here is the Data:\n%c\n%i\n%.3f\n", mydata.a, mydata.x, mydata.f ); mydata.f = 101.357; mode = 3; printf("here is the Data: \n%c\n%i\n%.3f\n", mydata.a, mydata.x, mydata.f ); if( mode == 1 ) printf("the char is being used\n"); else if( mode == 2 ) printf("the int is being used\n"); else if( mode == 3 ) printf("the float is being used\n"); return 0; } mydata.x = 42; mode = 2; printf("here is the Data: \n%c\n%i\n%.3f\n", mydata.a, mydata.x, mydata.f ); Προγραμματισμός 20

ΗΥ-150 Προγραμματισμός Αυτοαναφορικές Δομές Δυναμικές Δομές Δεδομένων: Λίστες Προγραμματισμός

Αυτοαναφορικές Δομές Δομές που περιέχουν ως μέλη δείκτες σε δομές ίδιου τύπου struct node { int x; struct node *next; }; Προγραμματισμός 22

Αυτοαναφορικές Δομές x next? Προγραμματισμός 23

Αυτοαναφορικές Δομές x x next next NULL x next Προγραμματισμός 24

Αυτοαναφορικές Δομές Με περισσότερους από ένα δείκτες μπορούμε να έχουμε πολύ πολύπλοκες δομές δεδομένων struct node { int x; struct node *first; struct node *sec; struct node *third; }; Προγραμματισμός 25

Αυτοαναφορικές Δομές x first sec third x first sec Τι είδους third συνδεσμολογίες έχουν νόημα και είναι χρήσιμες; NULL NULL x first sec third x first sec third NULL Τα NULL δηλώνουν ότι δεν δείχνει πουθενά ο δείκτης Προγραμματισμός 26

Δείκτες, Πίνακες και Δομές Δήλωση του τύπου struct somestruct *ptr; Τι είναι και πως έχουμε πρόσβαση; Περίπτωση 1: μια μοναδική μεταβλητή τύπου struct somestruct Πρόσβαση: ptr->member Δέσμευση μνήμης Στατικά: struct somestruct a; ptr = &a; Δυναμικά: ptr = (struct somestruct *)malloc(sizeof(struct somestruct )); Προγραμματισμός 27

Δείκτες, Πίνακες και Δομές Δήλωση του τύπου struct somestruct *ptr; Περίπτωση 2: ένας πίνακας από μεταβλητές τύπου struct somestruct Πρόσβαση: ptr[index].member Δέσμευση μνήμης Στατικά: struct somestruct a[100]; ptr = a; ή ptr = &a[0]; Δυναμικά: ptr = (struct somestruct *)malloc(100*sizeof(struct somestruct)); Προγραμματισμός 28

Δείκτες, Πίνακες και Δομές Δήλωση του τύπου struct somestruct *ptr; Περίπτωση 3: μια δυναμική δομή δεδομένων με στοιχεία μεταβλητές τύπου struct somestruct Πρόσβαση: εξαρτάται από την δομή δεδομένων Δέσμευση μνήμης: εξαρτάται από την δομή δεδομένων Ο προγραμματιστής πρέπει να ξέρει την σημασιολογία της ptr και να την χρησιμοποιεί ανάλογα! Προγραμματισμός 29

Δομές Δεδομένων Ορισμός: Μια συλλογή δεδομένων οργανωμένα με συγκεκριμένο τρόπο + ένα σύνολο τελεστών που επενεργούν πάνω στην συλλογή + αλγόριθμοι που υλοποιούν τους τελεστές Δέντρα (δυαδικά και μη, B, R, Red-Black, κτλ) Γράφοι (διαταγμένοι, με βάρη, απλοί ή όχι, υπεργράφοι κτλ) Λίστες, ουρές, στοίβες, πίνακες, πίνακες κατακερματισμού (hash tables) Προγραμματισμός 30

Απλά Συνδεδεμένη Λίστα Οργάνωση των δεδομένων: θεωρούμε τα δεδομένα μας διατεταγμένα (το ένα ακολουθεί το άλλο) το καθένα δείχνει στο επόμενο του στην μνήμη struct node { }; int x; struct node *next; struct node *root; root x=5 x=15 next next x=-2 next NULL Προγραμματισμός 31

Απλά Συνδεδεμένη Λίστα Τελεστές: Δημιουργία κενής λίστας Αποδέσμευση λίστας Εισαγωγή στοιχείου μετά από ένα στοιχείο Διάσχιση της λίστας Ανάκτηση ενός στοιχείου με συγκεκριμένο περιεχόμενο Προγραμματισμός 32

Απλά Συνδεδεμένη Λίστα Αλγόριθμοι: Εισαγωγής Διαγραφής Αναζήτησης Εκτύπωση Προγραμματισμός 33

Διπλά Συνδεδεμένη Λίστα Οργάνωση των δεδομένων: θεωρούμε τα δεδομένα μας διατεταγμένα (το ένα ακολουθεί το άλλο) το καθένα δείχνει στο επόμενο και στο προηγούμενο του στην μνήμη struct node { int x; struct node *next; x=5 next prev x=15 next prev struct node *prev; }; NULL x=-2 next prev Προγραμματισμός 34

Πρόγραμμα Δημιουργεί μια απλά συνδεδεμένη λίστα από τυχαίους ακεραίους, τους εκτυπώνει. Μετά διαγράφει τυχαία κάποια μέλη της λίστας και την ξανατυπώνει. Μετά αποδεσμεύει τη μνήμη της λίστας. Προγραμματισμός 35