Δομές Δεδομένων. Ενότητα 8: Διπλά συνδεδεμένες λίστες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

Δομές Δεδομένων. Ενότητα 3: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 5: Στοίβες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 4: Πίνακες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 6: Ουρές. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 7: Μονές συνδεδεμένες λίστες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Εισαγωγή στην Διοίκηση Επιχειρήσεων

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

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

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

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

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

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

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

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

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοικητική Λογιστική

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 2: Αιωρούμενα σωματίδια & Απόδοση συλλογής Αν. Καθ. Δρ Μαρία Α. Γούλα Τμήμα Μηχανικών

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Οργάνωση και Διοίκηση Πωλήσεων

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

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 5: Κληρονομικότητα. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Οργάνωση και Διοίκηση Πωλήσεων Ενότητα 1: Ο ΡΟΛΟΣ ΤΩΝ ΠΩΛΗΣΕΩΝ ΣΤΟ ΠΛΑΙΣΙΟ ΤΗΣ ΣΤΡΑΤΗΓΙΚΗΣ ΜΑΡΚΕΤΙΝΓΚ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 7: Υπερφόρτωση τελεστών. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Συστήματα Αναμονής. Ενότητα 3: Στοχαστικές Ανελίξεις. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Μηχανολογικό Σχέδιο Ι

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 1: Εκτιμητές και Ιδιότητες. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Τεχνολογία Πολυμέσων. Ενότητα 8: Pool Table. Νικολάου Σπύρος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

Διδακτική της Πληροφορικής

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Συστήματα Αναμονής. Ενότητα 5: Ανέλιξη Poisson. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

Λογιστική Κόστους. Ενότητα 4: ΣΥΜΠΕΡΙΦΟΡΑ - ΦΥΣΗ ΚΟΣΤΟΥΣ. Μαυρίδης Δημήτριος Τμήμα Λογιστικής και Χρηματοοικονομικής

Βάσεις Περιβαλλοντικών Δεδομένων

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

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

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

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

Βάσεις Δεδομένων. Ενότητα 5: ΚΑΝΟΝΙΚΟΠΟΙΗΣΗ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Αντικειμενοστραφής Προγραμματισμός

Τεχνολογία Πολιτισμικού Λογισμικού

ΑΝΑΛΥΣΗ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΚΑΤΑΣΤΑΣΕΩΝ

Σχεδίαση Δικτύων Υπολογιστών

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Αντικειμενοστραφής Προγραμματισμός

Οικονομετρία Ι. Ενότητα 10: Διαγνωστικοί Έλεγχοι. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Συστήματα Αναμονής. Ενότητα 7: Ουρά Μ/Μ/1. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Οικονομετρία Ι. Ενότητα 3: Θεώρημα των Gauss Markov. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Διοίκηση Επιχειρήσεων

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

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών

Συστήματα Αναμονής. Ενότητα 9: Ανέλιξη Γέννησης - Θανάτου. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 3: Πολλαπλή Παλινδρόμηση. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 6: Ηλεκτροστατικά Φίλτρα

Πληροφορική ΙΙ Θεματική Ενότητα 5

Συστήματα Αναμονής. Ενότητα 4: Αλυσίδες Markov. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Αντικειμενοστραφής Προγραμματισμός

Transcript:

Δομές Δεδομένων Ενότητα 8: Διπλά συνδεδεμένες λίστες Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Σκοποί ενότητας Σε αυτή την ενότητα παρουσιάζονται οι διπλά συνδεδεμένες λίστες. 4

Περιεχόμενα ενότητας Εισαγωγή. Απλοϊκή (ή καλλιτεχνική) απεικόνιση διπλάσυνδεδεμένης λίστας. Πραγματική απεικόνιση διπλά-συνδεδεμένης λίστας. Τυπικές λειτουργίες. Παράδειγμα. Ενδεικτική υλοποίηση. Ασκήσεις. Βιβλιογραφία. 5

Εισαγωγή (1/3) Οι διπλά-συνδεδεμένες λίστες είναι μια εκδοχή των συνδεδεμένων λιστών όπου κάθε κόμβος τώρα έχει δύο δείκτες έναν προς τον επόμενο κόμβο και έναν προς τον προηγούμενο. Αυτό αυξάνει τον απαιτούμενο αποθηκευτικό χώρο καθενός κόμβου, αλλά επιτρέπει τη διάσχιση της λίστας και προς τις δύο κατευθύνσεις. Υπάρχουν διάφορες εκδοχές της διπλάσυνδεδεμένης λίστας. 6

Εισαγωγή (2/3) Στην απλή της εκδοχή υπάρχει δείκτης (κεφαλής/αρχής) που δείχνει στον πρώτο κόμβο. Ο πρώτος κόμβος δεν έχει προηγούμενο (έτσι ο αντίστοιχος δείκτης του Prev = NULL), ενώ ούτε ο τελευταίος κόμβος έχει επόμενο δείκτη (κατά συνέπεια για τον τελευταίο κόμβο ισχύει Next = NULL). Η λίστα μπορεί να είναι κυκλική, όπου ο δείκτης Next του τελευταίου κόμβου δείχνει στον πρώτο κόμβο, και ο δείκτης Prev του πρώτου κόμβου δείχνει στον τελευταίο κόμβο. 7

Εισαγωγή (3/3) Εξακολουθεί να υπάρχει δείκτης κεφαλής που μας επιτρέπει την πρόσβαση στη λίστα. Στην περίπτωση της γραμμικής λίστας υπάρχει το ενδεχόμενο να υπάρχει και δείκτης ουράς (Tail) που να δείχνει στον τελευταίο κόμβο. Στο επόμενο σχήμα φαίνεται μια απλοϊκή απεικόνιση μιας διπλά-συνδεδεμένης λίστας. 8

Απλοϊκή (ή καλλιτεχνική) απεικόνιση διπλά-συνδεδεμένης λίστας Εικόνα 1. Απλοϊκή (ή καλλιτεχνική) απεικόνιση διπλά-συνδεδεμένης λίστας. Πηγή: Διδάσκων (2015). 9

Πραγματική απεικόνιση διπλάσυνδεδεμένης λίστας (1/2) Στην πραγματικότητα η ορθή απεικόνιση μιας διπλά-συνδεδεμένης λίστας απαιτεί τον κάθε δείκτη να δείχνει στην αρχή του σωστού κόμβου, ενώ ο κάθε κόμβος περιέχει τα δεδομένα και τους δύο δείκτες, ακριβώς με τη σειρά που μόλις αναφέρθηκε. Αυτό φαίνεται στο επόμενο σχήμα, από το οποίο αντιλαμβανόμαστε την απλότητα της παραπάνω «απλοϊκής» απεικόνισης. 10

Πραγματική απεικόνιση διπλάσυνδεδεμένης λίστας (2/2) Εικόνα 2. Πραγματική απεικόνιση διπλά-συνδεδεμένης λίστας. Πηγή: Διδάσκων (2015). 11

Τυπικές λειτουργίες Οι τυπικές λειτουργίες που επιτελούνται πάνω στις διπλά-συνδεδεμένες λίστες δε διαφέρουν από αυτές των μονών συνδεδεμένων λιστών. Εδώ θα χρειαστεί να επισημανθεί η ανάγκη επανάληψης του υλικού που καλύφθηκε στις μονές συνδεδεμένες λίστες, ώστε να επικεντρωθούμε αμέσως σε μια ενδεικτική υλοποίηση των διπλάσυνδεδεμένων λιστών, παρακάμπτοντας τα κοινά στοιχεία τους. 12

Παράδειγμα (1/4) Η υλοποίηση που ακολουθεί βασίζεται σε αυτήν των μονών συνδεδεμένων λιστών, αλλά έχει σκόπιμα αφαιρεθεί η υλοποίηση αρκετών συναρτήσεων, προς εξάσκηση του αναγνώστη. Κατά πλήρη αντιστοιχία με τη μονή συνδεδεμένη λίστα, η δήλωση των τύπων παρουσιάζεται παρακάτω. 13

Παράδειγμα (2/4) typedef int TItem; typedef struct TDLListTAG { TItem Item; TDLListTAG *Prev; TDLListTAG *Next; } TDLList; 14

Παράδειγμα (3/4) Η πρώτη δήλωση αφορά το γενικό τύπο των στοιχείων που θα αποθηκεύουμε σε κάθε μία θέση της λίστας, που στην περίπτωσή μας θα είναι ένας ακέραιος. Η δήλωση αυτού του ενδιάμεσου τύπου μάς βοηθάει στην ελάττωση των αλλαγών στον κώδικα, όποτε αυτό καταστεί αναγκαίο. 15

Παράδειγμα (4/4) Η δεύτερη δήλωση είναι αυτή του κόμβου της λίστας. Ο τύπος του κόμβου της λίστας (TDLList) αποτελείται από τα εξής τρία κατά σειρά πεδία: 1. Τα δεδομένα που θα αποθηκεύσουμε σε κάθε έναν κόμβο. 2. Το δείκτη προς τον προηγούμενο κόμβο. 3. Το δείκτη προς τον επόμενο κόμβο. 16

Ενδεικτική υλοποίηση (1/27) Ακολουθεί μια ενδεικτική υλοποίηση διπλάσυνδεδεμένης λίστας. Συγκεκριμένες συναρτήσεις της υλοποίησης έχουν σκόπιμα αφαιρεθεί. 17

Ενδεικτική υλοποίηση (2/27) /* -------------------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> /* -------------------------------------------------------------------------- */ typedef int TItem; typedef struct TDLListTAG { TItem TDLListTAG *Prev; TDLListTAG *Next; } TDLList; Item; 18

Ενδεικτική υλοποίηση (3/27) // Function declarations. void DLList_Init(TDLList **Head); bool DLList_IsEmpty(TDLList *Head); bool DLList_Insert(TDLList **Head, TItem Item); //bool DLList_InsertUnique(TDLList **Head, TItem Item); bool DLList_RemoveFirst(TDLList **Head, TItem Item); //size_t DLList_RemoveAll(TDLList **Head, TItem Item); //size_t DLList_RemoveDuplicates(TDLList **Head); //bool DLList_Merge(TDLList *List1, TDLList *List2, TDLList **NewList); //bool DLList_MergeUnique(TDLList *List1, TDLList *List2, TDLList **NewList) //bool DLList_Copy(TDLList **Dest, TDLList *Src) 19

Ενδεικτική υλοποίηση (4/27) bool bool TDLList* size_t size_t void void DLList_Ascending(TDLList *Head); DLList_Descending(TDLList *Head); DLList_FindFirst(TDLList *Head, TItem Item); DLList_Count(TDLList *Head); DLList_CountItem(TDLList *Head, TItem Item); DLList_Deallocate(TDLList **Head); DLList_Write(TDLList *Head); 20

Ενδεικτική υλοποίηση (5/27) /* -------------------------------------------------------------------------- */ void DLList_Init(TDLList **Head) { *Head = NULL; } // DLList_Init bool DLList_IsEmpty(TDLList *Head) { return ( Head == NULL ); } // DLList_IsEmpty 21

Ενδεικτική υλοποίηση (6/27) bool DLList_Insert(TDLList **Head, TItem Item) { TDLList *NewItem, *Curr, *Prev; // Allocate space for new node. NewItem = (TDLList *) malloc(sizeof(tdllist)); if ( NewItem == NULL ) return ( false ); NewItem->Item = Item; // Initialise traversal. Prev = NULL; Curr = *Head; 22

Ενδεικτική υλοποίηση (7/27) // Advance to the proper sorted position. What if <=? while ( ( Curr!= NULL ) && ( Curr->Item < Item ) ) { Prev = Curr; Curr = Curr->Next; } // if 23

Ενδεικτική υλοποίηση (8/27) // Insert at the beginning of the list. if ( Prev == NULL ) // Don't do Curr->Prev == NULL. { NewItem->Prev = NULL; // There is no previous node. NewItem->Next = *Head; // Or NewItem->Next = Curr; *Head = NewItem; if ( Curr!= NULL ) Curr->Prev = NewItem; // Check if only item on the list. } 24

Ενδεικτική υλοποίηση (9/27) else // Insert between nodes or at the end of the list. { NewItem->Prev = Prev; // Or NewItem->Prev = Curr->Prev; NewItem->Next = Curr; Prev->Next = NewItem; if ( Curr!= NULL ) Curr->Prev = NewItem;// Check if add at the end of list. } // if return ( true ); } // DLList_Insert 25

Ενδεικτική υλοποίηση (10/27) bool DLList_RemoveFirst(TDLList **Head, TItem Item) { // Initialise traversal. TDLList *Curr = *Head, *Prev = NULL; // Advance to the proper sorted position. while ( ( Curr!= NULL ) && ( Curr->Item < Item ) ) { Prev = Curr; Curr = Curr->Next; } // while 26

Ενδεικτική υλοποίηση (11/27) // If Item is present, delete it. if ( ( Curr!= NULL ) && ( Item == Curr->Item ) ) { // Remove from the beginning of the list. if ( Prev == NULL ) { *Head = Curr->Next; if ( *Head!= NULL ) (*Head)->Prev = NULL; } else { // or from further down. Prev->Next = Curr->Next; if ( Curr->Next!= NULL ) Curr->Next->Prev = Prev;// Or Curr->Prev; } // if } free(curr); return ( true ); 27

Ενδεικτική υλοποίηση (12/27) else { return ( false ); } // if } // DLList_RemoveFirst 28

Ενδεικτική υλοποίηση (13/27) bool DLList_Ascending(TDLList *Head) { Titem Item; TDLList *Tmp = Head; bool Sorted = true; if ( Tmp == NULL ) return ( true ); Item = Tmp->Item; Tmp = Tmp->Next; 29

Ενδεικτική υλοποίηση (14/27) while ( ( Tmp!= NULL ) && Sorted ) { Sorted = ( Tmp->Item >= Item ); Item = Tmp->Item; Tmp = Tmp->Next; } // while return ( Sorted ); } // DLList_Ascending 30

Ενδεικτική υλοποίηση (15/27) bool DLList_Descending(TDLList *Head) { TItem Item; TDLList *Tmp = Head; bool Sorted = true; if ( Tmp == NULL ) return ( true ); Item = Tmp->Item; Tmp = Tmp->Next; 31

Ενδεικτική υλοποίηση (16/27) while ( ( Tmp!= NULL ) && Sorted ) { Sorted = ( Tmp->Item <= Item ); Item = Tmp->Item; Tmp = Tmp->Next; } // while return ( Sorted ); } // DLList_Descending 32

Ενδεικτική υλοποίηση (17/27) TDLList* DLList_FindFirst(TDLList *Head, TItem Item) { TDLList *Tmp = Head; while ( Tmp!= NULL ) { if ( Tmp->Item == Item ) return ( Tmp ); Tmp = Tmp->Next; } // while return ( Tmp ); // Or: return ( NULL ); } // DLList_FindFirst 33

Ενδεικτική υλοποίηση (18/27) size_t DLList_Count(TDLList *Head) { TDLList *Tmp = Head; size_t Counter = 0; while ( Tmp!= NULL ) { Counter++; Tmp = Tmp->Next; } // while return ( Counter ); } // DLList_Count 34

Ενδεικτική υλοποίηση (19/27) size_t DLList_CountItem(TDLList *Head, TItem Item) { TDLList *Tmp = Head; size_t Counter = 0; while ( Tmp!= NULL ) { if ( Tmp->Item == Item ) Counter++; Tmp = Tmp->Next; } // while return ( Counter ); } // DLList_CountItem 35

Ενδεικτική υλοποίηση (20/27) void DLList_Deallocate(TDLList **Head) { TDLList *Tmp = *Head; while ( *Head!= NULL ) { *Head = (*Head)->Next; free(tmp); Tmp = *Head; } // while } // DLList_Deallocate 36

Ενδεικτική υλοποίηση (21/27) void DLList_Write(TDLList *Head) { TDLList *Tmp = Head; printf("\ndoubly-linked List\n"); printf("--------------------\n"); printf(" Head Node = 0x%08X\n", Head); printf("item Count = %3u\n", DLList_Count(Head)); printf("list Items = "); while ( Tmp!= NULL ) { printf("%3d ", Tmp->Item); Tmp = Tmp->Next; } // while printf("\n"); } // DLList_Write 37

Ενδεικτική υλοποίηση (22/27) /* -------------------------------------------------------------------------- */ void main() { TDLList *List; DLList_Init(&List); DLList_Write(List); 38

Ενδεικτική υλοποίηση (23/27) DLList_Insert(&List, 10); DLList_Insert(&List, 20); DLList_Insert(&List, 30); DLList_Insert(&List, 40); DLList_Write(List); DLList_RemoveFirst(&List, 30); DLList_Write(List); 39

Ενδεικτική υλοποίηση (24/27) DLList_Insert(&List, 30); DLList_Insert(&List, 35); DLList_Write(List); DLList_RemoveFirst(&List, 10); DLList_Write(List); DLList_RemoveFirst(&List, 40); DLList_Write(List); DLList_Deallocate(&List); DLList_Write(List); } // main /* -------------------------------------------------------------------------- */ 40

Ενδεικτική υλοποίηση (25/27) Οι συναρτήσεις που έχουν παρουσιαστεί είναι παρόμοιες με αυτές των μονών συνδεδεμένων λιστών, οπότε μπορούμε να αποφύγουμε την επανάληψη των επιμέρους εξηγήσεων. Ωστόσο, είναι σκόπιμο να αναφέρουμε ότι οι συναρτήσεις που εισάγουν και διαγράφουν κόμβους είναι τροποποιημένες ώστε να ενημερώνονται και οι δείκτες Prev, μαζί με τους Next. 41

Ενδεικτική υλοποίηση (26/27) Οι τεχνικές αναζήτησης της επιθυμητής τοποθεσίας εισαγωγής κόμβων ή αναζήτησης κόμβων προς διαγραφή είναι παρόμοιες. Πάρ' όλα αυτά, τώρα υπάρχει αυξημένη ελευθερία επιλογής τεχνικών, αφού πια μπορούμε να σαρώσουμε τη λίστα και προς τις δύο κατευθύνσεις. 42

Ενδεικτική υλοποίηση (27/27) Όμως, αυτό που πρέπει να έχουμε υπόψη είναι ότι οι απαιτήσεις σε μνήμη είναι αυξημένες, και σύμφωνα με αυτά που ισχύουν στον παρόντα χρόνο, σε ένα 32-bit σύστημα μόνο το 1/3 του χώρου αποθηκεύει δεδομένα, ενώ τα υπόλοιπα 2/3 τους δείκτες σύνδεσης. Στην περίπτωση μιας υλοποίησης των 64-bit με ακέραιους των 32-bit μόνο το 1/5 (20%) είναι δεδομένα και τα υπόλοιπα 4/5 (80%) είναι δείκτες. 43

Ασκήσεις (1/9) Άσκηση 1. Χρησιμοποιώντας ως βάση τον κώδικα που σας έχει δοθεί, υλοποιήστε τη συνάρτηση που εισάγει ένα στοιχείο σε μια λίστα, όταν αυτό δεν υπάρχει (δηλαδή ένα στοιχείο επιτρέπεται να εμφανίζεται μόνο μία φορά). 44

Ασκήσεις (2/9) Άσκηση 2. Χρησιμοποιώντας ως βάση τον κώδικα που σας έχει δοθεί, υλοποιήστε τη συνάρτηση που αφαιρεί ένα στοιχείο από μια λίστα, όσες φορές αυτό εμφανίζεται. Η αφαίρεση των στοιχείων να γίνεται με μία μόνο διάσχιση της λίστας. Μη διασχίζετε περισσότερα στοιχεία από αυτά που είναι εντελώς απαραίτητα για να εκτελέσετε τη συγκεκριμένη λειτουργία. 45

Ασκήσεις (3/9) Άσκηση 3. Χρησιμοποιώντας ως βάση τον κώδικα που σας έχει δοθεί, υλοποιήστε τη συνάρτηση που αφαιρεί τις διπλότυπες τιμές μιας λίστας. Η αφαίρεση των διπλότυπων να γίνεται με μία μόνο διάσχιση της λίστας. 46

Ασκήσεις (4/9) Άσκηση 4. Χρησιμοποιώντας ως βάση τον κώδικα που σας έχει δοθεί, υλοποιήστε τη συνάρτηση που συγχωνεύει δύο λίστες σε μία, επιτρέποντας διπλότυπα. Η συγχώνευση να γίνει με τον απολύτως ελάχιστο αριθμό διασχίσεων των λιστών που εμπλέκονται. 47

Ασκήσεις (5/9) Άσκηση 5. Υλοποιήστε μία ακόμη συνάρτηση συγχώνευσης που φροντίζει ώστε να μην εμφανιστούν διπλότυπα στην τελική λίστα. Η συγχώνευση να γίνει με τον απολύτως ελάχιστο αριθμό διασχίσεων των λιστών που εμπλέκονται. 48

Ασκήσεις (6/9) Άσκηση 6. Υλοποιήστε μια συνάρτηση που αντιγράφει μία δεδομένη λίστα σε μία άλλη. Φροντίστε ώστε στο τέλος μιας επιτυχούς αντιγραφής οι δύο λίστες να έχουν ακριβώς τα ίδια στοιχεία με την ίδια σειρά (δηλαδή, εξαιρουμένων των δεικτών να είναι πανομοιότυπες). Βεβαιωθείτε για τη σωστή διαχείριση της μνήμης, είτε πρόκειται για δέσμευση είτε για αποδέσμευση. 49

Ασκήσεις (7/9) Άσκηση 7. Δηλώστε και υλοποιήστε συνάρτηση που αντιστρέφει μία δεδομένη λίστα. Μπορείτε να υλοποιήσετε τη συνάρτηση αποφεύγοντας να δημιουργήσετε καινούργιους κόμβους, χρησιμοποιώντας μόνο αυτούς που έχετε (ώστε να μην υπάρχει περίπτωση αποτυχίας λόγω μη δέσμευσης επιπλέον μνήμης); 50

Ασκήσεις (8/9) Άσκηση 8. Η υλοποίηση των δύο συναρτήσεων που ελέγχουν αν μια λίστα είναι διατεταγμένη σε αύξουσα ή φθίνουσα (DLList_Ascending(TDLList *Head) και DLList_Descending(TDLList *Head)) σειρά δεν είναι βέλτιστα υλοποιημένες, αφού δηλώνουν τοπική μεταβλητή του τύπου των δεδομένων που αποθηκεύονται σε κάθε κόμβο. Αυτό δυνητικά είναι δαπανηρό, τόσο χωρικά όσο και χρονικά, αφού μπορεί να μην είναι απλός ακέραιος, αλλά κάτι πολύ πιο σύνθετο και μεγαλύτερο. 51

Ασκήσεις (9/9) Άσκηση 8 (Συνέχεια). Προχωρήστε στην κατάλληλη μεταβολή των υλοποιήσεων για την εξάλειψη του προαναφερθέντος προβλήματος. Βοήθεια: Μην αποθηκεύετε ένα προσωρινό στοιχείο, αλλά τη διεύθυνσή του. 52

Βιβλιογραφία (1/8) Aho AV, Hopcroft JE, and Ullman JD. (1974) The design and analysis of computer algorithms. USA, Addison-Wesley Publishing Company. 470 pp. ISBN 0-201-00029-6. ( 38.33, 46.76). Aho AV, Hopcroft JE, and Ullman JD. (1983) Data structures and algorithms. USA, Addison-Wesley Publishing Company. 427 pp. ISBN 0-201-00023-7. ( 43.65, 53.25). Bik AJC. (2004) The software vectorization handbook: applying multimedia extensions for maximum performance. USA, Intel Press. 236 pp. ISBN 0-9743649-2-4. ( 32.31, 46.63). 53

Βιβλιογραφία (2/8) Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. Cormen TH, Leiserson CE, Rivest RL, and Stein C. (2012) Εισαγωγή στους αλγορίθμους. USA/Ελλάδα, MIT Press/Ίδρυμα Τεχνολογίας & Έρευνας - Πανεπιστημιακές Εκδόσεις Κρήτης. 1260 pp. ISBN 978-960-524-224-4. Dasgupta S, Papadimitriou C and Vazirani U. (2009) Αλγόριθμοι. Ελλάδα, Εκδόσεις Κλειδάριθμος. 416 σελ. ISBN13 978-960-461-211-6. 54

Βιβλιογραφία (3/8) Gerber R, Bik AJC, Smith KB and Tian X. (2006) The software optimization cookbook: high-performance recipes for IA-32 platforms. 2nd ed. USA, Intel Press. 404 pp. ISBN 0-9764832-1-1. ( 35.07, 50.61). Helman P and Veroff R. (1988) Walls and mirrors: intermediate problem solving and data structures. Modula 2 ed. USA, The Benjamin/Cummings Publishing Company, Inc. 625 pp. ( 23.95). Kleinberg J and Tardos W. (2008) Σχεδιασμός αλγορίθμων. Ελλάδα, Εκδόσεις Κλειδάριθμος. 944 σελ. ISBN13 978-960- 461-207-9. 55

Βιβλιογραφία (4/8) Knuth DE. (2009) Η τέχνη του προγραμματισμού: θεμελιώδεις αλγόριθμοι, Τόμος Α. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 759 σελ. ISBN13 978-960-418-185-8. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ημιαριθμητικοί αλγόριθμοι, Τόμος Β. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 912 σελ. ISBN13 978-960-418-224-4. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ταξινόμηση και αναζήτηση, Τόμος Γ. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 926 σελ. ISBN13 978-960-418-245-9. 56

Βιβλιογραφία (5/8) Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). Lafore R. (2005) Δομές δεδομένων και αλγόριθμοι στη Java. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 798 σελ. ISBN10 960-512- 452-1. Levitin A. (2008) Εισαγωγή στην ανάλυση και σχεδίαση αλγορίθμων. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 700 σελ. ISBN13 978-960-418-143-8. 57

Βιβλιογραφία (6/8) McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). Mehlhorn K and Sanders P. (2008) Algorithms and data structures: the basic toolbox. Germany, Springer-Verlag Berlin Heidelberg. 300 pp. ISBN13 978-3-540-77977-3. ( 28.11, 34.29). Prichard JJ and Carrano FM. (2011) Data abstraction and problem solving with Java: walls and mirrors. 3rd ed. UK, Pearson Education Limited. 959 pp. ISBN10 0-273-75120-4. ISBN13 978-0-273-75120-5. 58

Βιβλιογραφία (7/8) Sahni S. (2004) Δομές Δεδομένων, Αλγόριθμοι, και Εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 830 σελ. ISBN10 960-418-030-4. Sedgewick R and Flajolet P. (2013) An introduction to the analysis of algorithms. 2nd ed. USA, Pearson Education, Inc. 572 pp. ISBN13 978-0-321-90575-8. Sedgewick R and Wayne K. (2011) Algorithms. 4th ed. USA, Pearson Education, Inc. 952 pp. ISBN13 978-0-321-57351-3. Κοίλιας Χ. (2004) Δομές δεδομένων & οργανώσεις αρχείων. Ελλάδα, Εκδόσεις Νέων Τεχνολογιών. 447 σελ. ISBN10 960-8105-64-1. 59

Βιβλιογραφία (8/8) Μποζάνης ΠΔ. (2006) Δομές Δεδομένων. Ελλάδα, Εκδόσεις Τζιόλα. 552 σελ. ISBN10 960-418-084-3. Μποζάνης ΠΔ. (2009) Προβλήματα & ασκήσεις στους αλγορίθμους. Ελλάδα, Εκδόσεις Τζιόλα. 492 σελ. ISBN13 978-960-418-186-5. Μποζάνης ΠΔ. (2013) Αλγόριθμοι. Ελλάδα, Εκδόσεις Τζιόλα. 549 σελ. ISBN13 978-960-418-070-1. Μυσιρλής Ν. (2002) Δομές δεδομένων με C. Ελλάδα, αυτοέκδοση. 347 σελ. ISBN10 960-92031-1-6. Παπαρίζος Κ. (2010) Ανάλυση και σχεδίαση αλγορίθμων. Ελλάδα, Εκδόσεις Τζιόλα. 606 σελ. ISBN13 978-960-418-222-0. 60

Τέλος Ενότητας

Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Δρ. Γεώργιος Σίσιας. «Δομές Δεδομένων». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: URL. 62

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 63

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 64