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

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

Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

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

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

Προγραμματισμός Δομές Δεδομένων

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

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

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

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

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

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

Οι δείκτες στη γλώσσα C

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

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

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

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

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

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

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

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

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

ΗΥ-150. Πίνακες (Arrays)

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

Προγραμματισμός Υπολογιστών με C++

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

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

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

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

Εισαγωγή στην επιστήμη των υπολογιστών. Οργάνωση εδομένων Κεφάλαιο 11ο ομές εδομένων

οµές (structures) και Eνώσεις (unions)

Επεξεργασία Αρχείων Κειµένου

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

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

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

Εισαγωγή στον Προγραμματισμό

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

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

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

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

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

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

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

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

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

Transcript:

υναµικές οµές εδοµένων Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: υναµικές οµές εδοµένων Γενικά υναµική έσµευση Μνήµης οµή τύπου structure αυτοαναφορικές δοµές Η δήλωση typedef στη C Αναπαράσταση Στοίβας ως συνδεδεµένη λίστα Αναπαράσταση Ουράς ως συνδεδεµένη λίστα ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 υναµικές οµές εδοµένων Οι δυναµικές δοµές δεδοµένων είναι ίσως η σηµαντικότερη καινοτοµία που συναντάµε ως αυτή τη στιγµή κατά τη γνωριµία µας µε τη γλώσσα C. Θα δούµε ότι ένα πρόγραµµα κατά την εκτέλεσή του θα µπορεί να ζητά δυναµικά µνήµη για την αποθήκευση δεδοµένων καθώς και να ελευθερώνει δυναµικά τη µνήµη που δεν χρειάζεται. Ως σήµερα, δηλώναµε εκ των προτέρων µέσω απλών µεταβλητών ή πινάκων το µέγιστο αριθµό θέσεων µνήµης που ένα πρόγραµµα µπορεί να χειριστεί κατά την εκτέλεσή του. Έτσι µηνύµατα όπως Array is full, Stack is full, Waiting list is full ήταν πολύ συνηθισµένα όταν ο πίνακας για τη λίστα ή τη στοίβα γέµιζε! Τώρα η υλοποίηση τύπων δεδοµένων (όπως η στοίβα, η ουρά, η λίστα) µπορεί να µη βασιστεί σε πίνακες οι οποίοι µας αναγκάζουν να ορίσουµε τις διαστάσεις τους και συνεπώς το µέγιστο πλήθος στοιχείων που µπορούµε να αποθηκεύσουµε. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 1

υναµικές οµές εδοµένων Θα µάθουµε πως µπορούµε να ζητήσουµε κατά την εκτέλεση του προγράµµατος µνήµη από το λειτουργικό σύστηµα και να την επιστρέψουµε όταν µας είναι πλέον άχρηστη. Όταν βέβαια το λειτουργικό σύστηµα δεν είναι σε θέση να µας δώσει άλλη µνήµη τότε και µόνο τότε το πρόγραµµά µας θα τυπώνει µηνύµατα αδυναµίας αποθήκευσης πληροφοριών, κάτι που συµβαίνει όµως σπάνια και συνήθως όταν κάνουµε αλόγιστη χρήση της µνήµης. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 3 υναµική έσµευση Μνήµης void *malloc(size): η malloc() επιστρέφει ένα δείκτη στο χώρο µνήµης που δέσµευσε δυναµικά και στον οποίο µπορούµε να αποθηκεύσουµε ένα αντικείµενο µεγέθους size. Η malloc() επιστρέφει NULL όταν η αίτηση δεν µπορεί να ικανοποιηθεί (δηλαδή δεν υπάρχει άλλη διαθέσιµη µνήµη για να δοθεί). Για παράδειγµα η malloc(sizeof(int)) δεσµεύει µνήµη για την αποθήκευση ενός ακεραίου και επιστρέφει ένα δείκτη (τη διεύθυνση δηλαδή) του χώρου µνήµης που δέσµευσε. Επειδή όµως στη C µιλάµε πάντα για δείκτες ενός συγκεκριµένου τύπου πρέπει πάντα να κάνουµε cast τον δείκτη που επιστρέφει η malloc() στον αντίστοιχο τύπο. ηλαδή (int *) malloc(sizeof(int)) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 4 2

υναµική έσµευση Μνήµης (συν) Ετσι κάνοντας τις παρακάτω δηλώσεις και κλήσεις: int *nump; nump = (int *) malloc(sizeof(int)) ; *nump = 17;... free(nump); πετυχαίνουµε να δεσµεύσουµε µνήµη για έναν ακέραιο, να φυλάξουµε τη διεύθυνση της µνήµης αυτής σε έναν δείκτη και τέλος να αποθηκεύσουµε έναν ακέραιο στη µνήµη που δεσµεύσαµε µέσω του δείκτη. Αργότερα σε περίπτωση που δεν χρειαζόµαστε πια άλλο τη µνήµη αυτή µπορούµε (για λόγους οικονοµίας) να την επιστρέψουµε στο σύστηµα. Σηµαντική είναι η χρήση της sizeof(type) η οποία µας επιστρέφει το µέγεθος αντικειµένου τύπου type και µας απελευθερώνει από τη δυσκολία εύρεσης του ποσού µνήµης που απαιτείται για την αποθήκευση ενός αντικειµένου τύπου type. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 5 οµή structure αυτοαναφορικές δοµές Οταν χρησιµοποιούµε δυναµική δέσµευση µνήµης συνήθως το κάνουµε για την αποθήκευση όχι τόσο ακεραίων ή άλλων απλών τύπων δεδοµένων (float, char κλπ.) αλλά αντικειµένων τύπου structure. Αυτό γιατί µπορούµε µέσω αντικειµένων τύπου structure να φτιάξουµε κόµβους, να τους συνδέσουµε µεταξύ τους και να δηµιουργήσουµε έτσι µία συνδεδεµένη λίστα ή άλλες εξελιγµένες δοµές όπως στοίβες, ουρές, λίστες αναµονής, δέντρα κλπ. Ένας απλός ορισµός κόµβου µιας συνδεδεµένης λίστας είναι ο εξής: struct node { int data; struct node *next; }; Προσέξτε ότι ένα πεδίο της δοµής που υλοποιεί τον κόµβο είναι δείκτης στην ίδια δοµή που ορίζεται. Αυτό το φαινόµενο στις δοµές τύπου structure το ονοµάζουµε αυτοαναφορικές δοµές (selfreferential structures). ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 6 3

οµή τύπου structure (συν.) Έχοντας λοιπόν καθορίσει τη µορφή ενός κόµβου µπορούµε να φανταστούµε πως θα είναι µία συνδεδεµένη λίστα µε κόµβους τύπου struct node που ορίσαµε νωρίτερα: head data next data next data next 17 NULL 9 14 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 7 οµή τύπου structure (συν.) Την παραπάνω συνδεδεµένη λίστα θα µπορούσαµε να την υλοποιήσουµε ως εξής: struct node *head, *p1, *p2; head = (struct node *) malloc (sizeof(struct node)); p1 = (struct node *) malloc (sizeof(struct node)); p2 = (struct node *) malloc (sizeof(struct node)); head->data = 17; p1 -> data = 9; p2 -> data = 14; head->next = p1; p1->next = p2; p2->next = NULL; Σηµείωση: οι δείκτες p1 και p2 είναι βοηθητικοί για την υλοποίηση της λίστας. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 8 4

Η δήλωση typedef στη C Η C παρέχει µέσω της δήλωσης typedef τη δηµιουργία νέων ονοµάτων σε τύπους δεδοµένων που ήδη υπάρχουν. Προσοχή: δεν δηµιουργούµε νέους τύπους δεδοµένων. Απλά βαφτίζουµε µε νέα ονόµατα τύπους που ήδη υπάρχουν. Μερικά παραδείγµατα είναι τα εξής: typedef int Akeraios; typedef char *String; typedef struct node NODE; /* το struct node έχει οριστεί νωρίτερα */ Έτσι ορισµοί µεταβλητών µπορούν να υπάρξουν τώρα ως εξής: Akeraios len, I, arr[20]; String p, lineptr[maxlines]; NODE n1, n2, *pn; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 9 Η δήλωση typedef στη C(συν.) Πολλές φορές βαφτίζουµε µία δοµή ταυτόχρονα µε τον ορισµό της, όπως στο παράδειγµα: typedef struct node { int data; struct node *next; } NODE; Είναι καλή συνήθεια να χρησιµοποιούµε ως όνοµα στο typedef το ίδιο όνοµα της δοµής αλλά µε κεφαλαία γράµµατα. Γιατί να χρησιµοπoιούµε τη δήλωση typedef ; 1. Γιατί δηµιουργεί πιο αναγνώσιµο και πιο κατανοητό κώδικα. Το να δηλώσεις NODE *ptr; είναι πιο κατανοητό από το να δηλώσεις ένα δείκτη σε µία πολύπλοκη δοµή (struct node *ptr; ). 2. Ο κώδικας γίνεται πιο λιτός. Π.χ. ptr = (NODE *)malloc(sizeof(node)); 3. Ο κώδικας είναι εύκολα µεταφέρσιµος (portable) µεταξύ µηχανών διαφορετικής αρχιτεκτονικής. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 10 5

Αναπαράσταση Στοίβας ως συνδεδεµένη λίστα Μια στοίβα είναι µια λίστα στοιχείων που συνοδεύεται από τις διαδικασίες push, για εισαγωγή στοιχείου στη λίστα, και pop, για εξαγωγή του τελευταία εισαγµένου στοιχείου της λίστας. Για ευκολία στην διεκπεραίωση των δύο διαδικασιών θα ήταν χρήσιµο, ανά πάσα στιγµή να γνωρίζουµε που βρίσκεται το τέλος της λίστας (και το µέγεθός της). Η νέα εικόνα της στοίβας που θα θέλαµε να έχουµε βασισµένη σε συνδεδεµένη λίστα είναι η παρακάτω: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 11 Αναπαράσταση Στοίβας ως συνδεδεµένη λίστα top size 3 17 9 13 NULL data next data next data next Προσέξτε ότι για την παραπάνω υλοποίηση απαιτείται να καθορίσουµε δύο πράγµατα: 1. Τη µορφή του κόµβου της συνδεδεµένης λίστας και 2. Τη µορφή του κόµβου που κρατά πληροφορίες για τη στοίβα γενικά όπως την κορυφή της στοίβας και το µέγεθός της. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 12 6

Αναπαράσταση Στοίβας (συν.) Συνεπώς απαιτούνται οι παρακάτω δηλώσεις κόµβων: typedef struct node { typedef struct stack { int data; NODE *top; struct node *next; int size; } NODE; } STACK; ως πρώτο βήµα για την υλοποίηση της στοίβας. Οι ορισµοί λοιπόν και οι κλήσεις: STACK stack1; stack1.top = NULL; stack1.size = 0; ορίζουν µία στοίβα τα στοιχεία της οποίας θα κρατούνται στη µεταβλητή stack1 και αρχικοποιούν τα πεδία της ανάλογα. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 13 Αναπαράσταση Στοίβας (συν.) Αυτό που υπολείπεται είναι να οριστούν οι πράξεις push(value, stack) και pop(stack) για κάθε στοίβα stack ως συναρτήσεις στη γλώσσα C, µε τις οποίες συνεχίζουµε. (Μη ξεχνάτε ότι τα typedefs πρέπει να τοποθετηθούν σε ένα αρχείο π.χ. το stack.h ενώ οι παρακάτω συναρτήσεις σε ένα άλλο αρχείο π.χ. το stack.c Όλα αυτά για να πετύχουµε έναν βασικό στόχο που από παλιά θέσαµε: την επαναχρησιµοποίηση του κώδικα, την εύκολη διόρθωσή του και την καλύτερη αναγνωσιµότητά του!) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 14 7

Αναπαράσταση Στοίβας (συν.) void push(int value, STACK *s) { NODE *p; } p = (NODE *)malloc(sizeof(node)); if ( p == NULL ) { printf( System out of memory. Exiting \n); exit(1); } p->data = value; p->next = s->top; s->top = p; (s->size)++; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 15 Αναπαράσταση Στοίβας ως συνδεδεµένη λίστα (συν) int pop(stack *s) { } int value; NODE *p; if ( s->size == 0 ) { printf( Sorry, stack is empty. Exiting \n ); exit(1); } value = (s->top)->data; p = s->top; s->top = p->next; (s->size)--; free(p); return(value); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 16 8

Αναπαράσταση oυράς ως συνδεδεµένη λίστα Μια ουρά είναι µια λίστα στοιχείων που συνοδεύεται από τις διαδικασίες queque, για εισαγωγή στοιχείου στη λίστα, και unqueue, για εξαγωγή του στοιχείου που εισάχθηκε πρώτο στη λίστας. α1 α2... αn-1 αn Για ευκολία στην διεκπεραίωση των δύο διαδικασιών θα ήταν χρήσιµο, ανά πάσα στιγµή να γνωρίζουµε που βρίσκεται η αρχή και το τέλος της λίστας (και το µέγεθός της). Η νέα εικόνα της ουράς που θα θέλαµε να έχουµε βασισµένη σε συνδεδεµένη λίστα είναι η παρακάτω: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 17 Αναπαράσταση Ουράς ως συνδεδεµένη λίστα data next data next data next 17 NULL 9 14 head tail length 3 Παρατηρήστε ότι η µορφή του κόµβου είναι η ίδια και σ αυτό το παράδειγµα µε αυτή της στοίβας. Άρα η δήλωση της δοµής NODE παραµένει η ίδια. Η µορφή όµως του κόµβου που κρατά πληροφορίες για την ουρά αλλάζει και παρουσιάζεται παρακάτω. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 18 9

Αναπαράσταση Ουράς (συν.) Η ουρά λοιπόν θα αναπαρίσταται βάσει της δοµής: typedef struct queue { NODE *head; NODE *tail; int length; } QUEUE; Όταν λοιπόν θελήσουµε να ορίσουµε µία ουρά και να δώσουµε αρχικές τιµές τότε γράφουµε: QUEUE queue1; queue1.head = queue1.tail = NULL; queue1.length = 0; Η επόµενη και πιο δύσκολη δουλειά είναι να ορίσουµε και να υλοποιήσουµε τις πράξεις ουράς, όπως πρόσθεση κόµβου στην αρχή της, διαγραφή κόµβου από το τέλος της κλπ. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 19 Άσκηση Να υλοποιήσετε τις πράξεις ουράς enqueue και dequeue για εισαγωγή κόµβου στην αρχή µιας ουράς και διαγραφή κόµβου από το τέλος µιας ουράς αντίστοιχα. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 20 10