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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

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

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

Διαχρονικές δομές δεδομένων

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

Επιµέλεια Θοδωρής Πιερράτος

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

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

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

Κατακερµατισµός. Οργάνωση Αρχείων (σύνοψη) Οργάνωση αρχείων: πως είναι τοποθετημένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

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

Ενδεικτικές Ερωτήσεις Θεωρίας

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

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

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

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

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

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

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

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

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

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

Εξωτερική Αναζήτηση. Ιεραρχία Μνήμης Υπολογιστή. Εξωτερική Μνήμη. Εσωτερική Μνήμη. Κρυφή Μνήμη (Cache) Καταχωρητές (Registers) μεγαλύτερη ταχύτητα

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

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

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

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

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

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

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

Αναζήτηση. 1. Σειριακή αναζήτηση 2. Δυαδική Αναζήτηση. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

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

Αναζήτηση και ταξινόμηση

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 15: Διασυνδεμένες Δομές - Λίστες

Διασυνδεδεμένες δομές δεδομένων Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα. Η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση του είναι γνωστή εκ των προτέρων και μπορεί να υπολογιστεί από τον μεταφραστή. Μπορούμε να κατασκευάσουμε δομές τα στοιχεία των οποίων βρίσκονται σε διαφορετικές θέσεις στη μνήμη, και τα οποία συνδέονται μεταξύ τους μέσω δεικτών. Η θέση του «i-οστού» στοιχείου δεν είναι γνωστή και πρέπει να εντοπιστεί, διανύοντας την δομή κατά μήκος των συνδέσεων μεταξύ των κόμβων της. Σημείωση: ακριβώς για αυτό το λόγο, σε αυτές τις δομές δεν υφίσταται η έννοια «i-οστό» στοιχείο. 2

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

διεύθυνση πρώτου στοιχείου 4

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

Αναδρομικές / επαναλαμβανόμενες δομές Μια από τις κλασικές μορφές διασυνδεδεμένων δομών είναι οι «αναδρομικές» δομές. Μια δομή ονομάζεται αναδρομική όταν ένα από τα πεδία της είναι ένας δείκτης σε δομή ιδίου τύπου. Οι αναδρομικές δομές κατασκευάζονται μέσα από την επανάληψη του ίδιου δομικού στοιχείου (κόμβου). Οι διασυνδέσεις μεταξύ των κόμβων (δηλαδή η αρχικοποίηση των πεδίων δεικτών) γίνεται σύμφωνα με τους κανόνες που διέπουν την συγκεκριμένη δομή, και οι οποίοι διαφέρουν ανά περίπτωση. 6

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

struct list { /* δεδομένα */ struct list *nxt; ; nxt nxt 8 struct list2 { /* δεδομένα */ struct list2 *nxt; struct list2 *prv; ; nxt nxt prv prv struct btree { /* δεδομένα */ struct btree *left; struct btree *right; ; left right left right left right

Λίστες

Ενδεικτική υλοποίηση απλής λίστας Κάθε κόμβος περιέχει ένα δείκτη που αρχικοποιείται έτσι ώστε να δείχνει στον επόμενο κόμβο. Η αρχή της λίστας (δείκτης στο πρώτο κόμβο) αποθηκεύεται σε κατάλληλη (καθολική) μεταβλητή, στην οποία έχει πρόσβαση ο κώδικας των πράξεων. Εισαγωγή: ο νέος κόμβος εισάγεται ως πρώτος κόμβος της λίστας (δεν ελέγχουμε για διπλές τιμές). Αναζήτηση: αρχίζουμε από τον πρώτο κόμβο και διασχίζουμε την λίστα, κόμβο προς κόμβο, μέχρι να βρούμε τον κόμβο με την επιθυμητή τιμή. Απομάκρυνση: ο κόμβος εντοπίζεται με αναζήτηση και παρακάμπτεται, συνδέοντας τον «προηγούμενο» κόμβο με τον «επόμενο». 10

Αναζήτηση (επιτυχημένη) find C 11 A nxt C nxt B nxt

Αναζήτηση (αποτυχμένη) find D 12 A nxt C nxt B nxt

struct list { int v; struct list *nxt; ; 13 struct list *; void list_init() { = NULL; int list_haselement(int v) { struct list *curr; for(curr=; (curr!= NULL) && (curr->v!= v); curr=curr->nxt); return(curr!= NULL);

Εισαγωγή (σε κενή λίστα) 14 add C C nxt

Εισαγωγή (σε μη κενή λίστα) A nxt B nxt 15 add C A nxt B nxt C nxt

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

Απομάκρυνση (με προηγούμενο στοιχείο) 17 C nxt A nxt B nxt remove Α C nxt A nxt B nxt

Απομάκρυνση (χωρίς προηγούμενο στοιχείο) 18 C nxt A nxt B nxt remove C C nxt A nxt B nxt

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

Κυκλικά συνδεδεμένη λίστα με τερματικό Σε κάθε βήμα της αναζήτησης γίνονται δύο έλεγχοι, Κατά πόσο έχουμε φτάσει στο τέλος της λίστας και Κατά πόσο εντοπίσαμε τον επιθυμητό κόμβο. Αν η λίστα έχει Ν κόμβους, κατά μέσο όρο θα χρειαστούν Ν/2 βήματα και συνεπώς Ν έλεγχοι. Παρατήρηση: Ειδική περίπτωση της απομάκρυνσης του πρώτου κόμβου. Μπορούμε να απλοποιήσουμε τη λειτουργία της απομάκρυνσης; Μείωση Πολυπλοκότητας: υλοποιούμε τη λίστα ως κυκλική λίστα, και χρησιμοποιούμε έναν άδειο αρχικό κόμβο που δεν έχει «πραγματικά» δεδομένα και χρησιμεύει σαν τερματικός κόμβος (sentinel) στην αναζήτηση. 20

Αναζήτηση (επιτυχημένη) find B 21 B nxt A nxt B nxt B

Αναζήτηση (αποτυχημένη) find C 22 C nxt A nxt B nxt C

struct list { int v; struct list *nxt; ; 23 struct list *; void list_init() { = (struct list *)malloc(sizeof(struct list)); ->nxt = ; int list_haselement(int v) { struct list *curr; ->v = v; for(curr=->nxt; curr->v!=v; curr=curr->nxt); return(curr!= );

Εισαγωγή (σε κενή λίστα) - nxt 24 add C - nxt C nxt

Εισαγωγή (σε μη κενή λίστα) - nxt A nxt B nxt 25 add C - nxt A nxt B nxt C nxt

void list_insert(int v) { struct list *curr; 26 curr = (struct list *)malloc(sizeof(struct list)); curr->v = v; /* εισαγωγή νέου κόμβου στην αρχή της λίστας */ curr->nxt = ->nxt; ->nxt = curr;

Απομάκρυνση (με προηγούμενο στοιχείο) 27 B nxt A nxt B nxt remove B B nxt A nxt B nxt

Απομάκρυνση (χωρίς προηγούμενο στοιχείο) 28 C nxt C nxt A nxt remove C C nxt C nxt A nxt

void list_remove(int v) { struct list *curr,*prev; 29 ->v = v; for(prev=,curr=->nxt; curr->v!=v; prev=curr,curr=curr->nxt); if (curr!= ) { /* παράκαμψη κόμβου με προηγούμενο κόμβο */ prev->nxt = curr->nxt; free(curr);

Διπλά συνδεδεμένη κυκλική λίστα Στην απομάκρυνση, η λίστα διασχίζεται ανανεώνοντας σε κάθε βήμα δύο δείκτες, έναν στον κόμβο που ελέγχουμε και ένα στον αμέσως προηγούμενο κόμβο, έτσι ώστε αν εντοπιστεί ο επιθυμητός κόμβος να τον παρακάμψουμε. Αν η λίστα έχει Ν κόμβους, κατά μέσο όρο θα χρειαστούν Ν/2 βήματα και συνεπώς Ν αναθέσεις. Βελτιστοποίηση: υλοποιούμε τη λίστα ως διπλά συνδεδεμένη λίστα, όπου κάθε κόμβος δείχνει στον επόμενο αλλά και στον προηγούμενο του, οπότε η λίστα μπορεί να διανυθεί ανανεώνοντας ένα δείκτη. Μπορούμε πλέον να απομακρύνουμε έναν κόμβο αρκεί να έχουμε ένα δείκτη σε αυτόν. Δε χρειάζεται να «θυμόμαστε τον προηγούμενο 30

struct list2 { int v; struct list2 *nxt; struct list2 *prv; ; 31 struct list2 *; void list_init() { = (struct list2 *)malloc(sizeof(struct list2)); ->nxt = ; ->prv = ; int list_haselement(int v) { struct list2 *curr; ->v = v; for(curr=->nxt; curr->v!=v; curr=curr->nxt); return(curr!= );

Εισαγωγή - nxt A nxt B nxt 32 prv prv prv add C - nxt A nxt B nxt prv prv prv C nxt prv

void list_insert(int v) { struct list2 *curr; 33 curr = (struct list2 *)malloc(sizeof(struct list2)); curr->v = v; /* εισαγωγή νέου κόμβου στην αρχή της λίστας */ curr->nxt = ->nxt; curr->prv = ; curr->nxt->prv = curr; curr->prv->nxt = curr;

Απομάκρυνση A nxt A nxt B nxt 34 prv prv prv remove A A nxt A nxt B nxt prv prv prv

void list_remove(int v) { struct list2 *curr; 35 ->v = v; for(curr=->nxt; curr->v!=v; curr=curr->nxt); if (curr!= ) { /* παράκαμψη κόμβου με προηγούμενο κόμβο */ curr->nxt->prv = curr->prv; curr->prv->nxt = curr->nxt; free(curr);

Σύγκριση Απλά συνδεδεμένη λίστα ένα πεδίο δείκτης δύο συγκρίσεις ανά βήμα αναζήτησης και δύο αναθέσεις ανά βήμα αναζήτησης για απομάκρυνση Κυκλικά συνδεδεμένη λίστα με τερματικό ένα πεδίο δείκτης και ένας τερματικός κόμβος μια σύγκριση ανά βήμα αναζήτησης και δύο αναθέσεις ανά βήμα αναζήτησης για απομάκρυνση Διπλά συνδεδεμένη κυκλική λίστα με τερματικό δύο πεδία δείκτες και ένας τερματικός κόμβος μια σύγκριση ανά βήμα αναζήτησης και μια ανάθεση ανά βήμα αναζήτησης για απομάκρυνση 36

Ταξινομημένες λίστες Όταν αναζητείται ένας κόμβος με συγκεκριμένο περιεχόμενο πρέπει να ελεγχθούν όλοι οι κόμβοι της λίστας μέχρι αυτός να βρεθεί (ή να φτάσουμε στο τέλος της λίστας). Αν ο επιθυμητός κόμβος δεν υπάρχει στην λίστα, αναγκαστικά θα διασχισθεί ολόκληρη η λίστα. Η αναζήτηση μπορεί να βελτιωθεί αν οι κόμβοι της λίστας είναι ταξινομημένοι Σύμφωνα με κάποιο συνδυασμό των περιεχομένων τους Συνήθως ένα πεδίο κλειδί που χρησιμοποιείται για σύγκριση. Η υλοποίηση της εισαγωγής αλλάζει Έτσι ώστε ο νέος κόμβος να τοποθετείται μετά από όλους τους κόμβους με «μικρότερες» τιμές και πριν από όλους τους κόμβους με «μεγαλύτερες» τιμές. 37

struct list { int v; struct list *nxt; ; 38 struct list *; void sortedlist_init() { = (struct list *)malloc(sizeof(struct list)); ->nxt = ; int sortedlist_haselement(int v) { struct list *curr; ->v = v; for(curr=->nxt; curr->v<v; curr=curr->nxt); return((curr!=)) && (curr->v==v));

void sortedlist_insert(int v) { struct list *curr,*prev; ->v = v; for(prev=,curr=->nxt; curr->v<v; prev=curr,curr=curr->nxt); 39 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; ->v = v; for(prev=,curr=->nxt; curr->v<v; prev=curr,curr=curr->nxt); if ((curr!= ) && (curr->v == v)) { prev->nxt = curr->nxt; free(curr);

Ταξινομημένη και μη ταξινομημένη λίστα Η διαφορά της αναζήτησης ανάμεσα σε ταξινομημένη και μη ταξινομημένη λίστα είναι στην περίπτωση που ο επιθυμητός κόμβος δεν βρίσκεται στην λίστα. Σε αυτή τη περίπτωση η αναζήτηση σε ταξινομημένη λίστα απαιτεί κατά μέσο όρο Ν/2 βήματα, ενώ σε μη ταξινομημένη λίστα απαιτεί εγγυημένα Ν βήματα. Αν ο επιθυμητός κόμβος υπάρχει στην λίστα, τότε και οι δύο μέθοδοι απαιτούν κατά μέσο όρο Ν/2 βήματα. Τι πληρώνω; Αναζήτηση για κάθε εισαγωγή Αν η λίστα δεν επιτρέπεται να έχει διπλούς κόμβους (με τα ίδια περιεχόμενα ή πεδίο κλειδί με ίδια τιμή), τότε η εισαγωγή υποχρεωτικά συμπεριλαμβάνει και αναζήτηση, οπότε η χρήση ταξινομημένης λίστας γίνεται ακόμα πιο ελκυστική. 40

Γρήγορη αναζήτηση σε ταξινομημένη λίστα; Αντίθετα με ένα ταξινομημένο πίνακα, δεν μπορεί να γίνει δυαδική αναζήτηση σε μια ταξινομημένη λίστα. Δεν υπάρχει απ ευθείας πρόσβαση στον i-οστό κόμβο Το κόστος για να φτάσουμε στον i-οστό κόμβο είναι ήδη αυτό μιας γραμμικής αναζήτησης. Παρατήρηση: μια δομή που μπορεί να χρησιμοποιηθεί για δυαδική αναζήτηση καθώς και την ευέλικτη διαχείριση μνήμης με μικρό κόστος «μετακίνησης» δεδομένων, είναι ένας δυναμικός πίνακας από δείκτες. Υπάρχει μια άλλη διασυνδεδεμένη δομή μέσω της οποίας μπορεί να επιτευχθεί γρήγορη αναζήτηση 41