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

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

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

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

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

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

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

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

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

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

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

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

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

Τηλ , Fax: , URL:

Τηλ , Fax: , URL:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Τηλ , Fax: , URL:

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

Κατ οίκον Εργασία 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); } }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

υναµικές οµές εδοµένων

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

Τα δεδομένα (περιεχόμενο) μιας βάσης δεδομένων αποθηκεύεται στο δίσκο

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

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

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

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

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

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

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

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

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

ENOTHTA 3 ΟΜΕΣ Ε ΟΜΕΝΩΝ

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

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

Transcript:

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

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

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

Αφηρηµ. τύπος δεδοµένων Στοίβα (Stack) Εισαγωγή και ιαγραφή στοιχείων στο ένα της άκρο, την κορυφή. Λειτουργίες Top_Element(S): επιστρέφει το στοιχείο στην κορυφή της S 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_Element(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) µε πεδία τον πίνακα Datum και τον ακέραιο Length (µέγεθος στοίβας). S: δείκτης σε στοίβα info: τύπος στοιχείων του πίνακα Datum της S. S->Length == 0: άδεια στοίβα S->Length == N: γεµάτη στοίβα Εάν πρόκειται να χειριστούµε µία µόνον στοίβα, η στοίβα µπορεί να υλοποιηθεί χρησιµοποιώντας έναν ακέραιο Length και έναν πίνακα Datum (και όχι ως δοµή µε 2 πεδία): int Length; info Datum[0..N-1]; Στην απλούστερη έκδοση, οι 2 αυτές µεταβλητές είναι καθολικές. Ωστόσο, ΕΝ ΣΥΝΙΣΤΑΤΑΙ! 6

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

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

Υλοποίηση Λειτουργιών Στοίβας: µε δοµή µε πεδία Length και Datum[ ] pointer MakeEmptyStack(int N) pointer S; /* προσωρινός δείκτης */ S = new_struct(stack); /* malloc() */ S->Datum = new_struct(array of size N); S->Length = 0; S->MaxSize = N; return S; boolean IsEmptyStack(pointer S) /* return (S->Length == 0) */ if (S->Length == 0) return 1; else return 0; info Top_Element(pointer S) if (IsEmptyStack(S)) then error; else (return(s->datum[s->length 1])); Πολυπλοκότητα Χρόνου MakeEmptyStack(), IsEmptyStack(), Top_Element(): Θ(1) Συνολικός Απαιτούµενος Χώρος Μνήµης Ανεξάρτητα από το πλήθος στοιχείων: µέγεθος πίνακα Datum 9

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

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

Πολλαπλή Στοίβα (συνέχ.) Παράδειγµα 2: n Στοίβες Η πολλαπλή στοίβα χωρίζεται σε n ίσα τµήµατα. Καλύτερη Υλοποίηση n-πολλαπλής Στοίβας ι-κατευθυνόµενη Πολλαπλή Στοίβα 12

Στατική Ουρά Q: ουρά, δοµή µε τρία πεδία: Q->Datum: πίνακας A µε στοιχεία Q->Front: θέση F πρώτου στοιχείου Q->Length: συνολικό πλήθος n στοιχείων Κυκλική Στατική Ουρά 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. 13

Υλοποίηση Λειτουργιών Κυκλικής Ουράς pointer MakeEmptyQueue(int N) pointer Q; /* temporary pointer */ Q = new_struct(queue); /* malloc() */ Q->Datum = new_struct(array of size N); Q->Front = 0; Q->Length = 0; Q->MaxSize = N; return Q; boolean IsEmptyQueue(pointer Q) return (Q->Length == 0); info Front_Element(pointer Q) If IsEmptyQueue(Q) then error; else return (Q->Datum[Q->Front]); Πολυπλοκότητα (ίδια µε την υλοποίηση στοίβας) Χρόνος εκτέλεσης κάθε λειτουργίας: Θ(1) Χρησιµοποιούµενος χώρος µνήµης: µέγεθος πίνακα Datum 14

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

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

Υλοποίηση Λειτουργιών Συνδεδεµένης Στοίβας P->next void Push(info x, pointer S) pointer P; /* προσωρινός δείκτης */ P = new_struct(node); /* malloc() */ P->data = x; P->next = S; S = P; /* Αυτό στην C δεν έχει το επιθυµητό αποτέλεσµα! */ Απαιτούµενος χρόνος: Θ(1) 17

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

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

Υλοποίηση Λειτουργιών Ουράς: Απλά Back->next void Enqueue(info x) pointer P; /* προσωρινός δείκτης */ P = new_struct(node); /* malloc() */ P->data = x; P->next = NULL; if (IsEmptyQueue()) then Front = P; else Back->next = P; Back = P; 20

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

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

Υλοποίηση Λειτουργιών Ουράς πιο σύνθετα Q->Back->Next Q Q void Enqueue(info x, pointer Q) pointer P; /* προσωρινός δείκτης */ P = new_struct(node); /* malloc() */ P->data = x; P->next = NULL; if (IsEmptyQueue(Q)) then Q->Front = P; else Q->Back->next = P; Q->Back = P; 23

Υλοποίηση Λειτουργιών Ουράς πιο σύνθετα 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; Πολυπλοκότητα: Θ(1) 24

Συνδεδεµένες Λίστες Έστω ότι κάθε στοιχείο της λίστας έχει δύο πεδία: έναν ακέραιο num και τον δείκτη next. L : δείκτης στο πρώτο στοιχείο της λίστας Εισαγωγή σε Λίστα (στην αρχή) void ListInsert(int x) } pointer p; p = new_struct(node); p->num = x; p->next = L; L = p; Αναζήτηση σε Λίστα boolean ListSearch(int x) { /* 1 εάν x βρίσκεται στη λίστα και 0 εάν όχι */ } pointer p = L; while (p!= NULL && p->num!= x) p = p->next; return (p!= NULL); Άσκηση: Υλοποιήστε την Delete(). 25

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

2 ο Παράδειγµα Εφαρµογής Συνδεδεµένων Λιστών: Αραιοί Πίνακες Μονοδιάστατοι πίνακες Αποθήκευση των µη-µηδενικών στοιχείων σε µια λίστα. Προσπέλαση ενός στοιχείου απαιτεί χρόνο ανάλογο του πλήθους των µη-µηδενικών στοιχείων στον πίνακα. ιδιάστατοι πίνακες Αποθήκευση των µη-µηδενικών στοιχείων σε µια λίστα ανά γραµµή και ανά στήλη, π.χ., για 3 2 0 0 1 6 1 0 4 27

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

Εισαγωγή Στοιχείου σε Λίστα Ταξινοµηµένη κατά Φθίνουσα σειρά Λύση Χρήση ενός βοηθητικού δείκτη P (που δείχνει στον προηγούµενο από τον τρέχοντα κόµβο). ptr void LLInsert(integer k, pointer L) pointer C, P, ptr; /* προσωρινοί δείκτες */ 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 = new_struct(node); /* malloc */ ptr->num = k; if (P == NULL) then L = ptr; /* στην αρχή */ else P->next = ptr; ptr->next = C; 29

ιάσχιση Λίστας Παράδειγµα 1 Έστω λίστα που περιέχει λέξεις και είναι λεξικογραφικά ταξινοµηµένη. εδοµένης λέξης w, βρείτε την δεξιότερη λέξη στη λίστα που προηγείται αλφαβητικά της λέξης x και τελειώνει µε τα ίδια 4 τελευταία γράµµατα όπως η a. Π.χ., αν x = Νοέµβριος και a = Οκτώβριος και L = <Απρίλιος, Αύγουστος, εκέµβριος, Ιανουάριος, Ιούλιος, Ιούνιος, Μάιος, Μάρτιος, Νοέµβριος, Οκτώβριος, Σεπτέµβριος, Φεβρουάριος>. H απάντηση θα πρέπει να είναι: Ιανουάριος 30

Πιθανοί Αλγόριθµοι Αλγόριθµος 1 1) ιασχίζουµε τη λίστα προς τα εµπρός µέχρι να βρούµε τη δεξιότερη λέξη «µικρότερη» από τη λέξη Νοέµβριος (στο παράδειγµα τη λέξη Μάρτιος ), και κρατάµε δείκτες σε αυτόν και στους προηγούµενους κόµβους. Ελέγχουµε τους κόµβους που προέκυψαν στο προηγούµενο βήµα (από δεξιά προς τα αριστερά) και βρίσκουµε την πρώτη λέξη που τελειώνει σε -ριος. L = <Απρίλιος, Αύγουστος, εκέµβριος, Ιανουάριος, Ιούλιος, Ιούνιος, Μάιος, Μάρτιος, Νοέµβριος, Οκτώβριος, Σεπτέµβριος, Φεβρουάριος>. 31

Αλγόριθµος 2 ιασχίζουµε τη λίστα προς τα εµπρός κρατώντας έναν δεύτερο (βοηθητικό) δείκτη στο τελευταίο στοιχείο που είδαµε να τελειώνει σε -ριος. Ψευδοκώδικας function FindLast(pointer L, string x, string a): string /*βρες λεξικ.-µεγαλύτερη λέξη στην L πριν την x, τα τελευταία 4 γράµµατα της οποίας είναι ίδια µε αυτά της a */ /* return NULL εάν δεν υπάρχει τέτοια λέξη */ P = NULL; C = L; while (C!= NULL) and (C->string < x) do if (C->string και a έχουν ίδια 4 τελ. γράµµατα) then P = C; C = C->next; If (P == NULL) then return NULL; else return P->string; Πως θα συγκρίνατε την πολυπλοκότητα των δύο αλγορίθµων? 32

Αλγόριθµος 3 1) ιασχίζουµε τη λίστα προς τα εµπρός µέχρι να βρούµε την πρώτη αλφαβητικά ίση ή «µεγαλύτερη» λέξη από τη λέξη Νοέµβριος (στο παράδειγµα τη λέξη Μάρτιος ), αντιστρέφοντας τους δείκτες σύνδεσης. 2) Ακολουθούµε τους δείκτες προς τα πίσω (που προέκυψαν από την αντιστροφή δεικτών) αντιστρέφοντάς τους και πάλι, βρίσκουµε την πρώτη λέξη που τελειώνει σε -ριος, και συνεχίζουµε την αντιστροφή δεικτών µέχρι την αρχή της λίστας. L = <Απρίλιος, Αύγουστος, εκέµβριος, Ιανουάριος, Ιούλιος, Ιούνιος, Μάιος, Μάρτιος, Νοέµβριος, Οκτώβριος, Σεπτέµβριος, Φεβρουάριος>. 33

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

Παράδειγµα 2 (κίνηση προς τα εµπρός και προς τα πίσω) Έστω ότι κάθε κόµβος έχει τα εξής πεδία: string: λέξη next: δείκτης στον επόµενο κόµβο ίδονται µια λέξη x της λίστας και ένας αριθµός n. Να βρεθεί η λέξη που προηγείται της x κατά n θέσεις στη λίστα. L = <Απρίλιος, Αύγουστος, εκέµβριος, Ιανουάριος, Ιούλιος, Ιούνιος, Μάιος, Μάρτιος, Νοέµβριος, Οκτώβριος, Σεπτέµβριος, Φεβρουάριος>. Αλγόριθµος Αναζήτηση της x στη λίστα µε ταυτόχρονη κράτηση δεικτών προς τα πίσω. Οπισθοδρόµηση κατά n θέσεις στη λίστα. Η λύση µε χρήση επιπλέον δεικτών προς τα πίσω είναι ακριβή σε µνήµη!!!! Γιατί? Υπάρχει λύση φθηνή σε µνήµη? 35

ιπλά Συνδεδεµένες Λίστες Οι κόµβοι µιας διπλά συνδεδεµένης λίστας περιέχουν δείκτες και προς τα εµπρός και προς τα πίσω και άρα διασχίσεις και προς τις δύο κατευθύνσεις είναι εύκολα υλοποιήσιµες. 36

Λειτουργίες ιπλά Συνδεδεµένης Λίστας Εισαγωγή κόµβου στον οποίο δείχνει ο P µετά τον κόµβο στον οποίο δείχνει ο Q: void DoublyLinkedInsert(pointer P,Q) P > P > Q > QP > Pr ev Next Next Next > Pr ev Q Q > P P Next ιαγραφή από τη λίστα κόµβου που δείχνεται από τον P void DoublyLinkedDelete(pointer P) P > P > Pr ev > Next Next > Pr ev P > P > Next Pr ev Ισχύει για διπλά συνδεδεµένη λίστα µε κόµβο Header. Τι γίνεται εάν δεν υπάρχει κόµβος Header? Πολυπλοκότητα? 37

Εφαρµογές Σειριακών Γραµµικών Στοιβών Αναδροµή Παράδειγµα: Υπολογισµός του n! = 1 2 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; 38