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

Σχετικά έγγραφα
Στοίβες με Δυναμική Δέσμευση Μνήμης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

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

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

Σχεδίαση Γλωσσών Προγραμματισμού. Εαρινό Εξάμηνο Lec03 18/02/2019

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

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

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

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

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

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΠΡΟΣΑΝΑΤΟΛΙΣΜΟΥ (ΝΕΟ ΣΥΣΤΗΜΑ) 27 ΜΑΪΟΥ 2016 ΕΚΦΩΝΗΣΕΙΣ ÊÁËÁÌÁÔÁ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

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

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

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

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

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

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

Ενότητα 5: ΜΕΤΑΒΛΗΤΕΣ

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

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

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

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

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

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

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

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

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

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

Φροντιςτήριο. Linked-List

Οι δείκτες στη γλώσσα C

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

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

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

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

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

FAIL PASS PASS οριακά

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

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

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

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

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

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

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

Transcript:

Δείκτες και Δομές Ένας βασικός «δομικός λίθος». Όλη μαζί η δομή (struct) ονομάζεται κόμβος ή Node και αποτελείται από - Το μέλος Info οποιουδήποτε τύπου: int, άλλο struct (InfoField) - To μέλος ink τύπου δείκτη σε Node. Info ink typedef struct NodeTag { InfoField Info; struct NodeTag *ink; } NodeType;

Απεικονίσεις Λιστών και ενδείξεις τέλους τους : a a: b b: g g: null

Χρησιμοποιούμε εικόνες του τύπου A Info ink Info ink Info ink Όπου NU δηλώνει τον δείκτη που δεν δείχνει πουθενά. Ένδειξη τέλους, όχι αυτόματος τρόπος. (*NU).x είναι σφάλμα (όχι πάντα διαγνώσιμο) Info ink NU

Προσοχή σε... ifetime-διάρκεια Ζωής (3 κατηγορίες μνήμης): - Καθολικές στατικές μεταβλητές - Auto-Stack (τοπικές). Αυτόματη διαχείριση (μπλοκ). - Heap. Οποιοδήποτε αντικείμενο δημιουργείται με malloc ισχύει μέχρι να το αποδεσμεύσουμε με free. Η διαχείριση Heap είναι ευθύνη του προγραμματιστή. Ανακύκλωση: Όταν δεν χρειαζόμαστε άλλο τότε free. Alias-Συνώνυμα: Πολλαπλοί τρόποι αναφοράς για το ίδιο αντικείμενο στη μνήμη. Αιωρούμενοι (dangling) δείκτες: τι συμβαίνει αν ένας δείκτης δείχνει σε θέση μνήμης που δεν ισχύει;

Συνδεδεμένη λίστα //Ο τύπος κόμβος typedef struct NodeTag { InfoField Info; struct NodeTag *ink; } NodeType; Info ink // Ο τύπος δείκτη σε κόμβο typedef NodeType *NodePtr; // Η δήλωση δείκτη αρχής της λίστας NodePtr ; // πάντα χρειάζεται μια αρχή

Εισαγωγή σε συνδεδεμένη λίστα (4 βήματα). META από πού (αρχή, μέση, τέλος???)???????????? Info;ink Info;ink Info;ink Τα αρχικά βήματα 1, 2 είναι κοινά σε κάθε περίπτωση 1. Δημιουργούμε νέο κόμβο Ν NodePtr N; N = malloc(sizeof(nodetype)) 2. Βάζουμε τιμές στο Info του Ν Ν->Info= N Info;ink

Βήματα 3+4 για την σύνδεση του Ν (περιπτώσεις A, B) Α. Εισαγωγή στην αρχή (ισχύει και για κενή λίστα) 3. Τιμή στο ink του Ν N->ink = ;//Ισχύει και αν η ==Κενή(==NU) 4. Τον κάνουμε τον πρώτο κόμβο της λίστας. =N; Info;ink Info;ink Info;ink 4 N 3 Info;ink

Β. Εισαγωγή σε άλλη θέση (META από προδείκτη P) Info;ink Info;ink Info;ink P 3. Τιμή στο ink του Ν N->ink = P->ink; 4. Τον ενσωματώνουμε στη λίστα P->ink = N; P Info;ink Info;ink Info;ink P N 4 3

Αν έχουμε δείκτη ast και κάνουμε εισαγωγή στο τέλος πριν Info;ink Info;ink Info;ink μετά Info;ink Info;ink Info;ink ast ast N Info;ink

... η Εισαγωγή στο τέλος (P==ast) Βήματα 1, 2, 3, 4 όπως πριν + 5ο 1. Δημιουργούμε νέο κόμβο NodePtr N; Ν = malloc(sizeof(nodetype)) 2. Βάζουμε τιμές στο Info του Ν Ν->Info=. 3. Τιμή στο ink του Ν N->ink = P->ink; //ή N->ink=NU; 4. Τον ενσωματώνουμε στη λίστα ως τελευταίο P->ink = N; //ή ast->ink = N; 5. Έλεγχος και Ενημέρωση Δείκτη ast if (P==ast) ast = N; Είναι σωστό; Τι γίνεται αν ο τελευταίος είναι και ο πρώτος;

Διαγραφή Κόμβου (με/χωρίς ast)????????? Info;ink Info;ink Info;ink...... H first last????????? Info;ink Info;ink Info;ink......

Διαγραφή του πρώτου κόμβου typedef struct NodeTag { InfoField Info; struct NodeTag *ink; } NodeType;... T if (!=NU) // υπάρχουν στοιχεία? { NodeType *Τ = ; // προσωρινός δείκτης για free = ->ink; // Νέα τιμή του o επόμενος if ( == NU) // διαγραφή μοναδικού κόμβου ast = NU; // τότε αλλάζει και ο ast free(τ); // ελευθέρωσε τον κόμβο } else ;// ένδειξη εντοπισμού λάθους

Διαγραφή άλλου κόμβου (ΜΕΤΑ από τον προδείκτη P) Info;ink Info;ink Info;ink... P T if ((P!=NU)&&(P->ink!=NU))// υπάρχει επόμενο; { NodeType *T=P->ink // προσωρινός δείκτης (free) P->ink = T->ink;// Νέα τιμή του ο επόμενος if (T == ast) // διαγραφή τελευταίου κόμβου; ast = P; free(t); // ελευθέρωσε τον κόμβο } else ;// ένδειξη εντοπισμού λάθους

Διαγραφή τελευταίου κόμβου ΠΑΝΤΑ με προδείκτη, όχι με χρήση του ast, παρόλο που δείχνει ήδη στον τελευταίο κόμβο. first last Info;ink Info;ink Info;ink...... Το free(ast) αφήνει έναν αιωρούμενο δείκτη και λάθος τιμή για το ast. Μπορούμε να βρούμε τον προηγούμενο δείκτη P μόνο αν περάσουμε από P=first, μέχρι P->ink==ast. first last Info;ink Info;ink......?

Προτείνεται 1) Πριν τον προγραμματισμό συνδεδεμένων δομών, να σχεδιάζετε εικόνες των συνδεδεμένων δομών σας για κάθε περίπτωση. 2) Απεικονίστε στους κόμβους τις μεταβλητές και τις τιμές τους. Σχεδιάστε σε διαδοχικά βήματα τις αλλαγές που θέλετε να κάνετε (εισαγωγή, διαγραφή, κλπ) 3) Διατηρείτε πάντα κάποια σύνδεση. Ένα συνηθισμένο λάθος είναι να ελευθερώνεται η μνήμη πριν φτιαχτούν οι συνδέσεις. Η σειρά ενημέρωσης των συνδέσεων είναι σημαντική. 4) Ελευθερώνετε την μνήμη που δεν χρειάζεστε.