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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δηάιεμε 10: Λίζηεο Υινπνίεζε & Εθαξκνγέο

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. 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); } }

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

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

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

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

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

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

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

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

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

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

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

Σημειώσεις όγδοης εβδομάδας

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

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

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής

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

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

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

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

Αναδρομικοί Αλγόριθμοι

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

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

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

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

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

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

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

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

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

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

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

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

IsEmptyList(L): επιστρέφει true αν L = < >, false

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

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

Αρχές Προγραμματισμού

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 1 ΛΥΣΕΙΣ Ανάλυση Πολυπλοκότητας

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

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

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

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

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

POINTERS, AGGREGATION, COMPOSITION

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

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

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

Transcript:

Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl232 15-1

Περιεχόμενο Διάλεξης 15 Διπλά Συνδεδεμένες Λίστες Ορισμοί και Δηλώσεις Υλοποίηση Συνάρτησης put(l, x, y) αναδρομικά και επαναληπτικά Ταξινομημένες Διπλά Συνδεδεμένες Λίστες Υλοποίηση Συνάρτησης printlist(l) Υλοποίηση Συνάρτησης insert(l, x) Υλοποίηση Συνάρτησης delete(l, x) 15-2

Διπλά Συνδεδεμένες Λίστες Διπλά Συνδεδεμένη Λίστα (doubly-linked list) ονομάζεται μια λίστα κάθε κόμβος της οποίας κρατά πληροφορίες και για τον επόμενο και για τον προηγούμενο κόμβο: prev next Με αυτό τον τρόπο δίνεται η ευχέρεια μετακίνησης μέσα στη λίστα και προς τις δύο κατευθύνσεις. Παράδειγμα Λίστας: size head 3 4 42 54 15-3

Διπλά Συνδεδεμένες Λίστες Ποιες δομές χρειάζονται για υλοποίηση μιας διπλά συνδεδεμένης λίστας; Ένας κόμβος ορίζεται από το πιο κάτω structure: typedef struct dnode { int data; struct dnode *prev; struct dnode *next; DNODE; O κόμβος που ορίζει τη διπλά συνδεδεμένη λίστα είναι ο ίδιος με αυτό που ορίζει μια στοίβα ή λίστα: typedef struct { DNODE *head; int size; DLLIST; 15-4

Διπλά Συνδεδεμένες Λίστες Προφανώς η εισαγωγή στοιχείου σε κάποιο σημείο μιας διπλά συνδεδεμένης λίστας περιέχει κάποια επιπλέον πολυπλοκότητα από την εισαγωγή σε μια μονά-συνδεδεμένη λίστα. Αυτό γιατί κάθε νέος κόμβος πρέπει να συνδεθεί και με τον επόμενο και με τον προηγούμενο κόμβο στη λίστα. Παρόμοια, κατά τις εξαγωγές στοιχείων. Παράδειγμα εισαγωγής του στοιχείου 50 μετά το 42 στη λίστα της διαφάνειας 17: 3 4 42 54 50 15-5

Η συνάρτηση put Να ορίσετε συνάρτηση put(l, x, y) η οποία τοποθετεί το στοιχείο x μετά από το στοιχείο y μέσα στη λίστα l, αν το στοιχείο y υπάρχει στην λίστα. void put(dllist *l, int x, int y){ if (l == NULL l->head == NULL) printf("the list is empty, no insertion was made\n"); else { putnode(l->head, x, y, &(l->size)); Insert(l, 50, 42) 15-6

Η συνάρτηση puttnode (Αναδρομική) static int putnode(dlnode *p, int x, int y, int *size){ DLNODE *q = NULL; if (p == NULL) { printf("element %d does not exist, y); return EXIT_FAILURE; else if ( p->data == y ) { q = (DLNODE *)malloc(sizeof(dlnode)); if (q == NULL) { printf("error: Malloc"); return EXIT_FAILURE; q->data = x; q->next = p->next; p q->prev = p; if (p->next!= NULL) (p->next)->prev = q; p->next = q; (*size)++ return EXIT_SUCCESS; else return putnode(p->next, x, y, size); q 15-7

Ταξινομημένες Διπλά Συνδεδεμένες Λίστες Άσκηση: Να ορίσετε τις αναδρομικές διαδικασίες: void printlist(dllist *l), η οποία τυπώνει όλα τα στοιχεία της λίστας l. void insert(dllist *l, int x), η οποία εισάγει το στοιχείο x μέσα στη λίστα l, void delete(dllist *l, int x), η οποία αφαιρεί το στοιχείο x από τη λίστα l (αν αυτό υπάρχει) και Όλες οι πιο πάνω συναρτήσεις πρέπει να διατηρούν ταξινομημένες τις διπλά συνδεδεμένες λίστες. 15-9

H Συνάρτηση printlist void printlist(dllist *l){ if (l == NULL l->size == 0) printf("the list is empty\n"); else printnode(l->head); void printnode(dlnode *p){ if (p!= NULL){ printf("%d", p->data); printnode(p->next); head 15-10

Παραδείγματα Εισαγωγή του 50 στη λίστα: 3 4 42 54 Εξαγωγή του 42 από τη λίστα: 50 3 4 42 54 Θα δούμε κάποιους διαφορετικούς τρόπους υλοποίησης. Επιλέξτε τον τρόπο που σας βολεύει καλύτερα. 15-11

H Συνάρτηση insert void insert(dllist *l, int x) { if (l == NULL) { printf("list is empty\n"); return; l->head = insertnode(l->head, x, NULL, &(l->size)); p last p last q 15-12

H Συνάρτηση insert DLNODE *insertnode(dlnode *p, int x, DLNODE *last, int *size) { DLNODE *q = NULL; if (p == NULL){// Φτάσαμε στο τέλος της λίστας q = (DLNODE *) malloc(sizeof(dlnode)); q->data = x; q->next = NULL; q->prev = last; (*size)++; else if (p->data >= x) { // Περάσαμε το σημείο εισαγωγής q = (DLNODE *) malloc (sizeof(dlnode)); q->data = x; q->next = p; q->prev = p->prev; if ((p->prev)!= NULL) (p->prev)->next = q; p->prev = q; (*size)++; else { q = p; // για ομοιόμορφο return στο τέλος q->next = insertnode(q->next, x, q, size); last q return q; // για όλους τους κόμβους (εκτός του κόμβου εισαγωγής) αυτό είναι το p ουσιαστικά p 15-13

H Συνάρτηση delete void delete(dllist *l, int x){ l->head = deletenode(l->head, x, &(l->size)); p 15-14

H Συνάρτηση delete DLNODE *deletenode(dlnode *p, int x, int *size){ DLNODE *q = NULL; if ( (p == NULL) (p->data > x) ){ printf("item %d not found \n", x); else if ( p->data == x ){ q = p->next; if (q!= NULL) q->prev = p->prev; if ((p->prev)!= NULL) (p->prev)->next = q; free(p); printf("item %d has been deleted\n", x); (*size)--; p = q; // θα γίνει return το p. else { p->next = deletenode(p->next, x, size); return p; // απαιτείται για επιβεβαίωση του backlink σε διαγραφές p q 15-15