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

Σχετικά έγγραφα
Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Στοίβες Ουρές - Λίστες

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

ΕΝΟΤΗΤΑ 3 ΓΡΑΜΜΙΚΕΣ ΛΙΣΤΕΣ

Ενότητα 2 Στοίβες Ουρές - Λίστες

Ενότητα 2 Στοίβες Ουρές - Λίστες

Υλοποίηση Λειτουργιών Στοίβας Απλά(1/2)

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

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

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

Τηλ , Fax: , URL:

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

Τηλ , Fax: , URL:

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

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

ιαφάνειες παρουσίασης #11

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

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

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

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

Insert(K,I,S) Delete(K,S)

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

Τηλ , Fax: , URL:

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

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

Τηλ , Fax: , URL:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

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

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο Κάθε δομή μπορεί να χρησιμοποιηθεί σε οποιοδήποτε πρόβλημα ή εφαρμογή

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

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα

Οι δομές δεδομένων στοίβα και ουρά

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

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

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

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

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

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

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

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

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

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

Ενότητα 7 Ουρές Προτεραιότητας

Κεφάλαιο 3 : εδοµένα. Πίνακες Στοίβα Ουρά Αναζήτηση Ταξινόµηση. Προγράµµατα

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

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


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

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

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

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

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

Ιδιοκτησία Αντικειµένου

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

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

8.6 Κλάσεις και αντικείμενα 8.7 Δείκτες σε γλώσσα μηχανής

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

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

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

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Transcript:

ΕΝΟΤΗΤΑ 3 ΓΡΑΜΜΙΚΕΣ ΛΙΣΤΕΣ

Ορισµός Γραµµικές Λίστες Γραµµική λίστα (linear list) είναι ένα σύνολο από n 0 κόµβους L 0, L 1,..., L n-1, όπου το στοιχείο L 0 είναι το πρώτο στοιχείο (ή ο πρώτος κόµβος), ενώ το στοιχείο L k προηγείται του στοιχείου L k+1 και έπεται του στοιχείου L k-1, 0 < k < n-1. L 0 : κεφαλή (head) L n-1 : ουρά (tail) L : µήκος λίστας ( L = n) < >: κενή λίστα Λειτουργίες που συνήθως υποστηρίζονται από λίστες: Access(L,j): Επιστρέφει L j ή ένα µήνυµα λάθους αν j είναι < 0 ή > L -1. Length(L): Επιστρέφει L. Concat(L 1,L 2 ): επιστρέφει µια λίστα: το αποτέλεσµα της συνένωσης των 2 λιστών σε 1. MakeEmptyList(): επιστρέφει < >. IsEmptyList(L): επιστρέφει true αν L = < >, false διαφορετικά. Φατούρου Παναγιώτα 2

Είδη Γραµµικών Λιστών Σειριακή Λίστα: καταλαµβάνει συνεχόµενες θέσεις κύριας µνήµης Συνδεδεµένη Λίστα: οι κόµβοι βρίσκονται σε αποµακρυσµένες θέσεις συνδεδεµένες όµως µεταξύ τους µε δείκτες. Στατικές Λίστες: o µέγιστος αριθµός στοιχείων είναι εξ αρχής γνωστός (υλοποίηση µε σειριακές λίστες). υναµικές Λίστες: ο µέγιστος αριθµός στοιχείων δεν είναι γνωστός. Επιτρέπεται η επέκταση ή η συρρίκνωση της λίστας κατά την εκτέλεση του προγράµµατος (υλοποίηση µε συνδεδεµένες λίστες). Στοίβα Ουρά Φατούρου Παναγιώτα 3

Αφηρηµένος τύπος δεδοµένων Στοίβα (Stack) Λίστα που µπορεί να τροποποιείται µόνο µε την εισαγωγή και διαγραφή στοιχείων στο ένα της άκρο. Λειτουργίες Top(S): επιστρέφει το κορυφαίο στοιχείο της S (αντίστοιχο Access(S, S -1)). Pop(S): (λειτουργία απώθησης) διαγραφή και επιστροφή του κορυφαίου στοιχείου της S Push(x,S): (λειτουργία ώθησης) εισαγωγή του στοιχείου x στην κορυφή της στοίβας MakeEmptyStack(): επιστρέφει την < >. IsEmptyStack(S): επιστρέφει true αν η S = 0, διαφορετικά false. Η µέθοδος επεξεργασίας των δεδοµένων στοίβας λέγεται «Τελευταίο Μέσα Πρώτο Έξω» (Last In First Out, LIFO). Φατούρου Παναγιώτα 4

Αφηρηµένος τύπος δεδοµένων Ουρά (Queue) Λίστα που µπορεί να τροποποιείται µόνο µε την εισαγωγή στοιχείων στο ένα άκρο της και τη διαγραφή στοιχείων στο άλλο. Λειτουργίες Enqueue(x,Q): Εισαγωγή x στο τέλος της Q (αντίστοιχο Concat(Q, <x>)). Dequeue(Q): ιαγραφή & επιστροφή του πρώτου στοιχείου της Q (Q = < Q 0,, Q Q -1 > και το Q 0 επιστρέφεται). Front(Q): επιστρέφει Q 0. MakeEmptyQueue(): επιστρέφει < >. IsEmptyQueue(Q): επιστρέφει true αν Q = 0, false διαφορετικά. Η µέθοδος επεξεργασίας των δεδοµένων ουράς λέγεται «Πρώτο Μέσα Πρώτο Έξω» ( First In First Out, FIFO). Φατούρου Παναγιώτα 5

Στατικές Στοίβες Σειριακές Γραµµικές Λίστες Μια στατική στοίβα υλοποιείται µε τη χρήση ενός µονοδιάστατου πίνακα. S = <S 0,, S n-1 > η στοίβα & A[0 N-1] ο πίνακας, n N Α[j] = S j Η στοίβα καταλαµβάνει το κοµµάτι A[0 n-1]. A[n-1]: κορυφαίο στοιχείο της στοίβας A[0]: βαθύτερο στοιχείο της στοίβας Η στοίβα υλοποιείται ως µια δοµή (struct στη C) µε πεδία τον πίνακα Infos και τον ακέραιο Length (µέγεθος στοίβας). S: δείκτης σε στοίβα info: τύπος στοιχείων του πίνακα (Infos(S)). S->Length == 0: άδεια στοίβα S->Length == N: γεµάτη στοίβα Πιο απλά (σε C), η στοίβα µπορεί να υλοποιηθεί από έναν ακέραιο length και από έναν πίνακα Infos (και όχι ως δοµή που περιέχει αυτά τα 2 πεδία). int Length; info Infos[0..N-1]; Στην απλούστερη έκδοση οι 2 αυτές µεταβλητές είναι global. Ωστόσο, ΕΝ ΣΥΝΙΣΤΑΤΑΙ! Φατούρου Παναγιώτα 6

Υλοποίηση Λειτουργιών Στοίβας: Απλά void MakeEmptyStack(void) Length = 0; for (i=0; i < N; i++) Infos[i] = ; /* initialize */ boolean IsEmptyStack(void) /* return (Length == 0) */ if (Length == 0) return 1; else return 0; info Top(void) if (IsEmptyStack()) then error; else (return(infos[length 1])); Χρονική Πολυπλοκότητα MakeEmptyStack(): Θ(N) IsEmptyStack(): Θ(1) Top(): Θ(1) Συνολικός Απαιτούµενος Χώρος Μνήµης Ανεξάρτητα από τον αριθµό στοιχείων: Ν Φατούρου Παναγιώτα 7

Υλοποίηση Λειτουργιών Στοίβας: Απλά info Pop(void) if (Length == 0) return error else x = Top(); Length = Length 1; return x; void Push(info x) if (Length == N) then error else Length = Length + 1; Infos[Length-1] = x; Χρονική Πολυπλοκότητα Pop(): Θ(1) Push(): Θ(1) Φατούρου Παναγιώτα 8

Υλοποίηση Λειτουργιών Στοίβας Πιο δύσκολα pointer MakeEmptyStack(void) pointer S; /* temporary pointer */ S = newcell(stack); /* malloc() */ S->Length = 0; return S; boolean IsEmptyStack(pointer S) /* return (S->Length == 0) */ if (S->Length == 0) return 1; else return 0; info Top(pointer S) if (IsEmptyStack(S)) then error; else (return(s->infos[s->length 1])); Χρονική Πολυπλοκότητα MakeEmptyStack(): Θ(1) IsEmptyStack(): Θ(1) Top(): Θ(1) Συνολικός Απαιτούµενος Χώρος Μνήµης Ανεξάρτητα από τον αριθµό στοιχείων: Ν Φατούρου Παναγιώτα 9

Υλοποίηση Λειτουργιών Στοίβας info Pop(pointer S) if (S->Length == 0) return error else x = Top(S); S->Length = S->Length 1; return x; void Push(info x, pointer S) if (S->Length == N) then error else S->Length = S->Length + 1; S->Infos[S->Length-1] = x; Χρονική Πολυπλοκότητα Pop(): Θ(1) Push(): Θ(1) Φατούρου Παναγιώτα 10

Πολλαπλή Στοίβα Περισσότερες από µια στοίβες που υλοποιούνται σε συνεχόµενες θέσεις µνήµης. Παράδειγµα 1: ύο Στοίβες Έστω Stack[0 n-1] ο πίνακας που χρησιµοποιείται για την αποθήκευση των λιστών. Η 1 η στοίβα ξεκινάει από τη θέση Stack[0] και αναπτύσσεται προς τα δεξιά, ενώ η 2 η ξεκινάει από τη θέση Stack[n-1] και αναπτύσσεται προς τα αριστερά. Παράδειγµα 2: n Στοίβες Η πολλαπλή στοίβα χωρίζεται σε n ίσα τµήµατα. Τι γίνεται σε περίπτωση υπερχείλισης? Φατούρου Παναγιώτα 11

Καλύτερες Υλοποιήσεις n-πολλαπλής Στοίβας ικατευθυνόµενη Πολλαπλή Στοίβα Φατούρου Παναγιώτα 12

Εφαρµογές Σειριακών Γραµµικών Στοιβών Αναδροµή Υπολογισµός του n! Αναδροµική Λύση integer factorial(integer n) if (n == 0) then return 1; else return (n * factorial(n-1)); Μη Αναδροµική Λύση integer factorial(integer n) integer j, product; j = n; product = 1; while (j > 0) product = j * product; j = j-1; return product; Φατούρου Παναγιώτα 13

Στατική Ουρά Q: ουρά, δοµή µε τρία πεδία: A=Q->Infos: πίνακας µε στοιχεία F=Q->Front: θέση πρώτου στοιχείου n=q->length: συνολικός αριθµός στοιχείων. Κυκλική Στατική Ουρά x 0,, x n-1 : στοιχεία ουράς A[F], A[(F+1) mod N], A[(F+2) mod N],, A[(F+n-1) mod N]: θέσεις στις οποίες είναι αποθηκευµένα τα x 0,, x n-1. Φατούρου Παναγιώτα 14

Υλοποίηση Λειτουργιών Κυκλικής Ουράς pointer MakeEmptyQueue(void) pointer Q; /* temporary pointer */ Q = NewCell(Queue); /* malloc() */ Q->Front = 0; Q->Length = 0; return Q; boolean IsEmptyQueue(pointer Q) return (Q->Length == 0); info Front(pointer Q) If IsEmptyQueue(Q) then error; else return (Q->Infos[Q->Front]); Πολυπλοκότητα Ίδια µε την υλοποίηση στοίβας Χρόνος εκτέλεσης κάθε λειτουργίας: Θ(1) Χρησιµοποιούµενος χώρος µνήµης: Ν Φατούρου Παναγιώτα 15

Υλοποίηση Λειτουργιών Κυκλικής Ουράς (Q->Front + Q->Length 1) mod N info Dequeue(pointer L) if IsEmptyQueue(Q) then error; else x = Q->Infos[Q->Front]; Q->Front = (Q->Front+1) mod N; Q->Length = Q->Length 1; return x; procedure Enqueue(info x, pointer Q) if (Q->Length == N) then error; else Q->Length = Q->Length+1 Q->Infos[(Q->Front + Q->Length 1) mod N] = x Φατούρου Παναγιώτα 16

Συνδεδεµένες Γραµµικές Λίστες Στοίβα ως Συνδεδεµένη Λίστα S: δείκτης σε δοµή (που ονοµάζεται Node) µε πεδία : next: δείκτης στο εποµένο στοιχείο της στοίβας data: πληροφορία αποθηκευµένη στο στοιχείο Υλοποίηση Λειτουργιών pointer MakeEmptyStack() return NULL; boolean IsEmptyStack(pointer S) return (S == NULL); info Top(pointer S) if IsEmptyStack(S) then error; else return S->data; Χρόνος εκτέλεσης κάθε λειτουργίας: Θ(1) Φατούρου Παναγιώτα 17

Υλοποίηση Λειτουργιών Συνδεδεµένης Στοίβας P->next void Push(info x, pointer S) pointer P; /* temporary pointer */ P = NewCell(Node); /* malloc() */ P->data = x; P->next = S; S = P; Απαιτούµενος χρόνος: Θ(1) Φατούρου Παναγιώτα 18

Υλοποίηση Λειτουργιών Συνδεδεµένης Στοίβας S->next S=S->Next info Pop(pointer S) if (IsEmptyStack(S)) then error; else x = Top(S); S = S->Next; return x; Απαιτούµενος Χρόνος: Θ(1) Extra µνήµη (για δείκτες): n (όπου n: # στοιχείων) Φατούρου Παναγιώτα 19

Ουρά ως Συνδεδεµένη Λίστα: Απλά Ουρά: 2 δείκτες (Front και Back) που δείχνουν σε δοµή (µε όνοµα Node) 2 πεδίων: next: δείκτης στο εποµένο στοιχείο της στοίβας data: πληροφορία αποθηκευµένη στο στοιχείο Στην απλούστερη περίπτωση οι Front, Back είναι global ( ΕΝ ΣΥΝΙΣΤΑΤΑΙ!). Υλοποίηση Λειτουργιών Ουράς void MakeEmptyQueue(void) Front = Back = NULL; boolean IsEmptyQueue(void) return (Front == NULL); info Front(void) if (IsEmptyQueue()) then error; else return (Front->data); Φατούρου Παναγιώτα 20

Υλοποίηση Λειτουργιών Ουράς: Απλά Back->next void Enqueue(info x) pointer P; /* temporary pointer */ P = NewCell(Node); P->data = x; P->next = NULL; if (IsEmptyQueue()) then Front = P; else Back->next = P; Back = P; Φατούρου Παναγιώτα 21

Υλοποίηση Λειτουργιών Ουράς: Απλά Front->next info Dequeue(void) if (IsEmptyQueue()) then error; else x = Front->data; Front = Front->next; if (Front == NULL) then Back = NULL; return x; Φατούρου Παναγιώτα 22

Ουρά ως Συνδεδεµένη Λίστα: Πιο δύσκολα Ουρά Q: δοµή (που ονοµάζεται Queue) 2 δεικτών (Q->Front και Q->Back) που κάθε ένας δείχνει σε δοµή (που ονοµάζεται Node) 2 πεδίων: Q next: δείκτης στο επόµενο στοιχείο της στοίβας data: πληροφορία αποθηκευµένη στο στοιχείο Υλοποίηση Λειτουργιών Ουράς pointer MakeEmptyQueue(void) pointer Q; /* temporary pointer */ Q = NewCell(Queue); /* malloc() */ Q->Front = Q->Back = NULL; return Q; boolean IsEmptyQueue(pointer Q) return (Q->Front == NULL); info Front(pointer Q) if (IsEmptyQueue(Q)) then error; else return (Q->Front->data); Φατούρου Παναγιώτα 23

Υλοποίηση Λειτουργιών Ουράς Πιο δύσκολα Q->Back->Next Q Q void Enqueue(info x, pointer Q) pointer P; /* temporary pointer */ P = NewCell(Node); P->data = x; P->next = NULL; if (IsEmptyQueue(Q)) then Q->Front = P; else Q->Back->next = P; Q->Back = P; Φατούρου Παναγιώτα 24

Υλοποίηση Λειτουργιών Ουράς Πιο ύσκολα Q->Front- Q Q info Dequeue(pointer Q) if (IsEmptyQueue(Q)) then error; else x = Q->Front->data; Q->Front = Q->Front->next; if (Q->Front == NULL) then Q->Back = NULL; return x; Πολυπλοκότητα: Ίδια µε εκείνη για στοίβες. Φατούρου Παναγιώτα 25

Παράδειγµα Εφαρµογής Συνδεδεµένων Λιστών Παράσταση πολυωνύµων a n x n + a n-1 x n-1 + + a 1 x + a 0 Χρήση λίστας για την αποθήκευση των συντελεστών. Κόµβος Φρουρός Αναζήτηση κόµβου µε συγκεκριµένη τιµή. Αν ο κόµβος δεν υπάρχει στη λίστα εισάγεται. Εισάγεται ένας κόµβος (τελευταίος πάντα στη λίστα) που λέγεται κόµβος φρουρός. Ένας δείκτης δείχνει µόνιµα σε αυτόν τον κόµβο. Η προς αναζήτηση τιµή αρχικά αποθηκεύεται στον κόµβο αυτό. Εκτελείται διάσχιση της λίστας και αναζήτηση της τιµής. Αν βρεθεί στον κόµβο φρουρό γίνεται η εισαγωγή. ιαφορετικά όχι. Σε τι µας βοηθάει ο κόµβος φρουρός? Φατούρου Παναγιώτα 26

Αραιοί Πίνακες 2 ο Παράδειγµα Εφαρµογής Συνδεδεµένων Λιστών o Αποθήκευση των µη-µηδενικών στοιχείων σε µια λίστα. o Κάθε στοιχείο της λίστας αντιστοιχεί σε ένα µη-µηδενικό στοιχείο του πίνακα. o Προσπέλαση ενός στοιχείου απαιτεί χρόνο ανάλογο του αριθµού των µη-µηδενικών στοιχείων στον πίνακα. o Εισαγωγές στοιχείων είναι ωστόσο δυνατές (δηλαδή ενός µηδενικού στοιχείου του πίνακα σε µη-µηδενικό στοιχείο είναι δυνατές). Φατούρου Παναγιώτα 27

Εισαγωγή Στοιχείου σε Ταξινοµηµένη Λίστα Ο κάθε κόµβος της λίστας περιέχει π.χ. έναν ακέραιο και ένα δείκτη στον επόµενο κόµβο: num: αποθηκευµένος ακέραιος στον κόµβο next: δείκτης στον επόµενο κόµβο της λίστας L: δείκτης στο πρώτο στοιχείο της λίστας Πρόβληµα προς επίλυση Εισαγωγή νέου στοιχείου στη λίστα, έτσι ώστε η λίστα να εξακολουθήσει να είναι ταξινοµηµένη. Κ: προς εισαγωγή ακέραιος Πρόβληµα µε την εισαγωγή στοιχείου σε ταξινοµηµένη λίστα: Είναι δυνατή η εισαγωγή ενός στοιχείου µόνο ως επόµενου κόµβου κάποιου δεδοµένου κόµβου και όχι ως προηγούµενου. Φατούρου Παναγιώτα 28

Εισαγωγή Στοιχείου σε Ταξινοµηµένη Λίστα Λύση Χρήση ενός βοηθητικού δείκτη P (που δείχνει πάντα στο προηγούµενο από το τρέχον στοιχείο). ptr void LLInsert(integer K, pointer L) pointer C, ptr; /* temporary pointers */ C = L; P = NULL; while (C!= NULL) and (C->Num > K) do P = C; C = C->next; if (C!= NULL) and (C->Num == K) then return; ptr = NewCell(Node); /* malloc */ ptr->num = K; if (P == NULL) then L = ptr; else P->next = ptr; ptr->next = C; Φατούρου Παναγιώτα 29

ιάσχιση Λίστας Εκτέλεση επίσκεψης σε ένα ή σε κάποια προκαθορισµένα στοιχεία µιας λίστας µε κάποια προκαθορισµένη σειρά. Θεωρούµε λίστα που περιέχει strings (λέξεις) & είναι λεξικογραφικά ταξινοµηµένη. Πρόβληµα εδοµένης λέξης w, βρείτε την τελευταία λέξη στη λίστα που προηγείται αλφαβητικά της w και τελειώνει µε το ίδιο γράµµα όπως η w. Παράδειγµα w = crabapple L = <canary, cat, chickadee, coelacanth, collie, corn, cup>. H απάντηση θα πρέπει να είναι collie. Φατούρου Παναγιώτα 30

Αλγόριθµος 1 Πιθανοί Αλγόριθµοι 1) ιασχίζουµε τη λίστα προς τα εµπρός ως να βρούµε την πρώτη αλφαβητικά «µεγαλύτερη» λέξη από την crabapple, κρατώντας δείκτες προς τα πίσω (στο παράδειγµα την cup). 2) Ακολουθούµε τους δείκτες προς τα πίσω (που προσθέσαµε κατά τη διάσχιση προς τα εµπρός) µέχρι να βρούµε την πρώτη λέξη που τελειώνει σε e. Φατούρου Παναγιώτα 31

Αλγόριθµος 2 ιασχίζουµε τη λίστα προς τα εµπρός κρατώντας έναν δεύτερο (βοηθητικό) δείκτη στο τελευταίο στοιχείο που είδαµε να έχει τη ζητούµενη ιδιότητα. Ψευδοκώδικας function FindLast(pointer L, string w): string /*find the last word in L ending with the same letter as w*/ /* return NULL if there is no such word */ P = NULL; C = L; while (C!= NULL) and (C->string < w) do if (C->string ends with the same letter as w) then P = C; C = C->Next; If (P == NULL) then return NULL; else return P->string; Πως θα συγκρίνατε την πολυπλοκότητα των δύο αλγορίθµων? Φατούρου Παναγιώτα 32

ιασχίσεις Zig-Zag Παράδειγµα Έστω ότι κάθε κόµβος έχει τα εξής πεδία: String: λέξη Num: ακέραιος Next: δείκτης στον επόµενο κόµβο εδοµένης λέξης w της λίστας η οποία σχετίζεται µε τον αριθµό n, βρείτε τη λέξη που προηγείται της w κατά n θέσεις στη λίστα. Αλγόριθµος Αναζήτηση της w στη λίστα µε ταυτόχρονη κράτηση δεικτών προς τα πίσω. Οπισθοδρόµηση κατά n θέσεις στη λίστα. Η λύση µε χρήση δεικτών προς τα πίσω είναι ακριβή σε µνήµη!!!! Γιατί? Υπάρχει λύση φθηνή σε µνήµη? Φατούρου Παναγιώτα 33

Μέθοδος Αναστροφής εικτών Λίστας Λειτουργίες StartTraversal(L): P Q NULL L Forward(P,Q): Back(P,Q): P Q Q > Next Q Q > P Next P P > Q Next P > Q P Next Φατούρου Παναγιώτα 34

ιπλά Συνδεδεµένες Λίστες Οι κόµβοι µιας διπλά συνδεδεµένης λίστας περιέχουν δείκτες και προς τα εµπρός και προς τα πίσω και άρα διασχίσεις Zig-Zag είναι εύκολα υλοποιήσιµες. Φατούρου Παναγιώτα 35

Λειτουργίες ιπλά Συνδεδεµένης Λίστας Εισαγωγή κόµβου στον οποίο δείχνει ο P µετά τον κόµβο στον οποίο δείχνει ο Q: void DoublyLinkedInsert(pointer P,Q) /* insert node pointed to by P just after node pointed to by Q */ P > P > Q > Q > Pr ev Next Next Next > Pr ev Q Q > P P Next ιαγραφή κόµβου P από τη λίστα void DoublyLinkedDelete(pointer P) /* delete node P from its doubly linked list */ P > P > Pr ev > Next Next > Pr ev P > P > Next Pr ev Πολυπλοκότητα? Φατούρου Παναγιώτα 36