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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

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

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

Γραμμικές λίστες. Γκόγκος Χρήστος ΤΕΙ Ηπείρου

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

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

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

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

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων (Data Structures)

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

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

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

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

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

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

Προγραμματισμός. Linked Lists

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα

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

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

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

Transcript:

Διάλεξη 10: Λίστες Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εύρεση, εισαγωγή, διαγραφή) Σύγκριση Συνδεδεμένων Λιστών με Πίνακες Ευθύγραμμες Διπλά Συνδεδεμένες Λίστες (εισαγωγή, εύρεση) Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ 10-1

Λίστες Ο ΑΤΔ λίστα ορίζεται ως μια ακολουθία στοιχείων συνοδευόμενη από πράξεις που επιτρέπουν εισαγωγή και εξαγωγή στοιχείων σε οποιαδήποτε θέση της λίστας. (εν αντίθεση με τις στοίβες και ουρές όπου πράξεις γίνονται μόνο στα άκρα) Κάποιες βασικές πράξεις των λιστών είναι οι πιο κάτω: Concatenate(L 1, L 2 ) Access(L, i) Sublist (L,i, j) δημιούργησε μια νέα λίστα που περιέχει τα στοιχεία της λίστας L 1 ακολουθούμενα από τα στοιχεία της L 2 επέστρεψε το i-οστό στοιχείο της L επέστρεψε τη λίστα που ξεκινά από το i-οστό και τελειώνει στο j-οστό στοιχείο της L. Insert_After(L, x, i) εισήγαγε το x μετά από το i-οστό στοιχείο της L. Delete(L, i) αφαίρεσε το i-οστό στοιχείο της L Στη συνέχεια θα μελετήσουμε υλοποιήσεις του ΑΤΔ με δυναμική χορήγηση μνήμης. 10-2

Ευθύγραμμες Απλά Συνδεδεμένες Λίστες Μία λίστα μπορεί να υλοποιηθεί ως μια συνδεδεμένη λίστα (με παρόμοιο τρόπο όπως μια στοίβα). L Πιθανές δηλώσεις κόμβων είναι: typedef struct node { typedef struct { type data; NODE *head; struct node *next; NODE; LIST; int size; 10-3

Ευθύγραμμες Απλά Συνδεδεμένες Λίστες Πιο κάτω ορίζονται κάποιες χρήσιμες πράξεις. Εύρεση Κόμβου με συγκεκριμένο στοιχείο: int find(list *L, key val){ p = L->head; while (p!= NULL) { if (p->data == val) return 1; p = p->next; return 0; To p είναι ένα αντίγραφο της διεύθυνσης στην οποία δείχνει το L->head 10-4

Ευθύγραμμες Απλά Συνδεδεμένες Λίστες Με παρόμοιο τρόπο μπορούμε να ορίσουμε διαδικασία findpointer(list *L, key val) που επιστρέφει δείκτη προς κόμβο της λίστας που περιέχει το στοιχείο val, αν υπάρχει. NODE *findpointer(list *list, int value) { NODE *p = list->head; while (p!= NULL) { if (p->val == value) { return p; p = p->next; Πως θα το υλοποιήσετε αναδρομικά; return NULL; 10-5

Ευθύγραμμες Απλά Συνδεδεμένες Λίστες Εισαγωγή Κόμβου x μετά από συγκεκριμένο κόμβο y int insert(list *L, value x, value y) { NODE *r = findpointer(l,x); if r == NULL return 1; else { p = (NODE *)malloc(sizeof(node)); p->data = y; p->next = r->next; r->next = p; return 0; w r x p y z 10-6

Ευθύγραμμες Απλά Συνδεδεμένες Λίστες Εξαγωγή Κόμβου με συγκεκριμένη πληροφορία x int delete(list *L, key x){ NODE *p = NULL, *p2 = NULL; p = list->head; if (p == NULL) return 1; typedef struct { type val; struct node *next; NODE; typedef struct list { NODE *head; int size; LIST; if (p->val == value) {// the head is treated separately list->head = p->next; list->size--; free(p); return 0; else { while (p!= NULL) {// find x and delete it if (p->val == x) {// value found => delete p p2->next = p->next; free(p); p2 p list->size--; return 0; // x not found move to next w x z p2 = p; // use p2 as the previous position pointer p = p->next; return 1; 10-7

Πίνακες vs. Συνδεδεμένες Λίστες Όταν υλοποιούμε λίστες με πίνακες χρειάζεται να γνωρίζουμε το μέγιστο μέγεθος της λίστας εκ των προτέρων. Χρήση Χώρου Πίνακας: καταλαμβάνεται ο ίδιος χώρος άσχετα με τον αριθμό των στοιχείων που είναι αποθηκευμένα. Συνδεδεμένη Λίστα: μέγεθος της λίστας (χώρος ενός στοιχείου + χώρος ενός δείκτη) Χρόνος εισαγωγής / εξαγωγής στην αρχή Πίνακας: Ίσως χρειαστεί να μετακινήσουμε όλα τα στοιχεία Συνδεδεμένη Λίστα: Δεν μετακινείται τίποτε Χρόνος εύρεσης k-οστού στοιχείου Πίνακας: Κατευθείαν Συνδεδεμένη Λίστα: Χρειάζεται να περάσουμε από K άλλους κόμβους 10-8

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

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

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

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

Η συνάρτηση puttnode // Τοποθέτηση x μετά το y ξεκινώντας από τον δείκτη p void putnode(dlnode *p, int x, int y){ DLNODE *q; if (p == NULL) // reached end of list (and did not find y) printf( Element %d does not exist, no insertion was made\n, y); else if ( p->data == y ) { // position found do insertion q = (DLNODE *)malloc(sizeof(dlnode)); q->data = x; q->next = p->next; q->prev = p; (p->next)->prev = q; p->next= q; else // position not found search next putnode(p->next, x, y); 3 4 p 42 54 50 q 10-13