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

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

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

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

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

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

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

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

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

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

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

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

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

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

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

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

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

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

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

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

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

FAIL PASS PASS οριακά

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

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

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

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

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

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

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

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

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

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

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

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

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

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

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

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

Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Στοιχειώδεις Δομές Δεδομένων

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

403 FAIL Λάθος στο πακετάρισµα του αρχείου.

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

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

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

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

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

Ιδιοκτησία Αντικειµένου

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Διάλεξη 22η: Επιπλέον στοιχεία της C

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

Transcript:

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο) Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου http://www.cs.ucy.ac.cy/courses/epl232 Το μάθημα αυτό δομήθηκε βάση των διαλέξεων του Αναπλ. Καθηγητή Δημήτρη Ζεϊναλιπούρ Ένα από τα πλεονεκτήματα μιας είναι ότι οι κόμβοι μπορούν να προστεθούν σε οποιοδήποτε σημείο της λίστας. Η αρχή μιας λίστας είναι η ευκολότερη θέση για την εισαγωγή ενός κόμβου. Ας υποθέσουμε ότι η new_node δείχνει στον κόμβο που θα εισαχθεί, και η first δείχνει στον πρώτο κόμβο της συνδεδεμένης λίστας. Εργαλεία 1

Χρειάζονται δύο δηλώσεις για να εισαχθεί ο κόμβος στη λίστα. Το πρώτο βήμα είναι να κάνουμε το νέο στοιχείο του κόμβου next να δείχνει στον κόμβο που προηγουμένως έδειχνε η αρχή της λίστας: new_node->next = first; Το δεύτερο βήμα είναι να κάνουμε το first να δείχνει στο νέο κόμβο: first = new_node; Αυτές οι δηλώσεις λειτουργούν ακόμα και αν η λίστα είναι κενή. Ας δούμε τη διαδικασία εισαγωγής δύο κόμβων σε μια κενή λίστα. Θα εισάγουμε έναν κόμβο που περιέχει τον αριθμό 10, και μετά έναν κόμβο που περιέχει τον αριθμό 20. Εργαλεία 2

first = NULL; new_node = malloc(sizeof(struct node)); new_node->value = 10; new_node->next = first; first = new_node; new_node = malloc(sizeof(struct node)); Εργαλεία 3

new_node->value = 20; new_node->next = first; first = new_node; Μια συνάρτηση που εισάγει έναν κόμβο που περιέχει τον αριθμό n σε μια συνδεδεμένη λίστα, η οποία δείχνετε από το list: struct node *add_to_list(struct node *list, int n) struct node *new_node; new_node = malloc(sizeof(struct node)); if (new_node == NULL) printf("error: malloc failed in add_to_list\n"); exit(exit_failure); new_node->value = n; new_node->next = list; return new_node; Εργαλεία 4

Σημειώστε ότι η add_to_list επιστρέφει ένα δείκτη στον κόμβο που μόλις δημιουργήσατε. Όταν καλέσουμε την add_to_list, θα πρέπει να αποθηκεύσουμε την επιστρεφόμενη τιμή στο first: first = add_to_list(first, 10); first = add_to_list(first, 20); Μια συνάρτηση που χρησιμοποιεί την add_to_list για να δημιουργήσει μια συνδεδεμένη λίστα που περιέχει αριθμούς που έχουν εισαχθεί από το χρήστη: struct node *read_numbers(void) struct node *first = NULL; int n; printf("enter a series of integers (0 to terminate): "); for (;;) scanf("%d", &n); if (n == 0) return first; first = add_to_list(first, n); Εργαλεία 5

Αναζήτηση σε μια συνδεδεμένη λίστα Αν και ο βρόγχος while μπορεί να χρησιμοποιηθεί για την αναζήτηση σε μια λίστα, ο βρόγχος for είναι συχνά ανώτερος. Ένας βρόχος που επισκέπτεται τους κόμβους μιας συνδεδεμένης λίστας, χρησιμοποιώντας μια μεταβλητή δείκτη p για να παρακολουθεί τον "τρέχοντα" κόμβο είναι: for (p = first; p!= NULL; p = p->next) Ένας βρόχος αυτής της μορφής μπορεί να χρησιμοποιηθεί σε μια συνάρτηση που αναζητά έναν ακέραιο αριθμό n. Αναζήτηση σε μια συνδεδεμένη λίστα Εάν βρει το n, η λειτουργία θα επιστρέψει ένα δείκτη στον κόμβο που περιέχει το n; διαφορετικά, θα επιστρέψει ένα μηδενικό δείκτη. Μια αρχική έκδοση της συνάρτησης είναι: struct node *search_list(struct node *list, int n) struct node *p; for (p = list; p!= NULL; p = p->next) if (p->value == n) return p; return NULL; Εργαλεία 6

Αναζήτηση σε μια συνδεδεμένη λίστα Μια εναλλακτική λύση είναι η εξάλειψη της μεταβλητής p, και χρήση της list για την παρακολούθηση του τρέχοντα κόμβου: struct node *search_list(struct node *list, int n) for (; list!= NULL; list = list->next) if (list->value == n) return list; return NULL; Αφού η list είναι ένα αντίγραφο του αρχικού δείκτη της λίστας, δεν βλάπτει να το αλλάξετε μέσα στη λειτουργία. Αναζήτηση σε μια συνδεδεμένη λίστα Εναλλακτικά, με χρήση του while: struct node *search_list(struct node *list, int n) while (list!= NULL && list->value!= n) list = list->next; return list; Εργαλεία 7

Ένα μεγάλο πλεονέκτημα της αποθήκευσης δεδομένων σε μια συνδεδεμένη λίστα είναι ότι μπορούμε εύκολα να διαγράψετε κόμβους. Η διαγραφή ενός κόμβου περιλαμβάνει τρία βήματα: 1. Εντοπισμός του κόμβου που θα διαγραφεί. 2. Τροποποίηση του προηγούμενου κόμβου, ώστε να "παρακάμπτει" τον διαγραμμένο κόμβο. 3. Κλήση της free για να ανακτήσετε το χώρο που καταλαμβάνει ο διαγραμμένος κόμβος. Το Βήμα 1 είναι δυσκολότερο από ό, τι φαίνεται, επειδή το βήμα 2 απαιτεί την αλλαγή του προηγούμενου κόμβου. Υπάρχουν διάφορες λύσεις σε αυτό το πρόβλημα. Η τεχνική "τελικού δείκτη" περιλαμβάνει τη διατήρηση ενός δείκτη στον προηγούμενο κόμβο (prev) καθώς και ένα δείκτη στον τρέχοντα κόμβο (cur). Ας υποθέσουμε ότι η list δείχνεθ στη λίστα προς αναζήτηση και n είναι ο ακέραιος που θα διαγραφεί. Ένας βρόγχος που υλοποιεί το βήμα 1: for (cur = list, prev = NULL; cur!= NULL && cur->value!= n; prev = cur, cur = cur->next) ; Όταν ο βρόγχος τερματίζεται, η cur δείχνει στον κόμβο που θα διαγραφεί και η prev δείχνει στον προηγούμενο κόμβο. Εργαλεία 8

Ας υποθέσουμε ότι η list έχει την ακόλουθη εμφάνιση και n είναι 20: Ακολούθως, η cur = list, και prev = NULL έχουν εκτελεστεί: Ο έλεγχος cur!= NULL && cur->value!= n είναι ορθός, αφού η cur δείχνει σε έναν κόμβο και ο κόμβος δεν περιέχει το 20. Ακολούθως, η prev = cur, cur = cur->next έχουν εκτελεστεί: Εργαλεία 9

Ο έλεγχος cur!= NULL && cur->value!= n είναι πάλι σωστός, οπότε prev = cur, cur = cur->next εκτελείται ξανά: Αφού το cur τώρα δείχνει στον κόμβο που περιέχει το 20, ο έλεγχος cur->value!= n είναι λάθος και ο βρόγχος τερματίζει. Στη συνέχεια, θα εκτελέσουμε την παράκαμψη που απαιτείται από το βήμα 2. Η δήλωση prev->next = cur->next; κάνει το δείκτη στο προηγούμενο κόμβο να δείχνει στον κόμβο που δίχνει η τρέχουσα τιμή του κόμβου: Εργαλεία 10

Το Βήμα 3 είναι να απελευθερώσει τη μνήμη που καταλαμβάνει ο τρέχων κόμβος: free(cur); Η συνάρτηση delete_from_list χρησιμοποιεί τη στρατηγική που μόλις εξηγήσαμε. Όταν δίνεται μια λίστα και ένας ακέραιος n, η συνάρτηση διαγράφει τον πρώτο κόμβο που περιέχει τον αριθμό n. Εάν δεν υπάρχει κόμβος που να περιέχει το n, η delete_from_list δεν κάνει τίποτα. Η διαγραφή του πρώτου κόμβου στη λίστα είναι μια ειδική περίπτωση που απαιτεί διαφορετικό βήμα παράκαμψης. Εργαλεία 11

struct node *delete_from_list(struct node *list, int n) struct node *cur, *prev; for (cur = list, prev = NULL; cur!= NULL && cur->value!= n; prev = cur, cur = cur->next) ; if (cur == NULL) return list; /* n was not found */ if (prev == NULL) list = list->next; /* n is in the first node */ else prev->next = cur->next; /* n is in some other node */ free(cur); return list; Ασκήσεις κατανόησης Γράψτε την συνάρτηση int *create_array, η οποία επιστρέφει ένα δείκτη σε ένα δυναμικά δεσμευμένο πίνακα τύπου int με n στοιχεία, τα οποία αρχικοποιούνται σε μια initial_value. Η συνάρτηση θα πρέπει να επιστρέφει NULL εάν ο πίνακας δεν μπορεί να δεσμευτεί. int *create_array(int n, int initial_value) int *a, *p; a = malloc(n * sizeof(int)); if (a!= NULL) for (p = a; p < a + n; p++) *p = initial_value; return a; Εργαλεία 12

Ασκήσεις κατανόησης Έστω οι ακόλουθες δηλώσεις: struct point int x, y; struct rectanglestruct point upper_left, lower right; struct rectangle *p Έστω πως ο δείκτης p δείχνει στη δομή rectangle όπου η άνω αριστερή γωνία είναι στο σημείο (10,25), και η κάτω δεξιά γωνία είναι στο (20,15). Γράψτε μια σειρά από δηλώσεις που δεσμεύουν μια τέτοια δομή και την αρχικοποιούν αναλογα. p = malloc(sizeof(struct rectangle)); p->upper_left.x = 10; p->upper_left.y = 25; p->lower_right.x = 20; p->lower_right.y = 15; Ασκήσεις κατανόησης Ο ακόλουθος βρόγχος υποτίθεται πως διαγράφει όλους τους κόμβους από μια συνδεδεμένη λίστα και ελευθερώνει την μνήμη που καταλαμβάνουν. Δυστυχώς είναι λάθος. Εξηγήστε γιατί και διορθώστε. for (p = first; p!= NULL; p = p->next) free(p); Πρέπει να έχουμε τον επόμενο δείκτη πρωτού ελευθερώσουμε την μνήμη για τον κόμβο: struct node *p: while((p = list)!= NULL) // set p to list, stop if empty. list = list- > next; // advance list to next element free(p); // delete saved pointer. Εργαλεία 13