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

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2016 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

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

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

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

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

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

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

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

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

Εισαγωγή στους Αλγορίθμους

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

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

Αλγόριθμοι και Δομές Δεδομένων (Ι) (εισαγωγικές έννοιες)

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

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

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

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

ΗΥ240: Δοµές Δεδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

Τι είναι αλγόριθμος; Υποπρογράμματα (υποαλγόριθμοι) Βασικές αλγοριθμικές δομές

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

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

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

Εισαγωγή στην επιστήμη των υπολογιστών. Οργάνωση εδομένων Κεφάλαιο 11ο ομές εδομένων

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

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

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

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

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

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

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

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

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

ΗΥ360 Αρχεία και Βάσεις εδοµένων

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

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

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

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

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

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

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

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

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

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

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

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

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

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

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

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

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

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

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Προγραμματιστική Εργασία - 2o Μέρος

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

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

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

Προγραμματιστικές Τεχνικές

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

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

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

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

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

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

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

Transcript:

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

Διασυνδεδεμένες δομές Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση του είναι γνωστή εκ των προτέρων και μπορεί να υπολογιστεί από τον μεταφραστή Μπορούμε να κατασκευάσουμε δομές τα στοιχεία των οποίων βρίσκονται σε διαφορετικές θέσεις στη μνήμη, και τα οποία συνδέονται μεταξύ τους μέσω δεικτών Η θέση του «i-οστού» στοιχείου δεν είναι γνωστή, και πρέπει να εντοπιστεί, διανύοντας την δομή κατά μήκος των συνδέσεων μεταξύ των κόμβων της ουσιαστικά δεν υφίσταται «i-οστό» στοιχείο αυτή η ορολογία ισχύει (απόλυτα) μόνο για πίνακες Προγραμματισμός II 2 lalis@inf.uth.gr

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T array[n]; &array[0] είναι array &array[i] είναι array + i*sizeof(t) Προγραμματισμός II 3 lalis@inf.uth.gr

δείκτης στο πρώτο στοιχείο Προγραμματισμός II 4 lalis@inf.uth.gr

Κατασκευή διασυνδεδεμένων δομών Οι διασυνδεδεμένες δομές κατασκευάζονται σταδιακά, κόμβο προς κόμβο όχι μονομιάς, όπως π.χ. οι πίνακες Κάθε νέος κόμβος πρέπει να συνδεθεί με τους ήδη υπάρχοντες κόμβους, με κατάλληλο τρόπο έτσι ώστε να είναι δυνατή η προσπέλαση όλων των κόμβων Για κάθε κόμβο που απομακρύνεται, πρέπει να προσαρμοστούν οι διασυνδέσεις των υπολοίπων Κάθε δομή έχει ένα συγκεκριμένο (ίσως διαφορετικό) τρόπο προσπέλασης, σύμφωνα με τον οποίο ορίζονται οι δείκτες διασύνδεσης των κόμβων υλοποιούνται οι βασικές λειτουργίες αναζήτησης, προσθήκης, απομάκρυνσης Προγραμματισμός II 5 lalis@inf.uth.gr

Αναδρομικές/επαναλαμβανόμενες δομές Μια από τις κλασικές μορφές διασυνδεδεμένων δομών είναι οι λεγόμενες αναδρομικές δομές όταν ένα από τα πεδία της είναι δείκτης σε δομή ιδίου τύπου Οι αναδρομικές δομές κατασκευάζονται με επανάληψη του ίδιου δομικού στοιχείου (κόμβου) Οι διασυνδέσεις μεταξύ των κόμβων (η αρχικοποίηση των δεικτών από κόμβο σε κόμβο) γίνεται σύμφωνα με τους κανόνες που διέπουν την δομή διαφέρουν ανάλογα με την περίπτωση Προγραμματισμός II 6 lalis@inf.uth.gr

Αναζήτηση/διέλευση Η διεύθυνση ενός συγκεκριμένου κόμβου της δομής δεν μπορεί να υπολογιστεί με βάση την αρχή της δομής (την διεύθυνση του πρώτου κόμβου της) οι κόμβοι βρίσκονται σε μη συνεχόμενες θέσεις της μνήμης Ο μόνος τρόπος να εντοπιστεί ένας συγκεκριμένος κόμβος (ή να διαπιστωθεί ότι δεν υπάρχει) είναι να διανυθεί η δομή, κόμβο προς κόμβο, μέχρι να ανακαλύψουμε τον επιθυμητό κόμβο (αν υπάρχει) Η μετάβαση από το «προηγούμενο» κόμβο στον «επόμενο» γίνεται σύμφωνα με τους κανόνες διασύνδεσης της εκάστοτε δομής Προγραμματισμός II 7 lalis@inf.uth.gr

struct list { /* data */ struct list *nxt; }; nxt nxt struct list2 { /* data */ struct list2 *nxt; struct list2 *prv; }; nxt nxt prv prv struct btree { /* data */ struct btree *left; struct btree *right; }; left right left right left right Προγραμματισμός II 8 lalis@inf.uth.gr

Απλά συνδεδεμένη λίστα Προγραμματισμός II 9 lalis@inf.uth.gr

Ενδεικτική υλοποίηση Κάθε κόμβος περιέχει ένα δείκτη που αρχικοποιείται έτσι ώστε να δείχνει στον επόμενο κόμβο Η αρχή της λίστας (δείκτης στο πρώτο κόμβο) αποθηκεύεται σε μια (καθολική) μεταβλητή Εισαγωγή: ο νέος κόμβος εισάγεται ως πρώτος κόμβος της λίστας (δεν ελέγχουμε για διπλές τιμές) Αναζήτηση: αρχίζουμε από τον πρώτο κόμβο και διασχίζουμε την λίστα, κόμβο προς κόμβο, μέχρι να βρούμε τον κόμβο με την επιθυμητή τιμή Απομάκρυνση: ο κόμβος εντοπίζεται με αναζήτηση και παρακάμπτεται, συνδέοντας τον προηγούμενο κόμβο με τον επόμενο Προγραμματισμός II 10 lalis@inf.uth.gr

Αναζήτηση (επιτυχημένη) find C root A nxt C nxt B nxt Προγραμματισμός II 11 lalis@inf.uth.gr

Αναζήτηση (αποτυχημένη) find D root A nxt C nxt B nxt Προγραμματισμός II 12 lalis@inf.uth.gr

struct list { int v; struct list *nxt; }; struct list *root; void list_init() { root = NULL; } int list_haselement(int v) { struct list *curr; } for(curr=root; (curr!= NULL) && (curr->v!= v); curr=curr->nxt); return(curr!= NULL); Προγραμματισμός II 13 lalis@inf.uth.gr

Εισαγωγή (σε κενή λίστα) root add C root C nxt Προγραμματισμός II 14 lalis@inf.uth.gr

Εισαγωγή (σε μη κενή λίστα) root A nxt B nxt add C root A nxt B nxt C nxt Προγραμματισμός II 15 lalis@inf.uth.gr

void list_insert(int v) { struct list *curr; } curr = (struct list *)malloc(sizeof(struct list)); curr->v = v; /* εισαγωγή νέου κόμβου στην αρχή της λίστας */ curr->nxt = root; root = curr; Προγραμματισμός II 16 lalis@inf.uth.gr

Απομάκρυνση (με προηγούμενο κόμβο) root C nxt A nxt B nxt remove Α root C nxt A nxt B nxt Προγραμματισμός II 17 lalis@inf.uth.gr

Απομάκρυνση (χωρίς προηγούμενο κόμβο) root C nxt A nxt B nxt remove C root C nxt A nxt B nxt Προγραμματισμός II 18 lalis@inf.uth.gr

void list_remove(int v) { struct list *curr,*prev; for(prev=null,curr=root; (curr!= NULL) && (curr->v!= v); prev=curr,curr=curr->nxt); if (curr!= NULL) { if (prev == NULL) { /* παράκαμψη πρώτου κόμβου της λίστας */ root = curr->nxt; } else { /* παράκαμψη κόμβου με προηγούμενο κόμβο */ prev->nxt = curr->nxt; } } } free(curr); Προγραμματισμός II 19 lalis@inf.uth.gr

Κυκλικά συνδεδεμένη λίστα με ειδικό τερματικό κόμβο Προγραμματισμός II 20 lalis@inf.uth.gr

Χρήση τερματικού κόμβου Στην απλή λίστα, σε κάθε βήμα της αναζήτησης γίνονται δύο έλεγχοι αν έχουμε φτάσει στο τέλος της λίστας αν βρισκόμαστε στον επιθυμητό κόμβο Αν ο κόμβος υπάρχει, κατά μ.ο. χρειάζονται Ν/2 βήματα (Ν έλεγχοι), αλλιώς Ν βήματα (2Ν έλεγχοι) Επίσης, χρειάζεται ειδικός χειρισμός για την περίπτωση της απομάκρυνσης του πρώτου κόμβου Βελτιστοποίηση: υλοποιούμε τη λίστα ως κυκλική λίστα, και χρησιμοποιούμε έναν άδειο αρχικό κόμβο (που δεν έχει «πραγματικό» περιεχόμενο δεδομένα) ως τερματικό κόμβο / sentinel στην αναζήτηση Προγραμματισμός II 21 lalis@inf.uth.gr

Αναζήτηση (πετυχημένη) sentinel node find B root B nxt A nxt B nxt B Προγραμματισμός II 22 lalis@inf.uth.gr

Αναζήτηση (αποτυχημένη) sentinel node find C root C nxt A nxt B nxt C Προγραμματισμός II 23 lalis@inf.uth.gr

struct list { int v; struct list *nxt; }; struct list *root; void list_init() { root = (struct list *)malloc(sizeof(struct list)); root->nxt = root; } int list_haselement(int v) { struct list *curr; } root->v = v; for(curr=root->nxt; curr->v!=v; curr=curr->nxt); return(curr!= root); Προγραμματισμός II 24 lalis@inf.uth.gr

Εισαγωγή (σε κενή λίστα) root - nxt add C root - nxt C nxt Προγραμματισμός II 25 lalis@inf.uth.gr

Εισαγωγή (σε μη κενή λίστα) root - nxt A nxt B nxt add C root - nxt A nxt B nxt C nxt Προγραμματισμός II 26 lalis@inf.uth.gr

void list_insert(int v) { struct list *curr; } curr = (struct list *)malloc(sizeof(struct list)); curr->v = v; /* εισαγωγή νέου κόμβου στην αρχή της λίστας */ curr->nxt = root->nxt; root->nxt = curr; Προγραμματισμός II 27 lalis@inf.uth.gr

Απομάκρυνση (με προηγούμενο κόμβο) root B nxt A nxt B nxt remove B root B nxt A nxt B nxt Προγραμματισμός II 28 lalis@inf.uth.gr

Απομάκρυνση (χωρίς προηγούμενο κόμβο) root C nxt C nxt A nxt remove C root C nxt C nxt A nxt Προγραμματισμός II 29 lalis@inf.uth.gr

void list_remove(int v) { struct list *curr,*prev; root->v = v; for(prev=root,curr=root->nxt; curr->v!=v; prev=curr,curr=curr->nxt); } if (curr!= root) { /* παράκαμψη κόμβου */ prev->nxt = curr->nxt; free(curr); } Προγραμματισμός II 30 lalis@inf.uth.gr

Διπλά συνδεδεμένη λίστα Προγραμματισμός II 31 lalis@inf.uth.gr

Απλοποίηση απομάκρυνσης Στην απομάκρυνση, η λίστα διασχίζεται με δύο δείκτες, έναν στον κόμβο που ελέγχουμε και έναν στον προηγούμενο κόμβο, έτσι ώστε αν εντοπιστεί ο επιθυμητός κόμβος να τον παρακάμψουμε Αν η λίστα έχει Ν κόμβους, κατά μέσο όρο θα χρειαστούν Ν/2 βήματα και συνεπώς Ν αναθέσεις Βελτιστοποίηση: υλοποιούμε τη λίστα ως διπλά συνδεδεμένη λίστα, όπου κάθε κόμβος δείχνει στον επόμενο αλλά και στον προηγούμενο του Μπορούμε πλέον να απομακρύνουμε έναν κόμβο αρκεί να έχουμε ένα δείκτη σε αυτόν δε χρειάζεται ένας δείκτης στον προηγούμενο κόμβο Προγραμματισμός II 32 lalis@inf.uth.gr

struct list2 { int v; struct list2 *nxt; struct list2 *prv; }; struct list2 *root; void list_init() { root = (struct list2 *)malloc(sizeof(struct list2)); root->nxt = root; root->prv = root; } int list_haselement(int v) { struct list2 *curr; } root->v = v; for(curr=root->nxt; curr->v!=v; curr=curr->nxt); return(curr!= root); Προγραμματισμός II 33 lalis@inf.uth.gr

Εισαγωγή root - nxt A nxt B nxt prv prv prv add C root - nxt A nxt B nxt prv prv prv C nxt prv Προγραμματισμός II 34 lalis@inf.uth.gr

void list_insert(int v) { struct list2 *curr; } curr = (struct list2 *)malloc(sizeof(struct list2)); curr->v = v; /* εισαγωγή νέου κόμβου στην αρχή της λίστας */ curr->nxt = root->nxt; curr->prv = root; curr->nxt->prv = curr; curr->prv->nxt = curr; Προγραμματισμός II 35 lalis@inf.uth.gr

Απομάκρυνση root A nxt A nxt B nxt prv prv prv remove A root A nxt A nxt B nxt prv prv prv Προγραμματισμός II 36 lalis@inf.uth.gr

void list_remove(int v) { struct list2 *curr; } root->v = v; for(curr=root->nxt; curr->v!=v; curr=curr->nxt); if (curr!= root) { /* παράκαμψη κόμβου */ curr->nxt->prv = curr->prv; curr->prv->nxt = curr->nxt; free(curr); } Προγραμματισμός II 37 lalis@inf.uth.gr

Σύγκριση Απλά συνδεδεμένη λίστα ένα πεδίο δείκτης δύο συγκρίσεις ανά βήμα αναζήτησης δύο αναθέσεις ανά βήμα αναζήτησης για απομάκρυνση Κυκλικά συνδεδεμένη λίστα με τερματικό ένα πεδίο δείκτης και ένας τερματικός κόμβος μια σύγκριση ανά βήμα αναζήτησης δύο αναθέσεις ανά βήμα αναζήτησης για απομάκρυνση Διπλά συνδεδεμένη κυκλική λίστα με τερματικό δύο πεδία δείκτες και ένας τερματικός κόμβος μια σύγκριση ανά βήμα αναζήτησης μια ανάθεση ανά βήμα αναζήτησης για απομάκρυνση Προγραμματισμός II 38 lalis@inf.uth.gr

Ταξινομημένη λίστα Προγραμματισμός II 39 lalis@inf.uth.gr

Επιτάχυνση της αναζήτησης Όταν αναζητείται ένας κόμβος με συγκεκριμένο περιεχόμενο, πρέπει να ελεγχθούν όλοι οι κόμβοι μέχρι να βρεθεί ο ζητούμενος ή μέχρι να φτάσουμε στο τέλος της λίστας αν ο επιθυμητός κόμβος δεν υπάρχει στην λίστα, αναγκαστικά θα διασχισθεί ολόκληρη η λίστα Βελτίωση: ταξινόμηση των κόμβων της λίστας σύμφωνα με κάποιο συνδυασμό των περιεχομένων τους ή ένα πεδίο-κλειδί που χρησιμοποιείται για την σύγκριση Η εισαγωγή αλλάζει, έτσι ώστε ο νέος κόμβος να τοποθετείται μετά από όλους τους κόμβους με «μικρότερες» τιμές, και πριν από όλους τους κόμβους με «μεγαλύτερες» τιμές Προγραμματισμός II 40 lalis@inf.uth.gr

struct list { int v; struct list *nxt; }; struct list *root; void sortedlist_init() { root = (struct list *)malloc(sizeof(struct list)); root->nxt = root; } int sortedlist_haselement(int v) { struct list *curr; } root->v = v; for(curr=root->nxt; curr->v<v; curr=curr->nxt); return((curr!=root)) && (curr->v==v)); Προγραμματισμός II 41 lalis@inf.uth.gr

void sortedlist_insert(int v) { struct list *curr,*prev; root->v = v; for(prev=root,curr=root->nxt; curr->v < v; prev=curr,curr=curr->nxt); } curr = (struct list *)malloc(sizeof(struct list)); curr->v = v; curr->nxt = prev->nxt; prev->nxt = curr; void sortedlist_remove(int v) { struct list *curr,*prev; } root->v = v; for(prev=root,curr=root->nxt; curr->v < v; prev=curr,curr=curr->nxt); if ((curr!= root) && (curr->v == v)) { prev->nxt = curr->nxt; free(curr); } Προγραμματισμός II 42 lalis@inf.uth.gr

Ταξινομημένη vs. μη-ταξινομημένη λίστα Η μεγάλη διαφορά στην αναζήτηση υπάρχει όταν ο επιθυμητός κόμβος δεν βρίσκεται στην λίστα Με ταξινομημένη λίστα χρειάζονται κατά μέσο όρο Ν/2 βήματα, ενώ με μη-ταξινομημένη λίστα χρειάζονται πάντα Ν βήματα Αν ο κόμβος υπάρχει, και οι δύο μέθοδοι απαιτούν κατά μέσο όρο Ν/2 βήματα σκεφτείτε γιατί! Υπάρχει όμως κόστος: στην ταξινομημένη λίστα, πρέπει να γίνει αναζήτηση κατά την εισαγωγή Αν όμως δεν επιτρέπονται «διπλοί» κόμβοι, τότε η εισαγωγή υποχρεωτικά συμπεριλαμβάνει αναζήτηση (και στην μη-ταξινομημένη λίστα), οπότε η χρήση ταξινομημένης λίστας γίνεται ακόμα πιο ελκυστική Προγραμματισμός II 43 lalis@inf.uth.gr

Λίστα vs. δυναμικός πίνακας Αν ο πίνακας περιέχει τα στοιχεία με τα δεδομένα, οι λειτουργίες προσθήκης/αφαίρεσης μπορεί να είναι (πολύ) πιο αργές από ότι σε μια λίστα, λόγω αντιγραφής / μετακίνησης των στοιχείων Αν ο πίνακας περιέχει δείκτες στα στοιχεία με τα δεδομένα, η απόδοση είναι παρόμοια με την λίστα Σε πίνακα με ταξινομημένα στοιχεία, η αναζήτηση μπορεί να υλοποιηθεί πιο αποδοτικά με δυαδική αναζήτηση (binary search) γιατί δεν μπορεί να γίνει σε λίστα; Σε δυναμικό πίνακα μπορεί μπορεί να γίνεται «σιωπηρή» αντιγραφή δεδομένων κάθε φορά που αλλάζει το μέγεθος του (βλέπε realloc) Προγραμματισμός II 44 lalis@inf.uth.gr