Διδάσκων: Δρ. Τσίντζα Παναγιώτα

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Ε. ΠετράκηςΛίστες1  Λίστα: πεπερασμένη σειρά στοιχείων ίδιου τύπου  Οι πράξεις εξαρτώνται από τον τύπο της λίστας και όχι από τον τύπο δεδομένων  Λίστα:
Advertisements

3.4 Στοίβα (stack) (μόνο θεωρία)
Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Ανασκόπηση σε Δείκτες, Ουρές, Στοίβες, Συνδεδεμένες Λίστες
ΜΑΘΗΜΑ 7ο Κυκλικές και Διπλά Συνδεδεμένες Λίστες,
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Γλώσσα C & Unix Τμήμα Πληροφορικής, ΑΠΘ B’ εξάμηνο
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Αντικειμενοστρεφής Προγραμματισμός Κλάσεις και άλλα θέματα Απόστολος Ζάρρας * βασισμένα και σε δουλειά του.
Στοίβα & Ουρά Πέμπτη 08/03/2007 Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Τμήμα: Γ3τεχν. Καθηγητής :Ν. Γιαννακόπουλος ΠΕ19 Ερωτήσεις:
11-1 ΜΑΘΗΜΑ 12 ο Γράφοι, Διάσχιση Γράφων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006.
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Stacks - Στοίβες.
Δομές Δεδομένων 1 Στοίβα. Δομές Δεδομένων 2 Στοίβα (stack)  Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή – πρώτη εξαγωγή)  Περιορισμένος.
Ε. ΠετράκηςΣτοίβες, Ουρές1 Στοίβες  Στοίβα: περιορισμένη ποικιλία λίστας  τα στοιχεία μπορούν να εισαχθούν ή να διαγραφούν μόνο από μια άκρη : λίστες.
Στοίβα, Ουρά.
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
Διερεύνηση γραφήματος. Ένας αλγόριθμος διερεύνησης γραφήματος επισκέπτεται τους κόμβους του γραφήματος με μια καθορισμένη στρατηγική, π.χ. κατά εύρος.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Γενικευμένες κλάσεις Συλλογές.
6-1 ΜΑΘΗΜΑ 6 ο Ανασκόπηση σε Δείκτες, Συνδεδεμένες Λίστες, Ουρές, Στοίβες.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Γράφημα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Συνδυαστικό αντικείμενο που αποτελείται από.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
HY150Ξενοφών Ζαμπούλης HY150 Ε π ι π λέον στοιχεία της C.
Δομές Δεδομένων και Αρχεία Ενότητα 7: Η δομή Στοίβα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Τεχνολογία και Προγραμματισμός Υπολογιστών Ενότητα 9: Αρχεία - Λίστες Επίκουρος Καθηγητής Χρήστος Μακρής Τμήμα Μηχανικών Η/Υ & Πληροφορικής Πανεπιστήμιο.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Παράδειγμα Κληρονομικότητας Γενικευμένες κλάσεις.
1 Εισαγωγή στην επιστήμη των υπολογιστών Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ.
1 Απογραφή Η επιχείρηση είναι υποχρεωμένη να πραγματοποιεί πραγματική απογραφή των αποθεμάτων της τουλάχιστον μία φορά μέσα σε κάθε χρήση και συγκεκριμένα.
Δομές Δεδομένων 7η Διάλεξη Αφηρημένοι Τύποι Δεδομένων Ε. Μαρκάκης.
ΕΠΙΣΚΟΠΗΣΗ ΛΟΓΙΣΤΙΚΗΣ Ι. ΕΝΟΤΗΤΕΣ ΛΟΓΙΣΤΙΚΗ ΙΣΟΤΗΤΑ ΙΣΟΛΟΓΙΣΜΟΣ ΚΑΧ ΛΟΓΑΡΙΑΣΜΟΙ ΚΑΤΑΧΩΡΗΣΕΙΣ ΗΜΕΡΟΛΟΓΙΟ ΓΕΝΙΚΟ ΚΑΘΟΛΙΚΟ ΙΣΟΖΥΓΙΟ ΑΠΟΣΒΕΣΕΙΣ ΑΠΟΤΙΜΗΣΗ.
Οι Δομές Δεδομένων Ουρά και Στοίβα
10η Διάλεξη Ταξινόμηση E. Μαρκάκης
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Διερεύνηση γραφήματος
Δομές.
18η Διάλεξη Ισορροπημένα δέντρα Ε. Μαρκάκης
ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ: ΔΙΟΙΚΗΣΗ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΜΟΝΑΔΩΝ
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
EPL231 – Data Structures and Algorithms
11η Διάλεξη Ταξινόμηση Quicksort και Ιδιότητες Δέντρων Ε. Μαρκάκης
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Οι Δομές Δεδομένων Ουρά και Στοίβα
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ
Αναδρομικές Εξισώσεις και Αφηρημένοι Τύποι Δεδομένων
מבני נתונים ויעילות אלגוריתמים
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Είσοδος/έξοδος χαμηλού επιπέδου
Μανασσάκης Βασίλης Καθηγητής Πληροφορικής
Δομές Δεδομένων (Data Structures)
Η Ροή του Κόστους Παραγωγής
2ο ΕΡΓΑΣΤΗΡΙΟ – ΡΟΕΣ ΚΟΣΤΟΥΣ
Stack[ ] Queue[ ] 7 9 本試卷全部試題均須回答。
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΠΙΝΑΚΕΣ Δομή ΟΥΡΑΣ (queue)
Μεταγράφημα παρουσίασης:

Διδάσκων: Δρ. Τσίντζα Παναγιώτα ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Διδάσκων: Δρ. Τσίντζα Παναγιώτα

Λίστα – ορισμός Γραµµική λίστα (linear list) είναι ένα πεπερασµένο σύνολο από κόµβους x1, x2,......., xn όπου το στοιχείο xk προηγείται του στοιχείου xk+1 και έπεται του xk-1. Κατατάσσονται συνήθως σε δύο κατηγορίες: Σειριακές γραµµικές λίστες (sequential linear lists) => συνεχόµενες θέσεις µνήµης του Η/Υ για την αποθήκευση των κόµβων. Συνδεδεµένες γραµµικές λίστες (linked linear lists) => οι κόµβοι των λιστών βρίσκονται σε αποµακρυσµένες θέσεις που είναι µεταξύ τους συνδεδεµένες

Γραμμικές λίστες Χαρακτηρίζονται σαν: Στατικές δοµές δεδοµένων (static data structures) Κατά τον προγραµµατισµό των λειτουργιών των λιστών, έχει προκαθορισθεί το µέγεθος της µνήµης που απαιτείται για την αποθήκευση των λιστών. ∆υναµικές δοµές δεδοµένων (dynamic data structures) Μια λίστα µπορεί να αυξοµειωθεί κατά την διάρκεια εκτέλεσης του προγράµµατος.

Σειριακές γραμμικές λίστες

LIFO (Last In First Out) Στοίβα Φανταστείτε μια στοίβα από πιάτα. Κάθε νέο στοιχείο τοποθετείται στην κορυφή (top ή head). Το στοιχείο που βρίσκεται στην κορυφή της στοίβας εξέρχεται πρώτο. Αυτή η µέθοδος επεξεργασίας ονοµάζεται LIFO (Last In First Out) 4 3 2 1 10 top 7 8

Υλοποίηση στοίβας Με τη χρήση µονοδιάστατου πίνακα και δείκτη. Κύριες λειτουργίες στη στοίβα: Ώθηση (push) στοιχείου στην κορυφή της στοίβας Απώθηση (pop) στοιχείου από τη στοίβα

Λειτουργίες Ώθησης (εισαγωγή στοιχείου): Απώθησης (αφαίρεση στοιχείου) πρέπει οπωσδήποτε να ελέγχει µήπως η στοίβα είναι γεµάτη, οπότε έχουµε υπερχείλιση (overflow). Απώθησης (αφαίρεση στοιχείου) πρέπει να ελέγχει αν η στοίβα έχει αδειάσει, οπότε έχουµε υποχείλιση (underflow).

Βασικές πράξεις Empty (), η οποία επιστρέφει 1 αν η στοίβα είναι άδεια ή μηδέν στην αντίθετη περίπτωση. Push (a), η οποία τοποθετεί το στοιχείο a στην κορυφή της στοίβας Top (), προσπελαύνει το στοιχείο που βρίσκεται στην κορυφή της στοίβας. Pop (), η οποία προσπελαύνει και παράλληλα διαγράφει το στοιχείο που βρίσκεται στην κορυφή της στοίβας.

Αλγόριθμος υλοποίησης της πράξης push σε ψευδοκώδικα Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N] δηλώνεται ως ακέραιος) τότε η πράξη ένθεσης καλείται όταν θέλουμε να εισάγουμε ένα στοιχείο στη στοίβα έστω num. Η Push είναι μία ανεξάρτητη διαδικασία η οποία καλείται από το κύριο πρόγραμμα όταν θέλουμε να εισάγουμε ένα στοιχείο στη στοίβα. Συντάσσεται επομένως ως μία συνάρτηση στην περίπτωση μας τύπου ακεραίου στην οποία μεταφέρεται μαζί ως αρχικά δεδομένα και η τιμή του στοιχείου num. Όταν καλείται έχει την μορφή push(num). Όταν γίνει αίτηση πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχει διαθέσιμος χώρος στη στοίβα για να εισαχθεί το στοιχείο num. Αν η μεταβλητή Head που δείχνει στο τελευταίο στοιχείο της στοίβας (κεφαλή της) δείχνει στο στοιχείο N τότε δεν υπάρχει χώρος στη στοίβα. Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχει χώρος για το στοιχείο num και τότε η μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη θέση της στοίβας που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση που δείχνει η head. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Αλγόριθμος Push Δεδομένα //num : ακέραιος αριθμός// Αρχή Aν Head < N τότε Head= Head+1; Array[Head]=num; Check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check // Τέλος Push

Αλγόριθμος υλοποίησης της πράξης pop σε ψευδοκώδικα Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N] δηλώνεται ως ακέραιος) τότε η πράξη απώθησης καλείται όταν θέλουμε να διαβάσουμε και να σβήσουμε παράλληλα το στοιχείο κεφαλή της στοίβας έστω num. Όταν καλείται η pop επομένως έχει την μορφή push() και επιστρέφει την κεφαλή της στοίβας (αν εκτελεστεί επιτυχώς). Όταν γίνει αίτηση για απώθηση (pop()) πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχουν στοιχεία της στοίβας. Αν η που Head δείχνει στο τελευταίο στοιχείο της στοίβας έχει την τιμή 0 σημαίνει ότι η στοίβα είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται η μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στη στοίβα και η pop επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η μεταβλητή head μειώνεται κατά ένα ώστε να δείχνει στο προηγούμενο στοιχείο της στοίβας που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Αλγόριθμος Pop Αρχή Aν Head>0 τότε Num=Array[Head]; Head= Head-1; check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check, num// Τέλος Pop

Υλοποίηση στοίβας σε C int pop(int stack[],int *t) { int r ; #define N 100 // ορισμός μεγέθους int stack[N], top = -1; //ορισμός λίστας και δείκτη (αρχικά στη θέση -1) void push(int stack[], int *t, int obj) { if (*t = = N-1) // έλεγχος υπερχείλισης printf("Stack overflow...\n"); getch(); abort(); } else stack[++(*t)] = obj; // εισαγωγή νέου στοιχείου στη θέση int pop(int stack[],int *t) { int r ; if (*t < 0) // έλεγχος υποχείλισης printf("Stack empty...\n"); getch(); abort(); } else r = stack[(*t)--]; // αφαίρεση στοιχείου return r;

Παράδειγμα χρήσης στοίβα EAS*Y*QUE***ST***IO*N*** τα γράμματα σημαίνουν push() και τα αστεράκια pop() A E S A E A E E …

FIFO (First In First Out) Ουρά (queue) Φανταστείτε μια ουρά αναµονής µε ανθρώπους. Το άτοµο που είναι πρώτο στην ουρά, εξυπηρετείται και εξέρχεται. Το άτοµο που µόλις καταφθάνει, τοποθετείται στο τέλος της ουράς. Η µέθοδος αυτή επεξεργασίας ονοµάζεται FIFO (First In First Out) ∆ύο βασικές λειτουργίες: Εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς Εξαγωγή (dequeue) στοιχείου από το εµπρός άκρο της ουράς

Χ Y Z Εξαγωγή στοιχείων Εισαγωγή στοιχείων

Υλοποίηση Για την υλοποίηση της ουράς χρειάζονται ένας πίνακας και δύο δείκτες, ο εµπρός (front ή head) και ο πίσω (rear ή back). Προγραµµατιστικά ο δείκτης rear δείχνει πάντα στο τελευταίο στοιχείο, ενώ ο δείκτης front δείχνει µία θέση πριν το πρώτο στοιχείο κατά συνέπεια, η ισότητα των δύο δεικτών αποδεικνύει ότι η ουρά είναι άδεια. 0 1 2 3 4 5 12 8 22 front rear

Αλγόριθμος υλοποίησης Enqueue σε ψευδοκώδικα Πρέπει να εξεταστεί αρχικά αν υπάρχει διαθέσιμος χώρος στην ουρά για να εισαχθεί το στοιχείο num. Η μεταβλητή Back δείχνει στο τελευταίο στοιχείο της ουράς (που εισήχθη και τελευταίο) και αν δείχνει στο στοιχείο N τότε δεν υπάρχει χώρος στην ουρά. Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την μεταβλητή check ως ψευδής. Αντίθετα υπάρχει χώρος για το στοιχείο num και τότε η μεταβλητή Back αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη θέση της ουράς που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση που δείχνει η Back. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Παράλληλα εξετάζουμε την περίπτωση όταν ένα στοιχείο εισάγετε για πρώτη φορά σε μια άδεια ουρά. Τότε, αυξάνεται κατά ένα η Back (Back=1) και το στοιχείο καταλαμβάνει τη θέση Array[Back]=Array[1]. Παράλληλα η head (που είναι μηδέν εφόσον ήταν άδεια η ουρά) αυξάνεται κατά ένα και δείχνει στη θέση Array[1]. Αλγόριθμος Enqueue Δεδομένα //num : ακέραιος αριθμός// Αρχή Aν Head=0 τότε Head=1; Aν Back<N τότε Back = Back +1; Array[Back]=num; Check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check // Τέλος Enqueue

Αλγόριθμος υλοποίησης Dequeue σε ψευδοκώδικα Αλγόριθμος Dequeue Αρχή Aν Head>0 τότε Num=Array[Head]; Head= Head+1; check=αληθής; Αν Head>Back τότε Head=0; Back=0; Τέλος Αν Αλλιώς Check=ψευδής; Αποτελέσματα // Check, num// Τέλος Dequeue Όταν γίνει αίτηση για απώθηση (Dequeue ()) πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχουν στοιχεία στην ουρά. Η μεταβλητή Head δείχνει στο πρώτο στοιχείο της ουράς (κεφαλή της). Αν επομένως η head έχει την τιμή 0 σημαίνει ότι η ουρά είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται η μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στην ουρά και η Dequeue επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στο επόμενο στοιχείο της ουράς που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Τέλος πρέπει να εξεταστεί η περίπτωση αν μετά από κάθε απώθηση άδειασε η ουρά. Αυτό συμβαίνει αν η Head αυξανόμενη κατά 1 πάρει τιμή μεγαλύτερη της Back. Τότε έχει απωθηθεί το τελευταίο στοιχείο της ουράς. Στην περίπτωση αυτή η ουρά είναι άδεια και επομένως μπορούμε να την αρχικοποιήσουμε θέτοντας στις μεταβλητές Head και Back την τιμή μηδέν.

Υλοποίηση ουράς σε C void dequeue(int q[], int *f, int r) #define N 100 int q[N], front = -1, rear = -1; void enqueue(int q[], int *r, int obj) { if (*r = = N-1) printf("Queue is full..."); getch(); } else q[++(*r)] = obj; void dequeue(int q[], int *f, int r) { int x; if (*f = = r) printf("Queue is empty...\n"); else x = q[++(*f)]; printf("%d has been deleted...",x); }

Mειονέκτηµα Υπάρχει περίπτωση ο back να φθάσει στο πάνω όριο του πίνακα, αλλά στην ουσία να µην υπάρχει υπερχείλιση, επειδή ο head θα έχει αυξηθεί (εικονική υπερχείλιση). 0 1 2 3 4 5 12 8 22 16 head back

Μια λύση Μία λύση θα ήταν να µεταφερθούν τα στοιχεία στο αριστερό άκρο του πίνακα. elements = front – rear; first = front + 1; for (i=0; i <elements; i++) q[i]=q[first++]; front=-1; rear=elements-1; 0 1 2 3 4 5 12 8 22 16 head back

Μια δεύτερη λύση Η ουρά να αναδιπλώνεται, Όταν ο rear = N-1, να επανατοποθετείται στο 0. Η δοµή αυτή ονοµάζεται κυκλική ουρά (circular queue). 0 1 2 3 4 5 17 12 8 22 16 back head

Παράδειγμα χρήσης ουράς EAS*Y*QUE***ST***IO*N*** τα γράμματα σημαίνουν Enqueue() και τα αστεράκια Dequeue() O N Ε A S Y Q U E S T I

Συνδεδεµένες γραµµικές λίστες

Απλές διασυνδεμένες λίστες Τα στοιχεία δεν αποθηκεύονται σε συνεχόμενες θέσεις Κάθε στοιχείο element αποθηκεύεται μαζί με ένα δείκτη next που ‘δείχνει’ στο επόμενο στην ακολουθία στοιχείο. Η δομή ονομάζεται κόμβος element next

Απλές διασυνδεμένες λίστες Η ακολουθία των στοιχείων είναι μια αλυσίδα από κόμβους Κάθε στοιχείο δείχνει το επόμενο του και αναφέρεται από το προηγούμενο του Διαφορετικά στοιχεία είναι το πρώτο και το τελευταίο στη λίστα: Το κεφάλι head δεν αναφέρετε από το προηγούμενο του Η ουρά tail δεν αναφέρετε στο επόμενο του (λέμε ότι ο δείκτης είναι ο μηδενικός σύνδεσμος ή null) a1 a2 a3 null

Απλές διασυνδεμένες λίστες Με ψευδο-κόμβο (dummy node) a1 a2 a3

Απλές διασυνδεμένες λίστες Χωρίς τερματισμό (κυκλικές λίστες): είναι μία απλή συνδεμένη λίστα με την διαφορά ότι ο δείκτης επόμενου στοιχείου του τελευταίου της κόμβου δεν περιέχει την τιμή null (ή 0) αλλά δείχνει στο πρώτο στοιχείο της λίστας. a1 a2 a3

Διπλά διασυνδεμένες λίστες Διπλά συνδεμένη λίστα ή συμμετρική (symmetric lists). Σε κάθε κόμβο συμπεριλαμβάνονται σύνδεσμοι όχι μόνο για το επόμενο στοιχείο – κόμβο αλλά και για το προηγούμενο  έχουμε δύο δείκτες. a1 a2 a3 null

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

1. Βασικές πράξεις στις λίστες Εισαγωγή (insertion) στοιχείου Πρέπει να δημιουργηθεί ένας νέος κόμβος στην λίστα στον οποίο να αποθηκευτεί (περίπτωση δυναμικής λίστας). Η θέση του κόμβου ορίζεται με βάση τις απαιτήσεις του προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας (απλή, διπλή ή κυκλική) γίνεται μόνο τροποποίηση των περιεχομένων των συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων. Διαγραφή (deletion) ενός στοιχείου. Αρκεί να τροποποιήσουμε το περιεχόμενο του συνδέσμου επόμενου στοιχείου του προηγούμενου κόμβου. Σάρωση λίστας. Προσπελαύνονται όλα τα στοιχεία της λίστας ξεκινώντας από το πρώτο και ακολουθώντας τους κόμβους μέσω των συνδέσμων τους μέχρι το τελευταίο στοιχείο. Σταματάμε όταν ο σύνδεσμος του επόμενου στοιχείου του έχει την τιμή null (0).

2. Βασικές πράξεις στις λίστες Αναζήτηση στοιχείου. Για την υλοποίηση χρησιμοποιείται η πράξη σάρωσης της λίστας. Η λίστα είναι μία γραμμική δομή άρα και η διαπέραση της μέσω των συνδέσμων είναι γραμμική. Συνένωση λιστών. Συνένωση δύο λιστών σε μία λίστα διατηρώντας αρχικές προϋποθέσεις που δίνονται. Με άλλα λόγια η συνένωση μπορεί να γίνει απλά τοποθετώντας τη μία λίστα μετά την άλλη είτε με συγκεκριμένο αλγόριθμο στην περίπτωση π.χ. που οι αρχικές λίστες είναι διατεταγμένες και επιθυμούμε η νέα λίστα να είναι και αυτή διατεταγμένη. Αντιστροφή λίστας. Αλλάζει η φορά διάταξης της λίστας ορίζοντας τον τελευταίο κόμβο ως πρώτο και αυτόν τελευταίο τροποποιώντας κατάλληλα τους συνδέσμους όλων των κόμβων της λίστας.

Παράδειγμα υλοποίησης λίστας ακεραίων στην C: Struct intlist { int num; Struct intlist *next; } node; Πρέπει να οριστεί κάθε κόμβος σαν μία μεταβλητή δομής η οποία περιέχει τόσο το περιεχόμενο – στοιχείο όσο και τον δείκτη που δείχνει στο επόμενο στοιχείο. Το περιεχόμενο μπορεί να είναι μία απλή μεταβλητή π.χ. ακεραίων όταν έχουμε μία λίστα ακεραίων αριθμών .

Παράδειγμα υλοποίησης λίστας με σύνολο μεταβλητών στην C: Struct address { char name [40]; char street[40]; char city[20]; char state[3]; char zip[10]; struct addrees *next; } node; * σημαίνει ότι χρησιμοποιείται ένας δείκτης διευθύνσεων ως σύνδεσμος με το επόμενο στοιχείο. Αυτός ο δείκτης σε κάθε κόμβο περιέχει την διεύθυνση μνήμης που περιέχει τον επόμενο κόμβο μετά την δομή ορίζεται και η μεταβλητή node που ουσιαστικά είναι η διεύθυνση – δείκτης ενός κόμβου

Προσοχή αν node είναι ο δείκτης ενός κόμβου τότε στην περίπτωση της απλής συνδεμένης λίστας ακεραίων (Struct intlist), με τον συμβολισμό node.num ορίζουμε τον ίδιο τον ακέραιο αριθμό του κόμβου ενώ με τον συμβολισμό node.next ορίζουμε τον δείκτη του κόμβου προς τον επόμενο.

Εισαγωγή στοιχείου σε απλή συνδεδεμένη λίστα Struct intlist { int num; Struct intlist *next; } node; Αλγόριθμος Εισαγωγή Δεδομένα Ο δείκτης pro_node που δείχνει τον κόμβο μετά τον οποίο θα εισαχθεί το στοιχείο, ο δείκτης node που δείχνει τη θέση (διεύθυνση) του νέου κόμβου και το στοιχείο Χ που είναι ο ακέραιος που θα εισαχθεί. Αρχή node.num=X; node.next=pro_node.next; pro_node.next=node; Τέλος Τέλος Εισαγωγή Για να γίνει η εισαγωγή ενός στοιχείου πρέπει να δημιουργηθεί ένας νέος κόμβος στην λίστα στον οποίο να αποθηκευτεί. Η θέση του κόμβου ορίζεται με βάση τις απαιτήσεις του προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας (απλή, διπλή ή κυκλική) γίνεται μόνο τροποποίηση των περιεχομένων των συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων. Διαφορετική περίπτωση η εισαγωγή στο τέλος όπου ο σύνδεσμος επόμενου στοιχείου του τελευταίου κόμβου που είναι null (0) πλέον δείχνει στο νέο στοιχείο ο σύνδεσμος του οποίου παίρνει την τιμή null (0) και είναι ο τελευταίος κόμβος.

Διαγραφή στοιχείου σε απλή συνδεδεμένη λίστα Για να γίνει η διαγραφή ενός στοιχείου από τη λίστα αρκεί να τροποποιήσουμε το περιεχόμενο του συνδέσμου επόμενου στοιχείου του προηγούμενου κόμβου. Αν αυτός δείχνει στον κόμβο που δείχνει ο σύνδεσμος του προς διαγραφή κόμβου τότε ουσιαστικά δεν υπάρχει κόμβος που να δείχνει σ’ αυτόν ενώ η αλυσίδα στοιχείων της λίστας δεν “κόβεται”. Struct intlist { int num; Struct intlist *next; } node; Αλγόριθμος Διαγραφή Δεδομένα Ο δείκτης pro_node που δείχνει τον προηγούμενο κόμβο από αυτόν που θα ακυρωθεί. Αρχή node=pro_node.next; pro_node.next=node.next; Τέλος Τέλος Διαγραφή

Σάρωση λίστας Με την πράξη αυτή προσπελαύνονται όλα τα στοιχεία της λίστας ξεκινώντας από το πρώτο και ακολουθώντας τους κόμβους μέσω των συνδέσμων τους μέχρι το τελευταίο στοιχείο που ο σύνδεσμος του επομένου στοιχείου του έχει την τιμή null (0). Είναι σαφές ότι γνωρίζουμε πιο είναι τόσο το πρώτο όσο και το τελευταίο στοιχείο της λίστας μέσω των δεικτών head και last που περιγράψαμε παραπάνω. Αλγόριθμος Σάρωση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε Εμφάνισε στοιχείο node.num; node=node.next; Τέλος Όσο Τέλος Τέλος Σάρωση

Εύρεση στοιχείου Με την πράξη αυτή μπορεί να γίνει η αναζήτηση ενός στοιχείου που επιθυμούμε. Για την υλοποίηση της πράξης αυτής χρησιμοποιείται η πράξη σάρωσης της λίστας. Η λίστα είναι μία γραμμική δομή άρα και η διαπέραση της μέσω των συνδέσμων είναι γραμμική. Αλγόριθμος Αναζήτηση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε Αν (node.num=x); return True node=node.next; Τέλος Όσο return False Τέλος Τέλος Αναζήτηση

Συνένωση Με την πράξη αυτή είναι δυνατή η συνένωση δύο λιστών σε μία λίστα διατηρώντας αρχικές προϋποθέσεις που δίνονται. Δηλαδή η συνένωση μπορεί να γίνει απλά τοποθετώντας τη μία λίστα μετά την άλλη είτε με συγκεκριμένο αλγόριθμο στην περίπτωση π.χ. που οι αρχικές λίστες είναι διατεταγμένες και επιθυμούμε η νέα λίστα να είναι και αυτή διατεταγμένη. Στην πρώτη περίπτωση η συνένωση, τα βασικά βήματα του αλγορίθμου που εκτελούνται παρουσιάζονται παρακάτω Αλγόριθμος Συνένωση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της δεύτερης λίστας, Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας Αρχή last.next=head; Τέλος Τέλος Συνένωση

Αντιστροφή λίστας Με την πράξη αυτή αλλάζει η φορά διάταξης της λίστας ορίζοντας τον τελευταίο κόμβο ως πρώτο και αυτόν τελευταίο τροποποιώντας κατάλληλα τους συνδέσμους όλων των κόμβων της λίστας. Αλγόριθμος Αντιστροφή Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε y=node.next; y.next=node; Τέλος Όσο head=last; head.next=0; Τέλος Τέλος Αντιστροφή