Δομές Δεδομένων και Αρχεία Ενότητα 10: Κυκλικά και Διπλά Συνδεδεμένη Λίστα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Advertisements

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
Ποιότητα Λογισμικού Ενότητα 3: Σουίτες Ελέγχων. Διδάσκων: Γεώργιος Κακαρόντζας, Καθηγητής Εφαρμογών. Τμήμα Μηχανικών Πληροφορικής, Τεχνολογικής Εκπαίδευσης.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 11: Βελτιστοποίηση Ενδιάμεσου Κώδικα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα.
Διδακτική Πληροφορικής
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 4: Συμβολοσειρές και Δομές Ελέγχου. Διδάσκων: Νικόλαος Θ Λιόλιος,
Δομές Δεδομένων και Αρχεία Ενότητα 7: Η δομή Στοίβα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Δομές Δεδομένων και Αρχεία
Διδακτική Πληροφορικής Ενότητα 2: Η εξέλιξη των εργαλείων της Εκπαίδευσης. Διδάσκων: Γεώργιος Σούλτης, Επίκουρος Καθηγητής. Τμήμα Μηχανικών Πληροφορικής,
Διδακτική Πληροφορικής Ενότητα 3: Η Πληροφορική στην Εκπαίδευση. Διδάσκων: Γεώργιος Σούλτης, Επίκουρος Καθηγητής. Τμήμα Μηχανικών Πληροφορικής, Τεχνολογικής.
Δομές Δεδομένων και Αρχεία Ενότητα 4: Ευρετηριασμένα Αρχεία Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 6: Πίνακες και Παράμετροι στην main. Διδάσκων: Νικόλαος Θ Λιόλιος,
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 2: Μεταβλητές και Τύποι Δεδομένων. Διδάσκων: Νικόλαος Θ Λιόλιος,
Προγραμματισμός ΗΥ Ενότητα 6: Δισδιάστατοι πίνακες.
Δομές Δεδομένων και Αρχεία
Δομές Δεδομένων και Αρχεία Ενότητα 8: Η δομή Ουρά Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Δομές Δεδομένων και Αρχεία Ενότητα 3: Αρχεία Δομών ΙΙ Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Αντικειμενοστραφής Προγραμματισμός Ι
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 10: Αφηρημένες τάξεις. Διδάσκων: Νικόλαος Θ Λιόλιος, Καθηγητής.
Χρονικός Προγραμματισμός Έργων (Εργαστήριο) Ενότητα 5: Αναθέσεις σε πόρους Κλεάνθης Συρακούλης, Επίκουρος Καθηγητής, Τμήμα Διοίκησης Επιχειρήσεων, T.E.I.
Ανθρωπολογία του Θεάτρου Ενότητα 4 η : Βασικές αρχές της Τέχνης του Ηθοποιού Γιώργος Σαμπατακάκης, M.Phil. (Καίμπρητζ) – Ph.D. (Λονδίνο) Τμήμα Θεατρικών.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Εκπαιδευτικά Προγράμματα με Χρήση Η/Υ ΙΙ Θέμα «παιγνίδια» (website address) Διδάσκουσα: Καθηγήτρια Τζένη.
ΗΛΕΚΤΡΟΝΙΚΟ ΕΜΠΟΡΙΟ Ενότητα 12 : Η χρήση της MySQL στο Ηλεκτρονικό εμπόριο (ΙΙI) Ιωάννης Τσούλος Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου.
Προγραμματισμός κινητών συσκευών
Ενότητα 7 : Χρήση Πινάκων στο Ηλεκτρονικό εμπόριο (I) Ιωάννης Τσούλος
Τεχνολογία και Προγραμματισμός Υπολογιστών
Αντικειμενοστραφής Προγραμματισμός Ι
Προγραμματισμός κινητών συσκευών
Προγραμματισμός κινητών συσκευών
Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου
Ενότητα 5 : Δομές Δεδομένων και αφηρημένοι
Χρονικός Προγραμματισμός Έργων (Εργαστήριο)
ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα # 10: Εισαγωγή στο Ms Powerpoint Τμήμα Ιστορίας
Προγραμματισμός ΗΥ Ενότητα 11: Header Files. Διδάσκων: Ηλίας Κ Σάββας,
Τεχνολογία και Προγραμματισμός Υπολογιστών
Χρονικός Προγραμματισμός Έργων (Εργαστήριο)
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(9)
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
ΦΡΟΝΤΙΣΤΗΡΙΟ: ΘΕΡΜΙΚΕΣ ΤΑΣΕΙΣ
ΕνΟτητα # 9: Ms Word VI CLAUDIA BOETTCHER ΤμΗμα ΙστορΙαΣ
ΜΗΧΑΝΙΚΗ ΤΩΝ ΥΛΙΚΩΝ ΦΡΟΝΤΙΣΤΗΡΙΟ ΛΕΠΤΟΤΟΙΧΑ
Διαχείριση Κινδύνου Ενότητα 7: Παρακολούθηση Κινδύνων.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Επιχειρησιακές Επικοινωνίες
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Στατιστική Επιχειρήσεων
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(3)
Συστήματα Αυτομάτου Ελέγχου II
Ενότητα 4 : Τελεστές της γλώσσας PHP Ιωάννης Τσούλος
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Προγραμματισμός κινητών συσκευών
Προγραμματισμός κινητών συσκευών
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Αντικειμενοστραφής Προγραμματισμός ΙΙ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(7)
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(4)
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΕνΟτητα # 8: Ms Word V CLAUDIA BOETTCHER ΤμΗμα ΙστορΙαΣ
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(5)
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(10)
ΑΝΑΓΝΩΡΙΣΗ ΠΡΟΤΥΠΩΝ ΝΕΥΡΩΝΙΚΑ ΔΙΚΤΥΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Προγραμματισμός κινητών συσκευών
Προγραμματισμός κινητών συσκευών
Προγραμματισμός ΗΥ Ενότητα 12: Αρχεία Δομών. Διδάσκων: Ηλίας Κ Σάββας,
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Μεταγράφημα παρουσίασης:

Δομές Δεδομένων και Αρχεία Ενότητα 10: Κυκλικά και Διπλά Συνδεδεμένη Λίστα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας

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

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

Σκοποί ενότητας Ο Αναγνώστης να μπορεί να:  Διαχειρίζεται πλήρως την δομή της κυκλικά και διπλά συνδεδεμένης λίστας, δηλαδή δημιουργία, εισαγωγή και εξαγωγή στοιχείων. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 4

Περιεχόμενα ενότητας  Ξεπερνώντας τις αδυναμίες της Απλά Συνδεδεμένης Λίστας: Ξεπερνώντας τις αδυναμίες της Απλά Συνδεδεμένης Λίστας:  Κυκλικά Συνδεδεμένη Λίστα, Κυκλικά Συνδεδεμένη Λίστα,  Διπλά Συνδεδεμένη Λίστα. Διπλά Συνδεδεμένη Λίστα. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 5

Απλά Συνδεδεμένη Λίστα (Linked List)  Γραμμική δομή δεδομένων αποτελούμενη από κόμβους όπου ο κάθε κόμβος περιέχει δεδομένα και έναν δείκτη ο οποίος ‘δείχνει’ τον επόμενο κόμβο.  Ο τελευταίος κόμβος δεν ‘δείχνει’ πουθενά (NULL). Κυκλικά και Διπλά Συνδεδεμένη Λίστα 6

Αδυναμίες Απλά Συνδεδεμένης Λίστας  Εάν ο δείκτης της λίστας δείχνει σε κάποιον κόμβο δεν υπάρχει τρόπος να οδηγηθούμε προς τα πίσω στην λίστα.  Δηλαδή είναι αδύνατη η προσπέλαση προηγούμενων κόμβων.  Λύση: Μία απλή παραλλαγή της Α.Σ. Λίστας, η Κυκλικά Συνδεδεμένη Λίστα – ΚΣΔ (Circular Linked List). Κυκλικά και Διπλά Συνδεδεμένη Λίστα 7

Κυκλικά Συνδεδεμένη Λίστα  Κυκλικά συνδεδεμένη ονομάζεται η απλά συνδεδεμένη λίστα στην οποία ο τελευταίος κόμβος (και η ουρά) της αντί να δείχνει στο ‘κενό’ δείχνει την κεφαλή της λίστας. Σχήμα από Wikipedia Κυκλικά και Διπλά Συνδεδεμένη Λίστα 8

Λειτουργίες Κυκλικά Συνδεδεμένης Λίστας  Εισαγωγή Κόμβου:  Αρχή Λίστας,  Τέλος Λίστας,  Ενδιάμεσα Λίστας,  Διαγραφή Κόμβου,  Διαπέραση Λίστας – Προβολή Λίστας,  Αναζήτηση / Διόρθωση στοιχείων Κόμβου,  Διαγραφή Λίστας. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 9

Τυπική Δομή Λίστας /* Λίστα προϊόντων. Ο κάθε κόμβος περιέχει την απαραίτητη πληροφορία για ένα προϊόν. */ typedef struct Proion { int code; char perigrafi[20]; float timi; struct Proion *epomeno; /* Δείκτης */ }; Κυκλικά και Διπλά Συνδεδεμένη Λίστα 10

Διαχείριση Λίστας  Με χρήση μίας μεταβλητής (δείκτης) η οποία δείχνει το πρώτο κόμβο – ΚΕΦΑΛΗ,  Εναλλακτικά και χρήση δεύτερης μεταβλητής (δείκτη) που να δείχνει τον τελευταίο κόμβο – ΟΥΡΑ,  ΠΡΟΣΟΧΗ: κατά την διαπέραση της λίστας πρέπει να προσέξουμε γιατί ο τελευταίος κόμβος μας οδηγεί πάλι στον πρώτο.  Αρχικοποίηση (κενή λίστα):  kefali = NULL; oura = NULL; Κυκλικά και Διπλά Συνδεδεμένη Λίστα 11

Λίστα: Εισαγωγή Νέου Κόμβου Α Εισαγωγή νέου κόμβου στην αρχή της λίστας ΓΒ Κεφαλή Ουρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 12

(1) Δημιουργία Νέου Κόμβου malloc( ---- ); Α Δ NULL ΓΒ Κεφαλή Ουρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 13

(2) Τοποθέτηση Δείκτη Ο δείκτης του νέου κόμβου δείχνει ότι και ο δείκτης της κεφαλής της λίστας. Α Δ ΓΒ Κεφαλή Ουρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 14

(3) Επανατοποθέτηση Δείκτη Ο δείκτης του τελευταίου κόμβου δείχνει τον νέο «προς εισαγωγή» κόμβο και ο οποίος γίνεται και κεφαλή. Α Δ ΓΒ Κεφαλή Ουρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 15

(4) Τελική Μορφή ΔΓΒΑ ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 16

Εισαγωγή Νέου Κόμβου - Αλγόριθμος  Εάν η λίστα είναι κενή τότε ο νέος κόμβος εισάγεται στην λίστα (είναι κεφαλή και ουρά της λίστας), αλλιώς:  Εάν πρέπει να μπει στην αρχή της λίστας τότε αποτελεί την κορυφή, και ο τελευταίος κόμβος δείχνει τον νέο.  Εάν πρέπει να μπει στο τέλος τότε ο νέος κόμβος γίνεται ουρά της λίστας και δείχνει ότι έδειχνε η τέως ουρά, και η τέως ουρά πρέπει να δείχνει τον νέο κόμβο.  Εάν πρέπει να μπει μετά από κόμβο Χ τότε ό κόμβος που θα εισαχθεί πρέπει να δείχνει ότι έδειχνε ο κόμβος Χ και ο κόμβος Χ να δείχνει στον νέο κόμβο. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 17

Εισαγωγή (αρχή) - Υλοποίηση void eisagogi_arxi(Proion *p) { Proion *neo; neo = (Proion *) malloc(sizeof(Proion)); *neo = *p; if ( kefali == NULL) { kefali = neo; oura = neo; } else { neo->epomeno = kefali; kefali = neo; } oura->epomeno = kefali; /* Κυκλική λίστα */ } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 18

Εισαγωγή (τέλος) - Υλοποίηση void eisagogi_telos(Proion *p) { Proion *neo; neo = (Proion *) malloc(sizeof(Proion)); *neo = *p; neo->epomeno = NULL; if (kefali == NULL) { kefali = neo; oura = neo; } else { oura->epomeno = neo; oura = neo; } oura->epomeno = kefali; /* Κυκλική λίστα */ } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 19

Εισαγωγή (μετά) – Υλοποίηση (1 από 3) void eisagogi_meta(Proion *p, int k) { Proion *neo, *x, *temp; x = kefali; temp = kefali; if (kefali == NULL) { printf("\n Η λίστα είναι κενή! "); return; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 20

Εισαγωγή (μετά) – Υλοποίηση (2 από 3) if (x->code == k) { /* Εισαγωγή μετά την κεφαλή */ neo = (Proion *) malloc(sizeof(Proion)); *neo = *p; neo->epomeno = x->epomeno; x->epomeno = neo; if ( x == oura) oura = neo; return; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 21

Εισαγωγή (μετά) – Υλοποίηση (3 από 3) x = x->epomeno; while (x != temp) { if (x->code == k) { neo = (Proion *) μalloc(sizeof(Proion)); *neo = *p; neo->epomeno = x->epomeno; x->epomeno = neo; if ( x == oura) oura = neo; return; } x = x->epomeno; } printf("\n\nΔεν Υπάρχει προιόν με κωδικό %d\n\n", k); } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 22

Λίστα: Διαγραφή Κόμβου Διαγραφή κόμβου ΔΓΒΑ ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 23

(2) Διαγραφή Κόμβου Η ουρά δείχνει τον επόμενο της κεφαλής ο οποίος γίνεται κεφαλή της λίστας. ΔΓΒΑ ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 24

(3) Διαγραφή Κόμβου free( κόμβος ); Δ ΓΒΑ ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 25

(4) Τελική Μορφή ΓΒΑ ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 26

Διαγραφή Κόμβου – Αλγόριθμος (1 από 2)  Εάν ο υπό διαγραφή κόμβος είναι η κεφαλή τότε εάν υπάρχει επόμενος κόμβος αποτελεί πλέον την κορυφή αλλιώς (εάν δεν υπάρχει επόμενος) η λίστα είναι κενή.  Εάν ο υπό διαγραφή κόμβο είναι η ουρά τότε ο προηγούμενος της ουράς κόμβος πρέπει να δείχνει την κεφαλή. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 27

Διαγραφή Κόμβου – Αλγόριθμος (2 από 2)  Εάν ο υπό διαγραφή κόμβος είναι ενδιάμεσος κόμβος:  Τότε ο δείκτης του προηγούμενου κόμβου πρέπει να δείχνει τον επόμενο του υπό διαγραφή κόμβου.  Σε κάθε περίπτωση αποδεσμεύεται ο χώρος του υπό διαγραφή κόμβου (free). Κυκλικά και Διπλά Συνδεδεμένη Λίστα 28

Διαγραφή Κόμβου – Υλοποίηση (1 από 3) void diagrafi(int k) { Proion *x, *proigoumenos, *temp; /* o δείκτης temp για την κυκλική λίστα */ x = kefali; proigoumenos = kefali; temp = kefali; if (kefali == NULL ) { printf("\n H Λίστα είναι κενή!!! \n"); return; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 29

Διαγραφή Κόμβου – Υλοποίηση (2 από 3) if ( x->code == k ) { if (kefali == oura) { kefali = NULL; oura = NULL; } else { oura == NULL; kefali = x->epomeno; oura->epomeno = kefali; } free(x); printf("\n\n To προιον με κωδικό %d διαγράφηκε! ", k); return; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 30

Διαγραφή Κόμβου – Υλοποίηση (3 από 3) x = x->epomeno; while ( x != temp ) { if ( x->code == k ) { proigoumenos->epomeno = x->epomeno; if ( x == oura ) oura = proigoumenos; free(x); printf("\n\n To προιον με κωδικό %d διαγράφηκε! ", k); return; } proigoumenos = x; x = x->epomeno; } printf("\n\nΔεν Υπάρχει προιόν με κωδικό %d\n\n", k); } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 31

Διαπέραση Λίστας - Αλγόριθμος  Ορίζεται νέοι κόμβοι Χ και Υ και αρχικοποίηση με την κεφαλή. Εάν δεν είναι κενή η λίστα:  Εμφάνιση/χρήση της πληροφορίας του κόμβου Χ, και τοποθέτηση στον κόμβο Χ τον επόμενό του.  Εφόσον ο Χ δεν είναι ίδιος με τον Υ:  Εμφάνιση/χρήση της πληροφορίας του κόμβου Χ,  Τοποθέτηση στο κόμβο Χ τον επόμενό του.  Τέλος Εφόσον Κυκλικά και Διπλά Συνδεδεμένη Λίστα 32

Εμφάνιση Λίστας – Υλοποίηση (1 από 2) void emfanisi(void) { Proion *x, *temp; /* o δείκτης temp για την κυκλική λίστα */ int c = 0; if ( kefali == NULL ) { printf(“\n H λίστα είναι κενή. “); return; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 33

Εμφάνιση Λίστας – Υλοποίηση (2 από 2) x = kefali; temp = kefali; /* Εμφάνιση του πρώτου κόμβου */ printf("\n Κωδικός Περιγραφή Τιμή "); printf("\n%5d%10d%20s%12.2f", ++c, x->code, x->perigrafi, x- >timi); /* Συνέχιση με τους υπόλοιπους */ x = x->epomeno; while (x != temp) { printf("\n%5d%10d%20s%12.2f", ++c, x->code, x->perigrafi, x->timi); x = x->epomeno; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 34

Αναζήτηση Κόμβου - Αλγόριθμος  Η αναζήτηση είναι ακριβώς ίδια με την διαπέραση με μόνη διαφορά ότι σε περίπτωση που ο υπό αναζήτηση κόμβος βρεθεί διακόπτεται η διαπέραση της λίστας.  Ακριβώς ίδια διαδικασία και για την διόρθωση στοιχείων κόμβου: Αναζήτηση κόμβου και στην συνέχεια τροποποίηση των πληροφοριών του κόμβου. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 35

Διαγραφή Λίστας - Αλγόριθμος  Διαπέραση όλης της λίστας και αποδέσμευση μνήμης (διαγραφή - free) για τον κάθε κόμβο,  ΠΡΟΣΟΧΗ:  πριν την αποδέσμευση χώρου πρέπει να κρατηθεί η πληροφορία αναφορικά με τον ποιος είναι ο επόμενος κόμβος!!!  Η ουρά πρέπει να δείχνει ‘κενό’ από την αρχή. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 36

Διαγραφή Λίστας - Υλοποίηση void diagrafi_listas(void) { Proion *x, *epomenos, *temp; x = kefali; oura = NULL; while ( x != NULL ) { epomenos = x->epomeno; free(x); if ( x!= NULL) x = epomenos; } kefali = NULL; } Κυκλικά και Διπλά Συνδεδεμένη Λίστα 37

Αδυναμίες Κυκλικά Συνδεδεμένης Λίστας  Εάν ο δείκτης της λίστας δείχνει σε κάποιον κόμβο δεν υπάρχει τρόπος να οδηγηθούμε άμεσα και γρήγορα προς προηγούμενους κόμβους στην λίστα.  Λύση: Άλλη μία απλή παραλλαγή της Α.Σ. Λίστας, η Διπλά Συνδεδεμένη Λίστα – ΔΣΔ (Doubly Linked List). Κυκλικά και Διπλά Συνδεδεμένη Λίστα 38

Διπλά Συνδεδεμένη Λίστα  Διπλά συνδεδεμένη ονομάζεται η απλά συνδεδεμένη λίστα στην οποία ο κάθε κόμβος εκτός από το να δείχνει τον επόμενο κόμβο δείχνει και τον προηγούμενο του. Σχήμα από Wikipedia Κυκλικά και Διπλά Συνδεδεμένη Λίστα 39

Εφαρμογή: Πρόσθεση Μεγάλων Ακεραίων  Είναι γνωστό ότι το μήκος ενός ακεραίου στις γλώσσες προγραμματισμού είναι πεπερασμένο.  Πως θα μπορούσε να αποθηκευθεί και διαχειρισθεί τότε ένας πολύ μεγάλος ακέραιος;  Σαν μία συνδεδεμένη λίστα…  Κυκλικά και Διπλά Συνδεδεμένη Λίστα 40

Πρόσθεση Μεγάλων Ακεραίων  Λίστα στη οποία ο κάθε κόμβος είναι ένα (ή και περισσότερα) ψηφίο.  Ο ακέραιος αποδίδεται στην λίστα σε ανάποδη μορφή:  Κεφαλή της λίστας είναι το τελευταίο ψηφίο,  Ουρά της λίστας το πρώτο ψηφίο.  Παράδειγμα: ο ακέραιος 3456  Κυκλικά και Διπλά Συνδεδεμένη Λίστα 41

Παράδειγμα 3456  6345 ΚεφαλήΟυρά Κυκλικά και Διπλά Συνδεδεμένη Λίστα 42

Πρόσθεση Μεγάλων Ακεραίων  Οπότε 2 μεγάλοι ακέραιοι θα μπορούσε να αναπαρασταθούν με δύο λίστες.  Πρόσθεση: Παράλληλη διαπέραση των δύο λιστών και άθροιση του περιεχομένου των αντίστοιχων κόμβων και αποθήκευσή του σε μία νέα λίστα.  Στο τέλος, η νέα λίστα θα είναι το άθροισμα των δύο αυτών ακεραίων. Κυκλικά και Διπλά Συνδεδεμένη Λίστα 43

Πρόβλημα Flavius Josephus (1 από 2)  Ένα σύνολο Ν ανθρώπων στέκονται διαμορφώνοντας έναν κύκλο. Δοθέντος ενός τυχαίου αριθμού x και ενός ατόμου το οποίο επίσης επιλέγεται τυχαία, μετράμε x άτομα στον κύκλο (εάν το x>N απλά συνεχίζουμε κάνοντας τον κύκλο). Σε όποιο άτομο καταλήγει η μέτρηση αφαιρείται από τον κύκλο και η διαδικασία επαναλαμβάνεται από το επόμενο άτομο από αυτό που διαγράφηκε. Στο τέλος μένει μόνο ένα άτομο και αυτό είναι και ο νικητής (ιστορικά στοιχεία για το πρόβλημα στο Κυκλικά και Διπλά Συνδεδεμένη Λίστα 44

Πρόβλημα Flavius Josephus (2 από 2) Υλοποίηση με κυκλικά συνδεδεμένη λίστα. Ξεκινώντας από ένα τυχαία επιλεγμένο κόμβο διαγράφουμε τον x κόμβο. Η διαδικασία επαναλαμβάνεται μέχρι να απομείνει μόνο ένας κόμβος. Ν=10, x=3 και αρχή από 1 Διαγράφονται: 3, 6, 9, 2, 7, 1, 8, 5, 10  Νικητής: 4 Κυκλικά και Διπλά Συνδεδεμένη Λίστα 45

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