Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΔΕΝΔΡΟ

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΔΕΝΔΡΟ"

Transcript

1 1.1 Εισαγωγή 1. Ο ΑΤΔ ΔΕΝΔΡΟ Μέχρι τώρα είδαμε τις ΑΤΔ Στοίβα, ΑΤΔ Ουρά και τέλος την ΑΤΔ Λίστα η οποία αποτελεί μια γενίκευση των άλλων 2. Γενικά είδαμε δομές που τηρούν την γραμμική ακολουθία των στοιχείων τους που σημαίνει πάντα ότι υπάρχει μόνο ένα επόμενο και μόνο ένα προηγούμενο για κάθε στοιχείο του ΑΤΔ εκτός του πρώτου και του τελευταίου. Σε αυτό το κεφάλαιο θα δούμε τον ΑΤΔ Δένδρο ο οποίος δεν τηρεί την γραμμική ακολουθία αλλά την ιεραρχική. Σε μια ιεραρχική δομική σχέση ένα στοιχείο έχει το πολύ ένα προηγούμενο αλλά μπορεί να έχει πολλά επόμενα. Η ιεραρχική-δενδρική δομή παρατηρείται σε πολλές περιπτώσεις ιεράρχησης ατόμων ή αντικειμένων. Χαρακτηριστικό παράδειγμα αποτελούν συνήθη πρότυπα οργάνωσης και διοίκησης στον επιχειρηματικό κόσμο, όπου «ρίζα» του δέντρου μπορεί να θεωρηθεί ο Γενικός Διευθυντής μιας επιχείρησης οποίος βρίσκεται πάνω από τους διευθυντές των επιμέρους τμημάτων ενώ ακολουθούν οι προϊστάμενοι για να καταλήψουμε στους απλούς υπαλλήλους που αποτελούν τα «φύλλα»-τερματικούς κόμβους του δένδρου. Στον κόσμο της πληροφορικής οι δενδρικές δομές συνηθίζεται κυρίως να χρησιμοποιούνται σε ευρετήρια για ταχύτερη αναζήτηση δεδομένων σε ταξινομημένες Βάσεις Δεδομένων. Κάποιες άλλες από τις γενικές χρήσεις των δενδρικών δομών είναι οι εξής: Γενικά για αναπαράσταση ιεραρχικών δεδομένων Για αναπαράσταση ταξινομημένων λιστών δεδομένων Στην διαδικασία σύνθεσης ψηφιακών εικόνων για την βέλτιστη απόδοση οπτικών αποτελεσμάτων Στους αλγορίθμους δρομολόγησης δικτύων 1.2 Ορισμός Ο ΑΤΔ Δένδρο είναι ένα πεπερασμένο μη κενό σύνολο κόμβων τέτοιο ώστε να ισχύουν τα εξής: Υπάρχει ένας μοναδικός κόμβος που καλείται ρίζα ο οποίος δεν έχει προηγούμενο. Οι υπόλοιποι κόμβοι χωρίζονται σε n>= ξένα μεταξύ τους υποσύνολα Τ1, Τ2,..., ΤΝ, κάθε ένα από τα οποία είναι ένα δέντρο. Τα Τ1, Τ2,..., ΤΝ καλούνται υποδέντρα της ρίζας. Αυτός είναι ο γενικός ορισμός του δέντρου. Επειδή υπάρχουν πολλές κατηγορίες δέντρων διευκρινίζεται ότι σε αυτό το κεφάλαιο παρουσιάζονται υλοποιήσεις και δοκιμές που αφορούν Δυαδικά Δέντρα Αναζήτησης (ΔΔΑ) και AVL Δέντρα Δεδομένα Οι περιορισμοί για ένα ΔΔΑ t είναι οι εξής: όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι μικρότερα (αριθμητικά ή αλφαβητικά) από το περιεχόμενο της ρίζας του t. Δ.Μήλιος 1

2 όλα τα περιεχόμενα στο δεξί υποδέντρο του t είναι μεγαλύτερα (αριθμητικά ή αλφαβητικά) από το περιεχόμενο της ρίζας του t. Το δεξί και το αριστερό υποδέντρο του t είναι και αυτά ΔΔΑ. Οι περιορισμοί για ένα AVL δέντρο είναι οι εξής: Ένα AVL δέντρο είναι ένα ισοζυγισμένο κατά ύψος 1-δέντρο. Για κάθε κόμβο ενός AVL δέντρου ισχύει h L -h R <=1 όπου h L και h R είναι τα ύψη του δεξιού και αριστερού υποδέντρου αντίστοιχα. Σε κάθε κόμβο του του AVL δέντρου αντιστοιχεί ο παράγων ισοζύγισης, ο οποίος είναι αριστερά υψηλός, ίσος ή δεξιά υψηλός ανάλογα με το αν το αριστερό υποδέντρο έχει μεγαλύτερο, ίσο ή μικρότερο ύψος από το δεξί υποδέντρο αντίστοιχα Πράξεις Όπου υπάρχει η φράση «τρέχοντας δείκτης» διευκρινίζεται ότι αφορά τόσο την θέση ενός κόμβου σε υλοποιήσεις με πίνακα όσο και σε υλοποιήσεις με χρήση δεικτών. Οι βασικές πράξεις του ΔΔΑ είναι: Tree_dimioyrgia: δημιουργεί ένα κενό δένδρο. Tree_katastrofi: καταστρέφει ένα δένδρο. Tree_keno: ελέγχει αν το δένδρο είναι κενό. Tree_eisagogi: εισάγει ένα νέο στοιχείο στο δένδρο, στην θέση που πρέπει για να διατηρηθεί η ιδιότητα του ΔΔΑ, εκτός και αν υπάρχει ήδη το στοιχείο ή δεν έγινε για κάποιο λόγο η δέσμευση κόμβου (υλοποιήσεις με χρήση δείκτη) ή η θέση του στοιχείου έχει την ειδική τιμή not_spec-μη έγκυρη τιμή (υλοποιήσεις με απλό πίνακα) Tree_diagrafi: διαγράφει ένα στοιχείο από το δένδρο, εκτός και αν το στοιχείο που έχει δοθεί για να διαγραφεί δεν υπάρχει. Tree_apaidi: μετακινεί τον τρέχοντα δείκτη στον κόμβο που αντιπροσωπεύει το αριστερό παιδί του κόμβου που δείχνει ο δείκτης, εκτός και αν ο δείκτης είναι εκτός ορίωνή έχει μη έγκυρη τιμή (για υλοποιήσεις με πίνακα) ή δεν δείχνει κάπου (για υλοποιήσεις με χρήση δεικτών). Tree_dpaidi: μετακινεί τον τρέχοντα δείκτη στον κόμβο που αντιπροσωπεύει το δεξί παιδί του κόμβου που δείχνει ο δείκτης, οι εναλλακτικές σε περίπτωση λάθους είναι οι ίδιες με της Tree_apaidi. Tree_pateras: μετακινεί τον τρέχοντα δείκτη στον κόμβο που αντιπροσωπεύει τον πατέρα του κόμβου που δείχνει ο τρέχοντας δείκτης, εκτός και αν ο τρέχοντας δείκτης δείχνει στην ρίζα ή έχει μη έγκυρη τιμή ή είναι εκτός ορίων (για υλοποιήσεις με πίνακα) ή δεν δείχνει κάπου (για υλοποιήσεις με χρήση δεικτών). Tree_anazitisi: ψάχνει το δένδρο για το στοιχείο που ζητήθηκε από τον χρήστη και επιστρέφει τον δείκτη στην θέση του στοιχείου αυτού, εκτός και αν το στοιχείο δεν υπάρχει στο δένδρο ή ο τρέχοντας δείκτης δεν δείχνει στο δένδρο άρα η αναζήτηση θεωρείται άκυρη. Tree_allagi: αντικαθιστά ένα στοιχείο στο δένδρο με ένα νέο διατηρώντας την ιδιότητα του ΔΔΑ, εκτός και αν δεν υπάρχει το στοιχείο αυτό στο δένδρο. Δ.Μήλιος 2

3 Tree_periexomeno: επιστρέφει το περιεχόμενο του κόμβου στον οποίο βρίσκεται ο τρέχοντας δείκτης, εκτός και αν δείκτης δείχνει εκτός ορίων (για υλοποιήσεις με πίνακα) ή δεν δείχνει κάπου (για υλοποιήσεις με χρήση δεικτών). Οι βασικές πράξεις του AVL δένδρου είναι: AVLTree_dimioyrgia: δημιουργεί ένα κενό δένδρο. AVLTree_katastrofi: καταστρέφει ένα δένδρο. AVLTree_keno: ελέγχει αν το δένδρο είναι κενό. AVLTree_eisagogi: εισάγει ένα νέο στοιχείο στο δένδρο, στην θέση που πρέπει για να διατηρηθεί η ιδιότητα του AVL, εκτός και αν το στοιχείο υπάρχει ήδη ή υπάρχει αδυναμία δέσμευσης κόμβου. AVLTree_diagrafi: διαγράφει ένα στοιχείο από το δένδρο, εκτός και αν το στοιχείο δεν υπάρχει στο δέντρο ή το δέντρο είναι κενό. AVLTree_apaidi: μετακινεί τον τρέχοντα δείκτη στον κόμβο που αντιπροσωπεύει το αριστερό παιδί του κόμβου που δείχνει ο δείκτης, εκτός και αν ο τρέχοντας δείκτης δεν δείχνει κάπου. AVLTree_dpaidi: μετακινεί τον δείκτη στον κόμβο που αντιπροσωπεύει το δεξί παιδί του κόμβου που δείχνει ο δείκτης, εκτός και αν ο τρέχοντας δείκτης δεν δείχνει κάπου. AVLTree_pateras: μετακινεί τον τρέχοντα δείκτη στον κόμβο που αντιπροσωπεύει τον πατέρα του κόμβου που δείχνει ο τρέχοντας δείκτης, εκτός και αν ο τρέχοντας δείκτης δείχνει στην ρίζα ή το δέντρο είναι κενό ή ο τρέχοντας δείκτης δεν δείχνει κάπου. AVLTree_anazitisi: ψάχνει το δένδρο για το στοιχείο που ζητήθηκε από τον χρήστη και επιστρέφει τον τρέχοντα δείκτη στην θέση του στοιχείου αυτού, εκτός και αν το στοιχείο δεν βρεθεί ή το δένδρο είναι κενό. AVLTree_allagi: αντικαθιστά ένα στοιχείο στο δένδρο με ένα νέο διατηρώντας την ιδιότητα του AVL, εκτός και αν δεν υπάρχει αυτό το στοιχείο στο δένδρο. AVLTree_periexomeno: επιστρέφει το περιεχόμενο του κόμβου στον οποίο βρίσκεται ο δείκτης, εκτός και αν ο δείκτης δεν δείχνει κάπου. 1.3 Υλοποιήσεις Στις επόμενες υποενότητες ακολουθεί η ανάλυση των 2 υλοποίησεων (ΔΔΑ, AVL) Υλοποίηση 1 η : Υλοποίηση με δυαδικό δέντρο αναζήτησης Καταρχάς να διευκρινιστεί ότι ένα δυαδικό δέντρο αναζήτησης αποτελεί υποκατηγορία ενός δυαδικού δέντρου. Ένα δυαδικό δένδρο ορίζεται ως ένα πεπερασμένο σύνολο κόμβων το οποίο είτε είναι κενό ή: Υπάρχει ένας ειδικός κόμβος που καλείται ρίζα και Οι υπόλοιποι κόμβοι χωρίζονται σε 2 ξένα μεταξύ τους υποσύνολα, Α και Δ, κάθε ένα από τα οποία είναι ένα δυαδικό δέντρο. Το Α είναι το αριστερό υποδέντρο της ρίζας και το Δ είναι το δεξί υποδέντρο της ρίζας. Επιπρόσθετα σε αυτά λοιπόν για ένα δυαδικό δένδρο αναζήτησης (ΔΔΑ) t ισχύουν τα εξής: Δ.Μήλιος 3

4 όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι μικρότερα (αριθμητικά ή αλφαβητικά) από το περιεχόμενο της ρίζας του t. όλα τα περιεχόμενα στο δεξί υποδέντρο του t είναι μεγαλύτερα (αριθμητικά ή αλφαβητικά) από το περιεχόμενο της ρίζας του t. Το δεξί και το αριστερό υποδέντρο του t είναι και αυτά ΔΔΑ. Το ΔΔΑ έχει υλοποιηθεί με χρήση πίνακα ακολουθιακά και μη και με χρήση δεικτών. Σε κάθε υλοποίηση παρουσιάζονται 2 περιπτώσεις, αναδρομικής ή επαναληπτικής συμπεριφοράς των πράξεων του ΑΤΔ Υλοποίηση ακολουθιακά ΑΤΔ δέντρου αναζήτησης με πίνακα Στην συγκεκριμένη υλοποίηση γίνεται χρήση Μερικής Απόκρυψης. Η αναπαράσταση του δέντρου γίνεται από έναν πίνακα σταθερού μήκους που δέχεται τα δεδομένα της δομής. Η δομή περιλαμβάνει μια μεταβλητή τύπου στοιχείου δέντρου που δέχεται τα δεδομένα του κόμβου, καθώς και μια μεταβλητή ακεραίου που δηλώνει αν ο κόμβος είναι έγκυρος, αν δηλαδή υπάρχει στο δέντρο μας την δεδομένη στιγμή. Τα στοιχεία του δέντρου στην συγκεκριμένη υλοποίηση έχουν συγκεκριμένη θέση στον πίνακα, οπότε ανάλογα με την θέση αυτή μπορούμε να ξέρουμε ανά πάσα στιγμή σε ποιο κόμβο αναφερόμαστε διαχειριζόμενοι το δένδρο. Η ρίζα βρίσκεται πάντα στην πρώτη θέση του πίνακα, και από κει και πέρα μπορούμε να βρούμε οποιοδήποτε κόμβο δεδομένου ότι κάθε αριστερό παιδί βρίσκεται στη θέση 2* (x+1) -1 και κάθε δεξί παιδί στην θέση 2* (x+1), αν x η θέση του πατέρα Υλοποίηση ακολουθιακά ΑΤΔ δέντρου αναζήτησης με πίνακα με επανάληψη Αρχεία Διεπαφής-Υλοποίησης Στο αρχείο Διεπαφής δηλώνεται η δομή του δέντρου που αναλύεται πιο πάνω και οι συναρτήσεις, αλλά κυρίως εντοπίζεται το include του τύπου στοιχείου δέντρου το οποίο δεν περιλαμβάνει συγκεκριμένο μονοπάτι που να προσδιορίζει το αρχείο του τύπου στοιχείου δένδρου αλλά περιγράφει τον ρόλο του συγκεκριμένου include. Τέλος δηλώνεται και ο μέγιστος αριθμός στοιχείων του δέντρου. Ακολουθεί ο κώδικας του αρχείου Διεπαφής: #ifndef BST_SEQARRAY_ITERATIVE #define BST_SEQARRAY_ITERATIVE #include "to antistoixo.h typou stoixeiou" /*edo analoga tin efarmogi i to test tou tipou stoixeiou mpainei to antoistixo.h tou tipou stoixeiou */ #define PLITHOS 100 /*diloseis tipon*/ Δ.Μήλιος 4

5 typedef struct typos_komboy { TStoixeioyTree dedomena; int egkyro; typos_komboy; typedef typos_komboy typos_dentroy[plithos]; /*diloseis synarthseon*/ /*dimiourgia/katastrofi dentrou*/ void Tree_dimiourgia(typos_dentroy tree); void Tree_katastrofi(typos_dentroy tree); /*Prakseis elegxou*/ int Tree_keno(typos_dentroy tree); /*Prakseis prosvasis */ void Tree_apaidi(typos_dentroy tree, int pateras, int *paidi, int *error); void Tree_dpaidi(typos_dentroy tree, int pateras, int *paidi, int *error); void Tree_pateras(typos_dentroy tree, int paidi, int *pateras, int *error); /*Prakseis diaxeirisis */ void Tree_eisagogi(typos_dentroy tree, TStoixeioyTree stoixeio, int *error); void Tree_diagrafi(typos_dentroy tree, TStoixeioyTree stoixeio, int *error); /*Prakseis anazitisis*/ void Tree_anazitisi(typos_dentroy tree, TStoixeioyTree stoixeio, int *thesi, int *found); void Tree_periexomeno(typos_dentroy tree, int thesi, TStoixeioyTree *stoixeio,int * error); void Tree_allagi(typos_dentroy tree, TStoixeioyTree old, TStoixeioyTree new, int *error); Ακολουθεί ο κώδικας του αρχείου Υλοποίησης: #include <stdio.h> #include <stdlib.h> #include "BST_SeqArray-Iterative.h" #include <math.h> Δ.Μήλιος 5

6 void Tree_dimiourgia(typos_dentroy tree) {/* Pro: kamia * Meta: Dimiourgia enos diadikou dentrou anazitisis */ int i; for(i=0;i<plithos;i++) tree[i].egkyro=0; void Tree_katastrofi(typos_dentroy tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi olon ton kombon tou dentrou */ Tree_dimiourgia(tree); int Tree_keno(typos_dentroy tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei 1 an to dentro einai keno,diaforetika 0*/ return!tree[0].egkyro; Δ.Μήλιος 6

7 void Tree_apaidi(typos_dentroy tree, int pateras, int *paidi, int *error) {/* Pro: o pateras deixnei ena kombo se duadiko dentro anazitisis * Meta: epistrefei to aristero paidi pou deixnei o pateras */ int temp; if(pateras==-1) { return; if(tree[pateras].egkyro==0) { return; temp=2*(pateras+1)-1; if(temp<plithos) { *paidi=temp; if(tree[*paidi].egkyro==0) Δ.Μήλιος 7

8 void Tree_dpaidi(typos_dentroy tree, int pateras, int *paidi, int *error) {/* Pro: o pateras deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei to deksi paidi pou deixnei o pateras */ int temp; if(pateras==-1) { return; if(tree[pateras].egkyro==0) { return; temp=2*(pateras+1); if(temp<plithos) { *paidi=temp; if(tree[*paidi].egkyro==0) void Tree_pateras(typos_dentroy tree, int paidi, int *pateras, int *error) {/* Pro: to paidi deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei ton patera ston "pateras" tou kombou pou deixnei to paidi*/ int temp; if(0<paidi) { if(tree[paidi].egkyro==0) { return; *pateras=floor((paidi+1)/2)-1; Δ.Μήλιος 8

9 void Tree_eisagogi(typos_dentroy tree, TStoixeioyTree stoixeio, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Eisagogi tou kombou sto dentro efoson autos den iparxei idi */ int thesi,error2; thesi=error2=*error=0; while(tree[thesi].egkyro==1) { if(tstree_iso(stoixeio, tree[thesi].dedomena)) { return; if(tstree_mikrotero(stoixeio, tree[thesi].dedomena)) Tree_apaidi(tree, thesi, &thesi,&error2); Tree_dpaidi(tree, thesi, &thesi,&error2); TStree_setValue(&(tree[thesi].dedomena), stoixeio); tree[thesi].egkyro=1; Δ.Μήλιος 9

10 void Tree_diagrafi(typos_dentroy tree, TStoixeioyTree stoixeio, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi tou kombou me periexomeno "stoixeio" */ int thesi, found, pateras, apaidi, dpaidi, next, ypodentro, error1, error2, i, j, stoixeia, check; thesi=found=apaidi=dpaidi=error1=error2=ypodentro=0; Tree_anazitisi(tree, stoixeio, &thesi, &found); if(found) { Tree_dpaidi(tree, thesi, &dpaidi, &error2); Tree_apaidi(tree, thesi, &apaidi, &error1); if((!tree[apaidi].egkyro error1) && (!tree[dpaidi].egkyro error2))//den iparxoun paidia { tree[thesi].egkyro=0; return; if(tree[apaidi].egkyro && tree[dpaidi].egkyro &&!error1 &&!error2) //an iparxoun kai ta 2 paidia { next=dpaidi; pateras=thesi; Tree_apaidi(tree, next, &apaidi, &error1); while(tree[apaidi].egkyro &&!error1) { pateras=next; next=apaidi; Tree_apaidi(tree, next, &apaidi, &error1); TStree_setValue(&(tree[thesi].dedomena), tree[next].dedomena); thesi=next; Tree_apaidi(tree, thesi, &apaidi, &error1); ypodentro=dpaidi; if(!tree[ypodentro].egkyro error2) ypodentro=apaidi; if(ypodentro==apaidi) check=1; if(ypodentro==dpaidi) check=0; ypodentro=thesi; error1=0; i=0; while(!error1) { error1=0; if(check) Δ.Μήλιος 10

11 Tree_apaidi(tree, ypodentro, &apaidi, &error1); Tree_dpaidi(tree, ypodentro, &dpaidi, &error1); stoixeia=pow(2, i); j=0; while((j<stoixeia)&&(apaidi+j<plithos)&&(dpaidistoixeia+j+1<plithos)&&(!error1)) { if(check)//dpaidi ypodentro {TStree_setValue(&(tree[ypodentro+j].dedomena), tree[apaidi+j].dedomena); tree[ypodentro+j].egkyro=tree[apaidi+j].egkyro; //apaidi ypodentro { TStree_setValue(&(tree[ypodentro-stoixeia+j+1].dedomena), tree[dpaidi-stoixeia+j+1].dedomena); tree[ypodentrostoixeia+j+1].egkyro=tree[dpaidistoixeia+j+1].egkyro; j++; if((apaidi+j>=plithos) (dpaidi-stoixeia+j+1>=plithos)) error1=1; i++; if(check) ypodentro=apaidi; ypodentro=dpaidi; /*found */ Δ.Μήλιος 11

12 void Tree_anazitisi(typos_dentroy tree, TStoixeioyTree stoixeio, int *thesi, int *found) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei tin thesi tou kombou pou periexei to "stoixeio" */ int temp, error; error=temp=0; *found=0; while((tree[temp].egkyro==1) &&!error) { if(tstree_iso(stoixeio, tree[temp].dedomena)) { *thesi=temp; *found=1; return; if(tstree_mikrotero(stoixeio, tree[temp].dedomena)) Tree_apaidi(tree, temp, &temp, &error); Tree_dpaidi(tree, temp, &temp, &error); void Tree_periexomeno(typos_dentroy tree, int thesi, TStoixeioyTree *stoixeio,int * error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Epistrefei sto "stoixeio" tin timi ton dedomenon pou iparxoun ston kombo * pou deixnei i "thesi" */ *error=0; if(thesi==-1) { return; if(tree[thesi].egkyro==1) TStree_setValue(stoixeio, tree[thesi].dedomena); Δ.Μήλιος 12

13 void Tree_allagi(typos_dentroy tree, TStoixeioyTree old, TStoixeioyTree new, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Enimenronei ton kombo pou exei tin timi old allazontas tin timi se new */ int thesi, found; *error=thesi=found=0; Tree_anazitisi(tree, old, &thesi, &found); if(found) { Tree_diagrafi(tree, old, error); Tree_eisagogi(tree, new, error); Αρχεία Δοκιμής Στα αρχεία δοκιμής περιλαμβάνεται το αρχείο main που χρησιμοποιείται ως αρχείο test για τις πράξεις του ΔΔΑ. Πρέπει να διευκρινιστεί εδώ πως στα αρχεία-main που χρησιμοποιούνται στα δένδρα έχουν προστεθεί οι εξής συναρτήσεις: episkepsi, riza, prodiataksi, endodiataksi, metadiataksi. Η episkepsi εκτυπώνει τα περιεχόμενα του κόμβου του οποίου τον δείκτη παίρνει παράμετρο. Η riza ουσιαστικά επιστρέφει τον τρέχον δείκτη της δοκιμής-test στον κόμβο ρίζα του δέντρου, η συγκεκριμένη συνάρτηση καλείται σε μια από τις επιλογές του χρήστη ως πράξη δένδρου παρ ότι δεν δηλώνεται στο αντίστοιχο αρχείο Υλοποίησης καθώς είναι συνάρτηση-πράξη που εξυπηρετεί μόνο την συγκεκριμένη εφαρμογή. Οι άλλες 3 ουσιαστικά εξαρτώνται πολύ από τον τρόπο υλοποίησης του δένδρου. Επειδή συγκεκριμένα εδώ αναλύουμε την υλοποίηση με επανάληψη για να υλοποιηθούν οι 3 αυτές συναρτήσεις (prodiataksi, endodiataksi, metadiataksi) πρέπει να κάνουν χρήση του ΑΤΔ Στοίβα με Ολική Απόκρυψη που είδαμε στο 3 ο κεφάλαιο. Συνεπώς στα αρχεία Δοκιμής περιλαμβάνονται και τα αρχεία Διεπαφής-Υλοποίησης της στοίβας με Ολική Απόκρυψη (για τον κώδικα τους ανατρέξτε στο 3 ο κεφάλαιο στην ενότητα Υλοποιήση με Ολική Απόκρυψη Αρχεία Διεπαφής- Υλοποίησης), τα αρχεία Διεπαφής-Υλοποίησης του τύπου στοιχείου δένδρου (για τον κώδικα τους ανατρέξτε στο 3 ο κεφάλαιο στην ενότητα ) και τέλος τα αρχεία Διεπαφής-Υλοποίησης, εκτός πάντα του path για τον τύπο στοιχείου, ίδια με τα πρότυπα αρχεία. Ακολουθεί ο κώδικας του αρχείου δοκιμής: #include <stdio.h> #include "Stack-OA.h" #include "TStoixeioyStoivas.h" #include "BST_SeqArray-Iterative.h" Δ.Μήλιος 13

14 #include "../../../../TS/TStoixeioyTree.h" void print_options(void); void episkepsi(typos_dentroy tree, int thesi); int riza(); void endodiataksi(typos_dentroy tree); void prodiataksi(typos_dentroy tree); void metadiataksi(typos_dentroy tree); int main(void) { int option, error, found, cur,created,out_err; typos_dentroy tree; TStoixeioyTree x, x1; created=0; cur=-1; do{ printf("\n\no kersoras brisketai sth 8esh %d\n", cur); error=0; print_options(); scanf("%d", &option); switch(option) {case 1: Tree_dimiourgia(tree); created=1; printf("\nto dentro dimiourgithike!\n"); case 2: { printf("\nden uparxei dentro gia na eisaxthei stoixeio!\n"); printf("dwse ena stoixeio gia eisagwgh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_eisagogi(tree, x, &error); if(error) printf("\nerror! Paidi ektos oriwn pinaka 'h stoixeio yparxei hdh!\n"); Δ.Μήλιος 14

15 printf("to stoixeio eishx8h!\n"); case 3: { printf("\nden uparxei dentro gia na diagrafei stoixeio!\n"); printf("dwse ena stoixeio gia diagrafh apo to dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_diagrafi(tree, x, &error); if(error) printf("\nerror! To stoixeio den yparxei sto dentro!\n"); printf("to stoixeio diagrafhke!\n"); case 4: { printf("\nden uparxei dentro gia na elegxthei an einai keno!\n"); if(tree_keno(tree)) printf("\nto dentro einai keno!\n"); printf("\nto dentro DEN einai keno!\n"); case 5: { printf("\nden uparxei dentro gia na anazithithei stoixeio tou!\n"); printf("dwse ena stoixeio gia anazhthsh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Δ.Μήλιος 15

16 Tree_anazitisi(tree, x, &cur, &found); if(found) case 6: printf("\nto stoixeio bre8hke!\n"); printf("\nto stoixeio DEN bre8hke!\n"); { printf("\nden uparxei dentro gia na epistrafei to periexomeno enos komboy tou!\n"); Tree_periexomeno(tree, cur, &x,&error); if(error) printf("\nerror! O deiktis einai NULL!\n"); { printf("\nto periexomeno toy komboy einai "); case 7: out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); { printf("\nden uparxei dentro gia na allaxthei to periexomeno enos komboy tou!\n"); printf("dwse to stoixeio poy 8es na allaksei: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); printf("dwse to stoixeio poy 8es na eisageis sth thesh tou "); out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); Δ.Μήλιος 16

17 out_err=tstree_readvalue(stdin,&x1); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_allagi(tree, x, x1, &error); if(error) 3anaprospa8hste!\n"); printf("\nerror! Sthn eisagwgh 'h diagrafh twn stoixeiwn.\ Δ.Μήλιος 17 Elegkste ta stoixeia kai to dentro kai printf("\nh allagh egine!\n"); case 8: { printf("\nden uparxei dentro gia na metakinithei o dromeas sto aristero paidi tou trexonta!\n"); Tree_apaidi(tree, cur, &cur, &error); if(error) { printf("\nerror! Paidi ektos oriwn pinaka 'h kersoras se mh egkyrh thesh 'h den yparxei aristero paidi!\n"); case 9: cur=riza(); printf("\no kersoras allakse!\n"); { printf("\nden uparxei dentro gia na metakinithei o dromeas sto deksi paidi tou trexonta!\n"); Tree_dpaidi(tree, cur, &cur, &error); if(error) { printf("\nerror! Paidi ektos oriwn pinaka 'h kersoras se mh egkyrh thesh 'h den yparxei deksi paidi!\n"); cur=riza(); printf("\no kersoras allakse!\n"); case 10:

18 { printf("\nden uparxei dentro gia na metakinithei o dromeas ston patera tou trexonta!\n"); thesh!\n"); Tree_pateras(tree, cur, &cur, &error); if(error) case 11: printf("\nerror! O kersoras brisketai sth riza 'h se mh egkyrh printf("\no kersoras allakse!\n"); { printf("\nden uparxei dentro gia na metakinithei o dromeas sti riza tou dentrou!\n"); cur=riza(); printf("o deiktis deixnei stin riza!\n"); case 12: { printf("\nden uparxei dentro gia na katastrafei!\n"); Tree_katastrofi(tree); created=0; printf("\nto dentro katastrafike!\n"); case 13: { printf("\nden uparxei dentro gia na ginei endodiataksi!\n"); printf("\nendodiataksi!\n"); endodiataksi(tree); case 14: { printf("\nden uparxei dentro gia na ginei prodiataksi!\n"); Δ.Μήλιος 18

19 printf("\nprodiataksi!\n"); prodiataksi(tree); case 15: { printf("\nden uparxei dentro gia na ginei metadiataksi!\n"); printf("\nmetadiataksi!\n"); metadiataksi(tree); while(option); return 0; void print_options(void) { printf("\n1. Dhmioyrgia dentroy\n\ 2. Eisagwgh stoixeioy sto dentro\n\ 3. Diagrafh stoixeioy apo to dentro\n\ 4. Elegxos gia keno dentro\n\ 5. Anazhthsh stoixeioy sto dentro\n\ 6. Epistrofh periexomenoy enos komboy\n\ 7. Allagh toy periexomenoy enos komboy\n\ 8. Metakinhsh toy dromea sto aristero paidi\n\ 9. Metakinhsh toy dromea sto deksi paidi\n\ 10.Metakinhsh toy dromea ston patera\n\ 11.Metakinhsh toy dromea stin riza\n\ 12.Katastrofh dentroy\n\ 13.Endodiatetagmenh diadromh\n\ 14.Prodiatetagmenh diadromh\n\ 15.Metadiatetagmenh diadromh\n\n\ Dwste thn epilogh sas(1-15, 0 gia eksodo):"); void episkepsi(typos_dentroy tree, int thesi) { int error; TStoixeioyTree x; Tree_periexomeno(tree, thesi, &x,&error); TStree_writeValue(stdout,x); Δ.Μήλιος 19

20 int riza() { return 0; void endodiataksi(typos_dentroy tree) { HandleStoivas stoiva; int error, cur; stoiva=stoiva_constructor(); error=cur=0; do { while(tree[cur].egkyro) { Stoiva_othisi(stoiva, cur, &error); Tree_apaidi(tree, cur, &cur, &error); if(!stoiva_keni(stoiva)) { Stoiva_exagogi(stoiva, &cur, &error); episkepsi(tree, cur); Tree_dpaidi(tree, cur, &cur, &error); while((!stoiva_keni(stoiva)) (tree[cur].egkyro)); Stoiva_Destructor(&stoiva); void prodiataksi(typos_dentroy tree) { HandleStoivas stoiva; int error, cur, temp, last; stoiva=stoiva_constructor(); temp=last=error=cur=0; do { while(tree[cur].egkyro) { episkepsi(tree, cur); Stoiva_othisi(stoiva, cur, &error); Tree_apaidi(tree, cur, &cur, &error); while(!stoiva_keni(stoiva)) { last=cur; Stoiva_exagogi(stoiva, &cur, &error); Tree_dpaidi(tree, cur, &temp, &error); Δ.Μήλιος 20

21 if((tree[temp].egkyro)&&(temp!=last)) { Stoiva_othisi(stoiva, cur, &error); cur=temp; while(!((cur==0)&&(temp==last)) && (!Stoiva_keni(stoiva))); Stoiva_Destructor(&stoiva); void metadiataksi(typos_dentroy tree) { HandleStoivas stoiva; int error, cur, temp, last; stoiva=stoiva_constructor(); temp=last=error=cur=0; do { while(tree[cur].egkyro) { Stoiva_othisi(stoiva, cur, &error); Tree_apaidi(tree, cur, &cur, &error); while(!stoiva_keni(stoiva)) { last=cur; Stoiva_exagogi(stoiva, &cur, &error); Tree_dpaidi(tree, cur, &temp, &error); if((!tree[temp].egkyro) ((tree[temp].egkyro)&&(temp==last))) episkepsi(tree, cur); { Stoiva_othisi(stoiva, cur, &error); cur=temp; while(!stoiva_keni(stoiva)); Stoiva_Destructor(&stoiva); Δ.Μήλιος 21

22 Υλοποίηση ακολουθιακά ΑΤΔ δέντρου αναζήτησης με πίνακα με αναδρομή Αρχεία Διεπαφής-Υλοποίησης Στο αρχείο Διεπαφής δηλώνεται η δομή του δέντρου που αναλύεται πιο πάνω και οι συναρτήσεις, αλλά κυρίως εντοπίζεται το include του τύπου στοιχείου δέντρου το οποίο δεν περιλαμβάνει συγκεκριμένο μονοπάτι που να προσδιορίζει το αρχείο του τύπου στοιχείου δένδρου αλλά περιγράφει τον ρόλο του συγκεκριμένου include. Τέλος δηλώνεται και ο μέγιστος αριθμός στοιχείων του δέντρου. Ακολουθεί ο κώδικας του αρχείου Διεπαφής: #ifndef BST_SEQARRAY_RECURSIVE #define BST_SEQARRAY RECURSIVE_ #include "to antistoixo.h typou stoixeiou" /*edo analoga tin efarmogi i to test tou tipou stoixeiou mpainei to antoistixo.h tou tipou stoixeiou */ #define PLITHOS 100 /*diloseis tipon*/ typedef struct typos_komboy { TStoixeioyTree dedomena; int egkyro; typos_komboy; typedef typos_komboy typos_dentroy[plithos]; /*diloseis synarthseon*/ /*dimiourgia/katastrofi dentrou*/ void Tree_dimiourgia(typos_dentroy tree); void Tree_katastrofi(typos_dentroy tree); /*Prakseis elegxou*/ int Tree_keno(typos_dentroy tree); /*Prakseis prosvasis*/ void Tree_apaidi(typos_dentroy tree, int pateras, int *paidi, int *error); void Tree_dpaidi(typos_dentroy tree, int pateras, int *paidi, int *error); void Tree_pateras(typos_dentroy tree, int paidi, int *pateras, int *error); Δ.Μήλιος 22

23 /*Prakseis diaxeirisis */ void Tree_eisagogi(typos_dentroy tree, TStoixeioyTree stoixeio, int riza, int *error); void Tree_diagrafi(typos_dentroy tree, TStoixeioyTree stoixeio, int riza, int *error); /*Prakseis anazitisis*/ void Tree_anazitisi(typos_dentroy tree, TStoixeioyTree stoixeio, int riza, int *thesi, int *found); void Tree_periexomeno(typos_dentroy tree, int thesi, TStoixeioyTree *stoixeio,int *error); void Tree_allagi(typos_dentroy tree, TStoixeioyTree old, TStoixeioyTree new, int *error); #endif /*#ifndef BST_SEQARRAY RECURSIVE */ Ακολουθεί ο κώδικας του αρχείου Υλοποίησης: #include <stdio.h> #include <stdlib.h> #include "BST_SeqArray-Recursive.h" #include <math.h> void Tree_dimiourgia(typos_dentroy tree) {/* Pro: kamia * Meta: Dimiourgia enos diadikou dentrou anazitisis*/ int i; for(i=0;i<plithos;i++) tree[i].egkyro=0; void Tree_katastrofi(typos_dentroy tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi olon ton kombon tou dentrou */ Tree_dimiourgia(tree); int Tree_keno(typos_dentroy tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei 1 an to dentro einai keno,diaforetika 0 */ return!tree[0].egkyro; void Tree_apaidi(typos_dentroy tree, int pateras, int *paidi, int *error) Δ.Μήλιος 23

24 {/* Pro: o pateras deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei to aristero paidi pou deixnei o pateras */ int temp; if(pateras==-1) { return; if(tree[pateras].egkyro==0) { return; temp=2*(pateras+1)-1; if(temp<plithos) { *paidi=temp; if(tree[*paidi].egkyro==0) Δ.Μήλιος 24

25 void Tree_dpaidi(typos_dentroy tree, int pateras, int *paidi, int *error) {/* Pro: o pateras deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei to deksi paidi pou deixnei o "pateras" */ int temp; if(pateras==-1) { return; if(tree[pateras].egkyro==0) { return; temp=2*(pateras+1); if(temp<plithos) { *paidi=temp; if(tree[*paidi].egkyro==0) void Tree_pateras(typos_dentroy tree, int paidi, int *pateras, int *error) {/* Pro: to paidi deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei ton patera ston "pateras" tou kombou pou deixnei to "paidi" */ int temp; if(0<paidi) { if(tree[paidi].egkyro==0) { return; *pateras=floor((paidi+1)/2)-1; Δ.Μήλιος 25

26 void Tree_eisagogi(typos_dentroy tree, TStoixeioyTree stoixeio, int thesi, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Eisagogi tou kombou sto dentro efoson autos den iparxei idi */ int error2=0; if(tree[thesi].egkyro==0) { TStree_setValue(&(tree[thesi].dedomena), stoixeio); tree[thesi].egkyro=1; { if(tstree_iso(stoixeio, tree[thesi].dedomena)) { return; if(tstree_mikrotero(stoixeio, tree[thesi].dedomena)) Tree_apaidi(tree, thesi, &thesi, error2); Tree_dpaidi(tree, thesi, &thesi,&error2); Tree_eisagogi(tree, stoixeio, thesi,error); Δ.Μήλιος 26

27 void Tree_diagrafi(typos_dentroy tree, TStoixeioyTree stoixeio, int thesi, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi tou kombou me periexomeno "stoixeio" */ int found, pateras, apaidi, dpaidi, next, ypodentro, error1, error2, i, j, stoixeia, check,out_err; found=apaidi=dpaidi=error1=error2=ypodentro=0; if(tree[thesi].egkyro) { Tree_apaidi(tree, thesi, &apaidi, &error1); Tree_dpaidi(tree, thesi, &dpaidi, &error2); if(tstree_iso(stoixeio, tree[thesi].dedomena)) { if((!tree[apaidi].egkyro error1) && (!tree[dpaidi].egkyro error2)) //an den iparxoun paidia { tree[thesi].egkyro=0; return; if((!tree[apaidi].egkyro) error1) //an iparxei dpaidi mono { error1=0; i=0; ypodentro=thesi; while(!error1) { stoixeia=pow(2, i); j=0; Δ.Μήλιος 27 Tree_apaidi(tree, ypodentro, &apaidi, &error1); while((j<stoixeia)&&(apaidi+j<plithos)&&(!error1)) { TStree_setValue(&(tree[ypodentro+j].dedomena), tree[apaidi+j].dedomena); mono tree[ypodentro+j].egkyro=tree[apaidi+j].egkyro; j++; if(apaidi+j>=plithos) i++; error1=1; ypodentro=apaidi; if((!tree[dpaidi].egkyro) error2) //an iparxei apaidi { error2=0; i=0; ypodentro=thesi;

28 while(!error2) { stoixeia=pow(2, i); j=0; Tree_dpaidi(tree, ypodentro, &dpaidi, &error2); while((j<stoixeia)&&(dpaidistoixeia+j+1<plithos)&&(!error2)) {TStree_setValue(&(tree[ypodentrostoixeia+j+1].dedomena), tree[dpaidi-stoixeia+j+1].dedomena); tree[ypodentro-stoixeia+j+1].egkyro=tree[dpaidi-stoixeia+j+1].egkyro; j++; if(dpaidi-stoixeia+j+1>=plithos) i++; error2=1; ypodentro=dpaidi; //an iparxoun kai ta 2 paidia { next=dpaidi; Tree_apaidi(tree, next, &apaidi, &error1); while(tree[apaidi].egkyro &&!error1) { next=apaidi; Tree_apaidi(tree, next, &apaidi, &error1); TStree_setValue(&(tree[thesi].dedomena), tree[next].dedomena); Tree_diagrafi(tree, tree[thesi].dedomena, dpaidi, error); /* TStree_iso*/ { if(tstree_mikrotero(stoixeio, tree[thesi].dedomena)) // if tree[thesi].egkyro Tree_diagrafi(tree, stoixeio, apaidi, error); Tree_diagrafi(tree, stoixeio, dpaidi, error); Δ.Μήλιος 28

29 void Tree_anazitisi(typos_dentroy tree, TStoixeioyTree stoixeio, int riza, int *thesi, int *found) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei tin "thesi" tou kombou pou periexei to "stoixeio" */ int error; *found=error=0; *thesi=riza; if(!tree[riza].egkyro) return; if(tstree_iso(stoixeio, tree[riza].dedomena)) { *found=1; return; if(tstree_mikrotero(stoixeio, tree[riza].dedomena)) Tree_apaidi(tree, riza, &riza, &error); Tree_dpaidi(tree, riza, &riza, &error); Tree_anazitisi(tree, stoixeio, riza, thesi, found); void Tree_periexomeno(typos_dentroy tree, int thesi, TStoixeioyTree *stoixeio,int * error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Epistrefei sto "stoixeio" tin timi ton dedomenon pou iparxoun sto kombo * pou deixnei i "thesi"*/ *error=0; if(thesi==-1) { return; if(tree[thesi].egkyro==1) TStree_setValue(stoixeio, tree[thesi].dedomena); Δ.Μήλιος 29

30 void Tree_allagi(typos_dentroy tree, TStoixeioyTree old, TStoixeioyTree new, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Enimeronei ton kombo pou exei tin timi old allazontas tin timi se new */ int thesi, found; *error=thesi=found=0; Tree_anazitisi(tree, old, 0, &thesi, &found); if(found) { Tree_diagrafi(tree, old, 0, error); Tree_eisagogi(tree, new, 0, error); Αρχεία Δοκιμής Στα αρχεία δοκιμής περιλαμβάνεται το αρχείο main που χρησιμοποιείται ως αρχείο test για τις πράξεις του ΔΔΑ. Στο αρχείο main περιλαμβάνονται και οι συναρτήσεις: episkepsi, riza, prodiataksi, endodiataksi, metadiataksi των οποίων ο ρόλος έχει αναλυθεί πιο πάνω. Ακολουθεί ο κώδικας του αρχείου δοκιμής: #include <stdio.h> #include "BST_SeqArray-Recursive.h" #include "../../../../TS/TStoixeioyTree.h" void print_options(void); void episkepsi(typos_dentroy tree, int thesi); int riza(); void endodiataksi(typos_dentroy tree, int riza); void prodiataksi(typos_dentroy tree, int riza); void metadiataksi(typos_dentroy tree, int riza); int main(void) { int option, error, found, cur,created,out_err; typos_dentroy tree; TStoixeioyTree x, x1; created=0; Δ.Μήλιος 30

31 cur=-1; do{ printf("\n\no kersoras brisketai sth 8esh %d\n", cur); error=0; print_options(); scanf("%d", &option); switch(option) {case 1: Tree_dimiourgia(tree); created=1; printf("\nto dentro dimiourgithike!\n"); case 2: { printf("\nden uparxei dentro gia na eisaxthei stoixeio!\n"); printf("dwse ena stoixeio gia eisagwgh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_eisagogi(tree, x, 0, &error); if(error) printf("\nerror! Paidi ektos oriwn pinaka 'h stoixeio yparxei hdh!\n"); printf("to stoixeio eishx8h!\n"); case 3: { printf("\nden uparxei dentro gia na diagrafei stoixeio!\n"); printf("dwse ena stoixeio gia diagrafh apo to dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Δ.Μήλιος 31

32 !\n"); tou!\n"); case 4: Tree_diagrafi(tree, x, 0, &error); if(error) printf("\nerror! To stoixeio den yparxei sto dentro!\n"); printf("to stoixeio diagrafhke!\n"); { printf("\nden uparxei dentro gia na elegxthei an einai keno case 5: if(tree_keno(tree)) printf("\nto dentro einai keno!\n"); printf("\nto dentro DEN einai keno!\n"); { printf("\nden uparxei dentro gia na anazithithei stoixeio printf("dwse ena stoixeio gia anazhthsh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) {printf("\n error stin readvalue!\n"); Tree_anazitisi(tree, x, 0, &cur, &found); if(found) case 6: printf("\nto stoixeio bre8hke!\n"); printf("\nto stoixeio DEN bre8hke!\n"); { printf("\nden uparxei dentro gia na epistrafei to periexomeno enos komboy tou!\n"); Tree_periexomeno(tree, cur, &x,&error); if(error) Δ.Μήλιος 32

33 printf("\nerror! O deiktis einai NULL!\n"); { printf("\nto periexomeno toy komboy einai "); case 7: out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); { printf("\nden uparxei dentro gia na allaxthei to periexomeno enos komboy tou!\n"); printf("dwse to stoixeio poy 8es na allaksei: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); printf("dwse to stoixeio poy 8es na eisageis sth thesh tou "); out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); out_err=tstree_readvalue(stdin,&x1); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_allagi(tree, x, x1, &error); if(error) 3anaprospa8hste!\n"); case 8: printf("\nerror! Sthn eisagwgh 'h diagrafh twn stoixeiwn.\ Elegkste ta stoixeia kai to dentro kai printf("\nh allagh egine!\n"); Δ.Μήλιος 33

34 { printf("\nden uparxei dentro gia na metakinithei o dromeas sto aristero paidi tou trexonta!\n"); Tree_apaidi(tree, cur, &cur, &error); if(error) { printf("\nerror! Paidi ektos oriwn pinaka 'h kersoras se mh egkyrh thesh 'h den yparxei aristero paidi!\n"); cur=riza(); case 9: printf("\no kersoras allakse!\n"); { printf("\nden uparxei dentro gia na metakinithei o dromeas sto deksi paidi tou trexonta!\n"); Tree_dpaidi(tree, cur, &cur, &error); if(error) { printf("\nerror! Paidi ektos oriwn pinaka 'h kersoras se mh egkyrh thesh 'h den yparxei deksi paidi!\n"); cur=riza(); case 10: printf("\no kersoras allakse!\n"); { printf("\nden uparxei dentro gia na metakinithei o dromeas ston patera tou trexonta!\n"); thesh!\n"); Tree_pateras(tree, cur, &cur, &error); if(error) case 11: printf("\nerror! O kersoras brisketai sth riza 'h se mh egkyrh printf("\no kersoras allakse!\n"); Δ.Μήλιος 34

35 { printf("\nden uparxei dentro gia na metakinithei o dromeas sti riza tou dentrou!\n"); cur=riza(); printf("o deiktis deixnei stin riza!\n"); case 12: { printf("\nden uparxei dentro gia na katastrafei!\n"); Tree_katastrofi(tree); case 13: created=0; printf("\nto dentro katastrafike!\n"); { printf("\nden uparxei dentro gia na ginei endodiataksi!\n"); {printf("\nendodiataksi!\n"); endodiataksi(tree,riza()); case 14: { printf("\nden uparxei dentro gia na ginei prodiataksi!\n"); printf("\nprodiataksi!\n"); prodiataksi(tree,riza()); case 15: { printf("\nden uparxei dentro gia na ginei metadiataksi!\n"); printf("\nmetadiataksi!\n"); metadiataksi(tree,riza()); Δ.Μήλιος 35

36 while(option); return 0; void print_options(void) { printf("\n1. Dhmioyrgia dentroy\n\ 2. Eisagwgh stoixeioy sto dentro\n\ 3. Diagrafh stoixeioy apo to dentro\n\ 4. Elegxos gia keno dentro\n\ 5. Anazhthsh stoixeioy sto dentro\n\ 6. Epistrofh periexomenoy enos komboy\n\ 7. Allagh toy periexomenoy enos komboy\n\ 8. Metakinhsh toy dromea sto aristero paidi\n\ 9. Metakinhsh toy dromea sto deksi paidi\n\ 10.Metakinhsh toy dromea ston patera\n\ 11.Metakinhsh toy dromea stin riza\n\ 12.Katastrofh dentroy\n\ 13.Endodiatetagmenh diadromh\n\ 14.Prodiatetagmenh diadromh\n\ 15.Metadiatetagmenh diadromh\n\n\ Dwste thn epilogh sas(1-15, 0 gia eksodo):"); void episkepsi(typos_dentroy tree, int thesi) { TStree_writeValue(stdout,tree[thesi].dedomena); int riza() { return 0; void endodiataksi(typos_dentroy tree, int riza) { int temp, error; temp=error=0; if((riza<0) (riza>(plithos-1))) return; if(tree[riza].egkyro==1) { Tree_apaidi(tree, riza, &temp, &error); endodiataksi(tree, temp); Δ.Μήλιος 36

37 episkepsi(tree, riza); Tree_dpaidi(tree, riza, &temp, &error); endodiataksi(tree, temp); void prodiataksi(typos_dentroy tree, int riza) { int temp, error; temp=error=0; if((riza<0) (riza>(plithos-1))) return; if(tree[riza].egkyro==1) { episkepsi(tree, riza); Tree_apaidi(tree, riza, &temp, &error); prodiataksi(tree, temp); Tree_dpaidi(tree, riza, &temp, &error); prodiataksi(tree, temp); void metadiataksi(typos_dentroy tree, int riza) { int temp, error; temp=error=0; if((riza<0) (riza>(plithos-1))) return; if(tree[riza].egkyro==1) { Tree_apaidi(tree, riza, &temp, &error); metadiataksi(tree, temp); Tree_dpaidi(tree, riza, &temp, &error); metadiataksi(tree, temp); episkepsi(tree, riza); ενώ τα αρχεία Διεπαφής-Υλοποίησης, εκτός πάντα του path για τον τύπο στοιχείου, ίδια με τα πρότυπα αρχεία. Δ.Μήλιος 37

38 Υλοποίηση ΑΤΔ δέντρου αναζήτησης με δείκτες Στην συγκεκριμένη υλοποίηση γίνεται χρήση Ολικής Απόκρυψης. Η υλοποίηση αυτή είναι σύμφωνη με την οπτική αναπαράσταση των δενδρικών δομών και είναι εύκολο να καταλάβει κάποιος την λογική της δομής που θα χρησιμοποιηθεί Υλοποίηση ΑΤΔ δέντρου αναζήτησης με δείκτες με επανάληψη Αρχεία Διεπαφής-Υλοποίησης Στο αρχείο Διεπαφής έχουμε την δήλωση του απαραίτητου δείκτη προς την δομή, όπως είθισται σε μια υλοποίηση με Ολική Απόκρυψη, την δήλωση των συναρτήσεων, αλλά κυρίως εντοπίζεται το include του τύπου στοιχείου δέντρου το οποίο δεν περιλαμβάνει συγκεκριμένο μονοπάτι που να προσδιορίζει το αρχείο του τύπου στοιχείου δένδρου αλλά περιγράφει τον ρόλο του συγκεκριμένου include. Ακολουθεί ο κώδικας του αρχείου Διεπαφής: #ifndef BST_POINTER_ITERATIVE #define BST_POINTER_ITERATIVE #include "to antistoixo.h typou stoixeiou" /*edo analoga tin efarmogi i to test tou tipou stoixeiou mpainei to antoistixo.h tou tipou stoixeiou */ /*diloseis tipon*/ typedef struct typos_komboy * typos_deikti; /*diloseis synarthseon*/ /*dimiourgia/katastrofi dentrou*/ void Tree_dimiourgia(typos_deikti *tree); void Tree_katastrofi(typos_deikti *tree); /*Prakseis elegxou*/ int Tree_keno(typos_deikti tree); /*Prakseis prosvasis */ void Tree_apaidi(typos_deikti pateras, typos_deikti *paidi, int *error); void Tree_dpaidi(typos_deikti pateras, typos_deikti *paidi, int *error); void Tree_pateras(typos_deikti tree, typos_deikti *pateras, typos_deikti paidi, int *error); /*Prakseis diaxeirisis */ void Tree_eisagogi(typos_deikti *tree, TStoixeioyTree stoixeio, int *error); void Tree_diagrafi(typos_deikti *tree, TStoixeioyTree stoixeio, int *error); Δ.Μήλιος 38

39 /*Prakseis anazitisis*/ void Tree_anazitisi(typos_deikti tree, TStoixeioyTree stoixeio, typos_deikti *deiktis, int *found); void Tree_periexomeno(typos_deikti tree, TStoixeioyTree *periexomeno,int * error); void Tree_allagi(typos_deikti *tree, TStoixeioyTree old, TStoixeioyTree new, int *error); #endif /*#ifndef BST_POINTER_ITERATIVE */ #endif /*#ifndef BST_POINTER_ITERATIVE */ Στο αρχείο Υλοποίησης δηλώνεται η δομή του δένδρου που περιέχει μια μεταβλητή τύπου στοιχείου δένδρου για τα δεδομένα του κόμβου, και 2 δείκτες, ένα προς το δεξί παιδί του κάθε κόμβου και ένα προς το αριστερό. Προφανώς υπάρχει και το σώμα των συναρτήσεων που δηλώνονται στο αρχείο Διεπαφής. Ακολουθεί ο κώδικας του αρχείου Υλοποίησης: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "BST_pointer-Iterative.h" typedef struct typos_komboy { TStoixeioyTree dedomena; typos_deikti apaidi; typos_deikti dpaidi; typos_komboy; void Tree_dimiourgia(typos_deikti *tree) {/* Pro: kamia * Meta: Dimiourgia enos diadikou dentrou anazitisis */ *tree=null; Δ.Μήλιος 39

40 void Tree_katastrofi(typos_deikti *tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi olon ton kombon tou dentrou */ typos_deikti temp, pateras; int error, left; error=left=0; if(tree_keno(*tree)) return; temp=*tree; while(!error) { while((temp->apaidi!=null) (temp->dpaidi!=null)) { if(temp->apaidi==null) temp=temp->dpaidi; temp=temp->apaidi; Tree_pateras(*tree, &pateras, temp, &error); if(!error) { if(pateras->apaidi==temp) pateras->apaidi=null; pateras->dpaidi=null; free(temp); temp=pateras; *tree=null; int Tree_keno(typos_deikti tree) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei 1 an to dentro einai keno,diaforetika 0*/ return (tree==null); Δ.Μήλιος 40

41 void Tree_apaidi(typos_deikti pateras, typos_deikti *paidi, int *error) {/* Pro: o pateras deixnei ena kombo se duadiko dentro anazitisis * Meta: epistrefei to aristero paidi pou deixnei o pateras */ *error=0; if(pateras!=null) { *paidi=pateras->apaidi; if(*paidi==null) void Tree_dpaidi(typos_deikti pateras, typos_deikti *paidi, int *error) { /* Pro: o pateras deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei to deksi paidi pou deixnei o pateras */ *error=0; if(pateras!=null) { *paidi=pateras->dpaidi; if(*paidi==null) Δ.Μήλιος 41

42 void Tree_pateras(typos_deikti tree, typos_deikti *pateras, typos_deikti paidi, int *error) { /* Pro: to paidi deixnei ena kombo se ena diadiko dentro anazitisis * Meta: epistrefei ton patera ston "pateras" tou kombou pou deixnei to paidi*/ typos_deikti temp, dad; *error=0; if(tree_keno(tree) Tree_keno(paidi)) { *pateras=null; return; temp=dad=tree; while(temp!=null) { if(tstree_iso(paidi->dedomena, temp->dedomena)) { if(temp!=tree) *pateras=dad; { *pateras=null; return; if(tstree_mikrotero(paidi->dedomena, temp->dedomena)) { dad=temp; temp=temp->apaidi; { dad=temp; temp=temp->dpaidi; *pateras=null; Δ.Μήλιος 42

43 void Tree_eisagogi(typos_deikti *tree, TStoixeioyTree stoixeio, int *error) { /*Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Eisagogi tou kombou sto dentro efoson autos den iparxei idi */ typos_deikti temp, pateras, paidi; paidi=*tree; pateras=null; temp=malloc(sizeof(typos_komboy)); if(temp==null) { return; while(paidi!=null) { pateras=paidi; if(tstree_mikrotero(stoixeio, paidi->dedomena)) paidi=paidi->apaidi; if(tstree_megalytero(stoixeio, paidi->dedomena)) paidi=paidi->dpaidi; { return; temp->apaidi=null; temp->dpaidi=null; TStree_setValue(&(temp->dedomena), stoixeio); if(pateras==null) *tree=temp; { if(tstree_mikrotero(stoixeio, pateras->dedomena)) pateras->apaidi=temp; pateras->dpaidi=temp; Δ.Μήλιος 43

44 void Tree_diagrafi(typos_deikti *tree, TStoixeioyTree stoixeio, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Diagrafi tou kombou me periexomeno "stoixeio" */ typos_deikti x, pateras, x_next, ypodentro; int found, error1; *error=found=error1=0; Tree_anazitisi(*tree, stoixeio, &x, &found); if(!found) { return; Tree_pateras(*tree, &pateras, x, &error1); if((x->apaidi!=null)&&(x->dpaidi!=null))//iparxoun kai ta 2 paidia { x_next=x->dpaidi; pateras=x; while(x_next->apaidi!=null) { pateras=x_next; x_next=x_next->apaidi; TStree_setValue(&(x->dedomena), x_next->dedomena); x=x_next; ypodentro=x->dpaidi; if(ypodentro==null) ypodentro=x->apaidi; if(pateras==null) *tree=ypodentro; if(pateras->apaidi==x) pateras->apaidi=ypodentro; pateras->dpaidi=ypodentro; free(x); Δ.Μήλιος 44

45 void Tree_anazitisi(typos_deikti tree, TStoixeioyTree stoixeio, typos_deikti *deiktis, int *found) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: epistrefei ton deikti,ston "deiktis",tou kombou pou periexei to "stoixeio"*/ typos_deikti temp; *found=0; temp=tree; while(temp!=null) { if(tstree_iso(stoixeio, temp->dedomena)) { *deiktis=temp; *found=1; return; if(tstree_mikrotero(stoixeio, temp->dedomena)) temp=temp->apaidi; temp=temp->dpaidi; void Tree_periexomeno(typos_deikti tree, TStoixeioyTree *periexomeno,int * error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Epistrefei sto "stoixeio" tin timi ton dedomenon pou iparxoun ston kombo * pou deixnei to "tree" */ *error=0; if(!tree_keno(tree)) TStree_setValue(periexomeno, tree->dedomena); Δ.Μήλιος 45

46 void Tree_allagi(typos_deikti *tree, TStoixeioyTree old, TStoixeioyTree new, int *error) {/* Pro: Dimiourgia enos diadikou dentrou anazitisis * Meta: Enimenronei ton kombo pou exei tin timi old allazontas tin timi se new */ typos_deikti deiktis; int found; *error=found=0; deiktis=null; Tree_anazitisi(*tree, old, &deiktis, &found); if(found) { Tree_diagrafi(tree, old, error); if(!(*error)) Tree_eisagogi(tree, new, error); Αρχεία Δοκιμής Στα αρχεία δοκιμής περιλαμβάνεται το αρχείο main που χρησιμοποιείται ως αρχείο test για τις πράξεις του ΔΔΑ. Στο αρχείο main περιλαμβάνονται και οι συναρτήσεις: episkepsi, riza, prodiataksi, endodiataksi, metadiataksi των οποίων ο ρόλος έχει αναλυθεί πιο πάνω. Επειδή συγκεκριμένα και εδώ αναλύουμε μια υλοποίηση με επανάληψη για να υλοποιηθούν οι 3 αυτές συναρτήσεις (prodiataksi, endodiataksi, metadiataksi) πρέπει να κάνουν χρήση του ΑΤΔ Στοίβα με Ολική Απόκρυψη που είδαμε στο 3 ο κεφάλαιο. Συνεπώς στα αρχεία Δοκιμής περιλαμβάνονται και τα αρχεία Διεπαφής-Υλοποίησης της στοίβας με Ολική Απόκρυψη (για τον κώδικα τους ανατρέξτε στο 3 ο κεφάλαιο στην ενότητα Υλοποιήση με Ολική Απόκρυψη Αρχεία Διεπαφής- Υλοποίησης), τα αρχεία Διεπαφής-Υλοποίησης του τύπου στοιχείου δένδρου (για τον κώδικα τους ανατρέξτε στο 3 ο κεφάλαιο στην ενότητα ) και τέλος τα αρχεία Διεπαφής-Υλοποίησης, εκτός πάντα του path για τον τύπο στοιχείου, ίδια με τα πρότυπα αρχεία. Ακολουθεί ο κώδικας του αρχείου δοκιμής: #include <stdio.h> #include "Stack-OA.h" #include "TStoixeioyStoivas.h" #include "BST_pointer-Iterative.h" #include "../../../../TS/TStoixeioyTree.h" Δ.Μήλιος 46

47 void print_options(void); void episkepsi(typos_deikti tree); typos_deikti riza(typos_deikti tree); void endodiataksi(typos_deikti tree); void prodiataksi(typos_deikti tree); void metadiataksi(typos_deikti tree); int main(void) { int option, error, found,out_err,created; typos_deikti tree, cur; TStoixeioyTree x, x1; created=0; cur=null; printf("\n\nh arxikh timh toy kersora einai NULL!\n", cur); do{ error=0; print_options(); scanf("%d", &option); switch(option) { case 1: Tree_dimiourgia(&tree); created=1; printf("\nto dentro dimiourgithike!\n"); case 2: { printf("\nden uparxei dentro gia na eisaxthei stoixeio!\n"); printf("dwse ena stoixeio gia eisagwgh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_eisagogi(&tree, x, &error); if(error) printf("\nerror! Adynamia malloc 'h to stoixeio yparxei hdh!\n"); printf("\nto stoixeio eishx8h!\n"); Δ.Μήλιος 47

48 case 3: { printf("\nden uparxei dentro gia na diagrafei stoixeio!\n"); printf("dwse ena stoixeio gia diagrafh apo to dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_diagrafi(&tree, x, &error); if(error) printf("\nerror! To stoixeio den yparxei sto dentro!\n"); printf("\nto stoixeio diagrafhke!\n"); case 4: { printf("\nden uparxei dentro gia na elegxthei an einai keno!\n"); if(tree_keno(tree)) printf("\nto dentro einai keno!\n"); printf("\nto dentro DEN einai keno!\n"); case 5: { printf("\nden uparxei dentro gia na anazithithei stoixeio tou!\n"); printf("dwse ena stoixeio gia anazhthsh sto dentro: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); Tree_anazitisi(tree, x, &cur, &found); if(found) Δ.Μήλιος 48

49 case 6: printf("\nto stoixeio bre8hke!\n"); printf("\nto stoixeio DEN bre8hke!\n"); { printf("\nden uparxei dentro gia na epistrafei to periexomeno enos komboy tou!\n"); Tree_periexomeno(cur, &x,&error); if(error) { printf("\nerror! O deiktis einai NULL!\n"); { printf("\nto periexomeno toy komboy einai "); out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); case 7: { printf("\nden uparxei dentro gia na allaxthei to periexomeno enos komboy tou!\n"); printf("dwse to stoixeio poy 8es na allaksei: "); out_err=tstree_readvalue(stdin,&x); if(!out_err) { printf("\n error stin readvalue!\n"); printf("dwse to stoixeio poy 8es na eisageis sth thesh tou ", x); out_err=tstree_writevalue(stdout,x); if(out_err <0) { printf("\n error stin writevalue!\n"); out_err=tstree_readvalue(stdin,&x1); if(!out_err) Δ.Μήλιος 49

50 { printf("\n error stin readvalue!\n"); Tree_allagi(&tree, x, x1, &error); if(error) 3anaprospa8hste!\n"); printf("\nerror! Sthn eisagwgh 'h diagrafh twn stoixeiwn.\ Elegkste ta stoixeia kai to dentro kai { printf("\nh allagh egine!\n"); cur=null; case 8: { printf("\nden uparxei dentro gia na metakinithei o dromeas sto aristero paidi tou trexonta!\n"); Tree_apaidi(cur, &cur, &error); if(error) { printf("\nerror! O deiktis einai NULL!\n"); cur=riza(tree); case 9: printf("\no deiktis deixnei sto aristero paidi!\n"); { printf("\nden uparxei dentro gia na metakinithei o dromeas sto deksi paidi tou trexonta!\n"); Tree_dpaidi(cur, &cur, &error); if(error) { printf("\nerror! O deiktis einai NULL!\n"); cur=riza(tree); case 10: printf("\no deiktis deixnei sto deksi paidi!\n"); Δ.Μήλιος 50

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΓΡΑΦΗΜΑ

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΓΡΑΦΗΜΑ 1.1 Εισαγωγή 1. Ο ΑΤΔ ΓΡΑΦΗΜΑ Σε προηγούμενα κεφάλαια είδαμε γραμμικές δομές δεδομένων (στοίβα, ουρά, λίστα), στις οποίες κάθε στοιχείο μπορεί να έχει το πολύ ένα επόμενο και το πολύ ένα προηγούμενο, αλλά

Διαβάστε περισσότερα

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ???? η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα θέση (index) dedomena epomenos lista = 0 1 3 Ελένη Σπύρος Βασίλης -1 1 Στη συνέχεια θα πρέπει να γνωρίζουμε την οργάνωση

Διαβάστε περισσότερα

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι

Διαβάστε περισσότερα

1. ΟΡΓΑΝΩΣΗ ΑΦΗΡΗΜΕΝΩΝ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΒΑΣΙΚΟΙ ΤΡΟΠΟΙ ΠΡΟΣΒΑΣΗΣ ΣΕ ΔΟΜΕΣ

1. ΟΡΓΑΝΩΣΗ ΑΦΗΡΗΜΕΝΩΝ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΒΑΣΙΚΟΙ ΤΡΟΠΟΙ ΠΡΟΣΒΑΣΗΣ ΣΕ ΔΟΜΕΣ 1. ΟΡΓΑΝΩΣΗ ΑΦΗΡΗΜΕΝΩΝ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΒΑΣΙΚΟΙ ΤΡΟΠΟΙ ΠΡΟΣΒΑΣΗΣ ΣΕ ΔΟΜΕΣ 1.1 Οργάνωση Αφηρημένων τύπων δεδομένων Θα αναλυθεί το πρότυπο οργάνωσης των αφηρημένων τύπων δεδομένων (ΑΤΔ) που παρουσιάζονται

Διαβάστε περισσότερα

Δέντρα (Trees) - Ιεραρχική Δομή

Δέντρα (Trees) - Ιεραρχική Δομή Δέντρα (Trees) - Ιεραρχική Δομή Εφαρμογές Δομή Οργάνωση Αρχείων Οργανογράμματα Ορισμός (αναδρομικός ορισμός): Ένα δέντρο είναι ένα πεπερασμένο σύνολο κόμβων το οποίο είτε είναι κενό είτε μη κενό σύνολο

Διαβάστε περισσότερα

Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία. Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται

Διαβάστε περισσότερα

Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται

Διαβάστε περισσότερα

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες: Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι

Διαβάστε περισσότερα

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες: υαδικά έντρα Αναζήτησης (Binary Search Trees) Ορισµός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόµενα στο αριστερό υποδέντρο του t είναι

Διαβάστε περισσότερα

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών ΛΙΣΤΕΣ Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα Υλοποίηση με δείκτες (pointers) Υλοποίηση με πίνακα Εφαρμογές και Χρήση Λιστών Λίστες (Lists) Δεδομένα

Διαβάστε περισσότερα

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. O AΤΔ ΟΥΡΑ

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. O AΤΔ ΟΥΡΑ 1.1 Εισαγωγή 1. O AΤΔ ΟΥΡΑ Μια ουρά αποτελεί μια δομή πολύ παρόμοια με την στοίβα, διαφέρει μόνο ο τρόπος εισαγωγής-εξαγωγής των στοιχείων της. Τον όρο ουρά τον συναντάμε πολύ συχνά στην καθημερινή μας

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 35: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 21 211, Χειµερινό εξάµηνο Όλες οι ασκήσεις να δακτυλογραφηθούν

Διαβάστε περισσότερα

1. ΕΙΣΑΓΩΓΗ-ΓΕΝΙΚΑ ΠΕΡΙ ΑΦΗΡΗΜΕΝΩΝ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ

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

Διαβάστε περισσότερα

Θέµα 1 (15%): (απαιτούµενος χρόνος < 15 λεπτά)

Θέµα 1 (15%): (απαιτούµενος χρόνος < 15 λεπτά) Θέµα 1 (15%): (απαιτούµενος χρόνος < 15 λεπτά) Εκτελέστε µε το χέρι το παρακάτω πρόγραµµα και γράψτε όλες τις ενδιάµεσες τιµές και τις τιµές που τυπώνονται: int m,n; m=2; n=1; m=m+5; if (m>=9) m=m-8; n=n+7;

Διαβάστε περισσότερα

Η αναφορά σ ένα μέλος μίας μεταβλητής τύπου δομής γίνεται με την παράσταση

Η αναφορά σ ένα μέλος μίας μεταβλητής τύπου δομής γίνεται με την παράσταση ΔΟΜΕΣ Πολλές φορές, μία σύνθετη οντότητα μπορεί να καθορισθείαπό ένα σύνολο δεδομένων, πιθανώς διαφορετικών τύπων,οπότε θα ήταν χρήσιμο να ομαδοποιούσαμε τα δεδομένααυτά κάτω από ένα γενικό όνομα, με σκοπό

Διαβάστε περισσότερα

AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962

AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962 AVL δέντρα L - R 1 L R G.M. AdelsonVelkii και E.M. Landis 1962 AVL Δέντρα Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 : 6 4 6 Αριστερή στροφή 6 4 12 12 8, 14 : 6 4 12 8 14 7 : 4 6 12 6 4 8 6 8 12 7 8 14

Διαβάστε περισσότερα

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. O AΤΔ ΣΤΟΙΒΑ

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. O AΤΔ ΣΤΟΙΒΑ 1. O AΤΔ ΣΤΟΙΒΑ 1.1 Εισαγωγή Η στοίβα αποτελεί την υλοποίηση μιας συλλογής αντικειμένων στην οποία κάθε εισαγωγή και διαγραφή γίνεται στο ίδιο άκρο που ονομάζεται κορυφή. Για την καλύτερη κατανόηση της

Διαβάστε περισσότερα

ρίζα E F G H I J επίπεδο 1

ρίζα E F G H I J επίπεδο 1 Δέντρα (Trees) Ορισµός: Ενα δέντρο είναι ένα πεπερασµένο µη κενό σύνολο κόµβων τέτοιο ώστε: 1.Yπάρχει ένας µοναδικός κόµβος, που καλείται ρίζα, ο οποίος δεν έχει προηγούµενο. 2.Οι υπόλοιποι κόµβοι χωρίζονται

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις - προγράμματα - Μέρος Β Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης

Διαβάστε περισσότερα

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή έντρα (Trees) Ιεραρχική οµή Εφαρµογές οµή Οργάνωση ρχείων Οργανογράµµατα Ορισµός (αναδροµικός ορισµός): Ένα δέντρο είναι ένα πεπερασµένο σύνολο κόµβων το οποίο είτε είναι κενό είτε µη κενό σύνολο τέτοιο

Διαβάστε περισσότερα

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίζει τον ΑΤΔ Λίστα Να αναδείξει το πρόβλημα

Διαβάστε περισσότερα

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 9 Συναρτήσεις. Γεώργιος Λαμπρινίδης

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 9 Συναρτήσεις. Γεώργιος Λαμπρινίδης Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 9 Συναρτήσεις Γεώργιος Λαμπρινίδης lamprinidis@pharm.uoa.gr Ασκήσεις Προηγούμενου Εργαστηρίου #include main() { int i, flag, temp, a[5]; for (i=0;i

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση. Γιώργος Λαμπρινίδης

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση. Γιώργος Λαμπρινίδης Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση Γιώργος Λαμπρινίδης amprinidis@pharm.uoa.gr Παραδείγματα στους πίνακες (1) Έστω ότι έχετε το εξής: int a[20]; for(i = 0; i < 20; i++) a[i] = i+1; Ποιες

Διαβάστε περισσότερα

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

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 22: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης - Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου

Διαβάστε περισσότερα

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2017-2018 ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ ΜΑΘΗΜΑ: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Ουρές ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ Μια ουρά αποτελεί μια δομή δεδομένων στη λογική του First-in

Διαβάστε περισσότερα

ΑΤΣΑΛΑΚΗ ΞΑΝΘΟΥΛΑ ΕΡΓΑΣΤΗΡΙΟ 2

ΑΤΣΑΛΑΚΗ ΞΑΝΘΟΥΛΑ ΕΡΓΑΣΤΗΡΙΟ 2 EXERSICE 1 #include #define ROWS 20 #define COLUMNS 5 int better(int array[][columns],int rows); int main(void) int rows,grades[rows][columns],i,j,k=0,l=0; printf("\nhow many students are there

Διαβάστε περισσότερα

3. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Β' μέρος: switch και :? )

3. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Β' μέρος: switch και :? ) 3. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Β' μέρος: switch και :? ) 3.1 Η εντολή switch case Στην περίπτωση που θέλουμε να εξετάσουμε πολλές διαφορετικές τιμές, θα αναγκαζόμασταν να φτιάξουμε ένα κώδικα που θα περιέχει πολλά

Διαβάστε περισσότερα

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά EPL231: Δομές Δεδομένων και Αλγόριθμοι Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά Αναδρομή Η αναδρομή εμφανίζεται όταν μία διεργασία καλεί τον εαυτό της Υπάρχουν

Διαβάστε περισσότερα

Generics και ArrayLists

Generics και ArrayLists ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός Παναγιώτης Σφέτσος sfetsos@it.teithe.gr Generics και ArrayLists Προσοχή!!! Να εκτελεστούν πρώτα όλες οι ασκήσεις τις Θεωρίας

Διαβάστε περισσότερα

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ. ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στον Προγραμματισμό Ενότητα 8: Συναρτήσεις Κ. Κουκουλέτσος Τμήμα: Τμήμα Υπολογιστικών Συστημάτων Άδειες Χρήσης Το παρόν

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 9: Συναρτήσεις Εμβέλεια

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 9: Συναρτήσεις Εμβέλεια ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στον Προγραμματισμό Ενότητα 9: Συναρτήσεις Εμβέλεια Κ. Κουκουλέτσος Τμήμα: Τμήμα Υπολογιστικών Συστημάτων Άδειες Χρήσης

Διαβάστε περισσότερα

Διδάσκων: Κωνσταντίνος Κώστα

Διδάσκων: Κωνσταντίνος Κώστα Διάλεξη Ε4: Επανάληψη Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή σε δενδρικές δομές δεδομένων, Δυαδικά Δένδρα Αναζήτησης Ισοζυγισμένα Δένδρα & 2-3 Δένδρα Διδάσκων: Κωνσταντίνος

Διαβάστε περισσότερα

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα Τελεστές συντομογραφίας Τελεστές σύντομης ανάθεσης += παράδειγμα: sum+=10; αντί για: sum = sum

Διαβάστε περισσότερα

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

Δομές δεδομένων (2) Αλγόριθμοι Δομές δεδομένων (2) Αλγόριθμοι Παράγωγοι τύποι (struct) σύνοψη προηγουμένων Πίνακες: πολλές μεταβλητές ίδιου τύπου Παράγωγοι τύποι ή Δομές (struct): ομαδοποίηση μεταβλητών διαφορετικού τύπου struct Student

Διαβάστε περισσότερα

Εχουμε ήδη συναντήσει μονοδιάστατους πίνακες, οι οποίοι ορίζονται ως εξής:

Εχουμε ήδη συναντήσει μονοδιάστατους πίνακες, οι οποίοι ορίζονται ως εξής: ΠΙΝΑΚΕΣ ΣΤΗΝ ΓΛΩΣΣΑ C Ενας πίνακας είναι ένα σύνολο μεταβλητών του ίδιου τύπου. Το κάθε στοιχείο του πίνακα αναγνωρίζεται από ένα ακέραιο δείκτη (index). Στη C ο δείκτης θέσης αρχίζει από το μηδέν (0)

Διαβάστε περισσότερα

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις Ασκηή σεις 12ο Μαά θημα - Λυύ σεις Άσκηση 1: Γράψτε ένα πρόγραμμα που να δέχεται από το πληκτρολόγιο 21 ακέραιους αριθμούς (μεταξύ 0 και 100) και στη συνέχεια να υπολογίζει το πλήθος και το μέσο όρο, μόνο

Διαβάστε περισσότερα

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας ΣΤΟΙΒΕΣ (stacks) Η στοίβα είναι µια συλλογή δεδοµένων µε γραµµική διάταξη στην οποία όλες οι εισαγωγές και οι διαγραφές γίνονται στο ένα άκρο που λέγεται κορυφή (top) της στοίβας Σχήµα: Λειτουργία Στοίβας

Διαβάστε περισσότερα

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

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Άσκηση 1 (α) Έστω Α(n) και Κ(n) ο αριθμός των ακμών και ο αριθμός των κόμβων ενός αυστηρά δυαδικού δένδρου με n φύλλα. Θέλουμε να αποδείξουμε για κάθε n 1 την πρόταση

Διαβάστε περισσότερα

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

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 7: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου Διδάσκων:

Διαβάστε περισσότερα

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Α Β Γ static; printf(%c\n, putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf(*); ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2016 (1/2/2016) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος 2003-2004 ΑΣΚΗΣΗ #5 Προτεινόµενη λύση Θέµα 1 /* Προγραµµατιστής : Ηµεροµηνία συγγραφής : Λειτουργία Προγράµµατος : Πρόγραµµα για την αποθήκευση και ανάκτηση βαθµολογιών

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

"ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ" (ΕΜ102), ΕΡΓΑΣΙΑ 1η

ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ (ΕΜ102), ΕΡΓΑΣΙΑ 1η "ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ" (ΕΜ102), ΕΡΓΑΣΙΑ 1η Σε αυτήν την εργασία καλείστε να κατασκευάσετε τον πηγαίο κώδικα γλώσσας C για το εκτελέσιµο αρχείο µε ό- νοµα ATM, που όταν εκτελείται σε κονσόλα προσοµοιώνει

Διαβάστε περισσότερα

Work12 REMARKS script file lab10 ask1-5 tabbing, ls2, urlparse, times, dates_correct

Work12 REMARKS script file lab10 ask1-5 tabbing, ls2, urlparse, times, dates_correct Work12 REMARKS script le lab10 ask1-5 tabbing, ls2, urlparse, times, dates_correct #Username : imanousi #lename : tabbing.imanousi #To script eisagei ena tab sthn arxh kathe grammhs #tou arxeiou pou dinetai

Διαβάστε περισσότερα

Νικόλαος Μιχαλοδημητράκης Σημειώσεις C (Εργαστήριο) 12 ο Μάθημα 1

Νικόλαος Μιχαλοδημητράκης Σημειώσεις C (Εργαστήριο) 12 ο Μάθημα 1 12 ο Μέρος Συναρτήσεις Συναρτήσεις Τι είναι οι συναρτήσεις Οι συναρτήσεις είναι ένα βασικό δομικό συστατικό σε όλες τις ανώτερες γλώσσες προγραμματισμού. Με τις συναρτήσεις έχουμε τη δυνατότητα να χωρίσουμε

Διαβάστε περισσότερα

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014 Πίνακες 0 Μαρτίου 014 1 Πίνακες Είδαμε ότι δηλώνοντας μία μεταβλητή κάποιου συγκεκριμένου τύπου δεσμεύουμε μνήμη κατάλληλη για να αποθηκευτεί μία οντότητα του συγκεκριμένου τύπου. Στην περίπτωση που θέλουμε

Διαβάστε περισσότερα

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 6. Δυαδικά Δέντρα 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 18/11/2016 Εισαγωγή Τα

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα 10: Συναρτήσεις με πίνακες- Αναδρομικές συναρτήσεις Κουκουλέτσος Κώστας Τμήμα Μηχανικών Ηλεκτρονικών

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις - προγράμματα - Μέρος Α Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης

Διαβάστε περισσότερα

Ασκήσεις 5ο Μάθημα - Λύσεις

Ασκήσεις 5ο Μάθημα - Λύσεις Ασκήσεις 5ο Μάθημα - Λύσεις Άσκηση 1: Γράψτε ένα πρόγραμμα σε γλώσσα C το οποίο να διαβάζει ένα ακέραιο αριθμό και να υπολογίζει: - Αν ο αριθμός είναι μεγαλύτερος του 10 - Αν ο αριθμός είναι θετικός -

Διαβάστε περισσότερα

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

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΟΔΗΓΙΕΣ: ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - 15 ΙΟΥΝΙΟΥ 2014 Τα θέματα που έχετε στα χέρια σας είναι τρεις (3) σελίδες. Επιβεβαιώστε το και αν λείπει κάποια σελίδα ή

Διαβάστε περισσότερα

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C Εισαγωγή στη Γλώσσα C Η C είναι µια δοµηµένη (structured ) γλώσσα ηλαδή ένα C πρόγραµµα αποτελείται από υποπρογράµµατα τα οποία ονοµάζονται συναρτήσεις ( functions ), όπου η κάθε συνάρτηση εκτελεί µια

Διαβάστε περισσότερα

242 -ΕισαγωγήστουςΗ/Υ

242 -ΕισαγωγήστουςΗ/Υ 1 242 -ΕισαγωγήστουςΗ/Υ ΤµήµαΜαθηµατικών, Πανεπιστήµιο Ιωαννίνων Άρτια Α.Μ. (0-2-4-6-8) Πίνακες σαν παράµετροι 2 Πίνακες σαν παράµετροι 3 Πίνακες σαν παράµετροι Περνάµε ένα πίνακα σαν παράµετρο σε µια

Διαβάστε περισσότερα

Λογικό "και" (AND) μας επιστρέφει 1 αν και οι δύο operands είναι όχι μηδέν, διαφορετικά 0)

Λογικό και (AND) μας επιστρέφει 1 αν και οι δύο operands είναι όχι μηδέν, διαφορετικά 0) 0ι Λογικοί Τελεστές: Πρόκειται για τελεστές που μας επιτρέπουν να συνδυάσουμε απλές εκφράσεις συσχετισμού και να δημιουργήσουμε πιό πολύπλοκες λογικές εκφράσεις. Εχουμε λοιπόν: && Λογικό "και" (AND) μας

Διαβάστε περισσότερα

Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 :

Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 : AVL δέντρα AVL Δέντρα L R G.M. AdelsonVelkii και E.M. Landis 192 Μη AVL Δέντρα Εισαγωγή κόμβου, : : Αριστερή στροφή 1 8, 1 : 8 1 7 : 7 8 1 Δεξιά στροφή 8 7 Αριστερή στροφή 1 8 7 1 Περιπτώσεις LL : ο νέος

Διαβάστε περισσότερα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf(%u\n, x); Β. unsigned char ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Β Περιόδου 2015 (8/9/2015) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL Υλικό από τις σηµειώσεις Ν. Παπασπύρου, 2006 Δέντρα δυαδικής αναζήτησης Δενδρικές δοµές δεδοµένων στις οποίες Όλα τα στοιχεία στο αριστερό υποδέντρο της ρίζας είναι

Διαβάστε περισσότερα

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 6: ΑΤΔ Δένδρο, ΑΤΔ Δυαδικό Δένδρο Αναζήτησης (ΔΔΑ)

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 6: ΑΤΔ Δένδρο, ΑΤΔ Δυαδικό Δένδρο Αναζήτησης (ΔΔΑ) Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 6: ΑΤΔ Δένδρο, ΑΤΔ Δυαδικό Δένδρο Αναζήτησης (ΔΔΑ) Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίσει

Διαβάστε περισσότερα

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

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης (ΔΔΑ) Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου Εισαγωγή στοιχείου

Διαβάστε περισσότερα

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 13-1 Περιεχόμενο

Διαβάστε περισσότερα

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Δέντρα Αναζήτησης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Δέντρα Αναζήτησης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Το πρόβλημα Αναζήτηση Θέλουμε να διατηρήσουμε αντικείμενα με κλειδιά και να μπορούμε εκτός από

Διαβάστε περισσότερα

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας

Διαβάστε περισσότερα

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας

Διαβάστε περισσότερα

Γραμμικές Δομές Δεδομένων

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

Διαβάστε περισσότερα

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 20: Δυαδικό Δέντρο Αναζήτησης Δυαδικό δέντρο Κάθε κόμβος «γονέας» περιέχει δύο δείκτες που δείχνουν σε δύο κόμβους «παιδιά» του ιδίου τύπου. Αν οι δείκτες προς αυτούς

Διαβάστε περισσότερα

Ισοζυγισμένα υαδικά έντρα Αναζήτησης

Ισοζυγισμένα υαδικά έντρα Αναζήτησης Ισοζυγισμένα υαδικά έντρα Αναζήτησης ομές εδομένων 3ο εξάμηνο ιδάσκων: Χρήστος ουλκερίδης ιαφάνειες προσαρμοσμένες από το υλικό της Μαρίας Χαλκίδη Ισοζυγισμένα υαδικά έντρα Αναζήτησης Ισοζυγισμένα Α είναι

Διαβάστε περισσότερα

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation. Γραμμικές Δομές Δεδομένων Επισκόπηση Μαθήματος Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή

Διαβάστε περισσότερα

Αλγόριθμοι Ταξινόμησης Μέρος 1

Αλγόριθμοι Ταξινόμησης Μέρος 1 Αλγόριθμοι Ταξινόμησης Μέρος 1 Μανόλης Κουμπαράκης 1 Το Πρόβλημα της Ταξινόμησης Το πρόβλημα της ταξινόμησης (sorting) μιας ακολουθίας στοιχείων με κλειδιά ενός γνωστού τύπου (π.χ., τους ακέραιους ή τις

Διαβάστε περισσότερα

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί

Διαβάστε περισσότερα

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

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 26: Σωροί Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας -Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι

Διαβάστε περισσότερα

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1 Διασυνδεδεμένες Δομές Δυαδικά Δέντρα Προγραμματισμός II 1 lalis@inf.uth.gr Δέντρα Τα δέντρα είναι κλασικές αναδρομικές δομές Ένα δέντρο αποτελείται από υποδέντρα, καθένα από τα οποία μπορεί να θεωρηθεί

Διαβάστε περισσότερα

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

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 12: Δέντρα ΙΙ -Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης(ΔΔΑ) - Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου - Εισαγωγή

Διαβάστε περισσότερα

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8) Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις (Διάλεξη 8) 8-1 Τι θα δούμε σήμερα Η εντολή if else Η εντολή if else ιf - -else H εντολή switch Λογικές παραστάσεις Σχεσιακοί

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 23: οµές εδοµένων και Αλγόριθµοι Ενδιάµεση Εξέταση Ηµεροµηνία : ευτέρα, 3 Νοεµβρίου 2008 ιάρκεια : 2.00-4.00 ιδάσκουσα : Άννα Φιλίππου Ονοµατεπώνυµο: ΣΚΕΛΕΤΟΙ

Διαβάστε περισσότερα

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Άσκηση 1 Γράψτε μία αναδρομική συνάρτηση που θα παίρνει ως παράμετρο ένα δείκτη στη ρίζα ενός δυαδικού δένδρου και θα επιστρέφει το βαθμό του

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων Σκοπός της Άσκησης ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση µε τη χρήση πινάκων σαν διατάξεις αποθήκευσης δεδοµένων της Γλώσσας Προγραµµατισµού C. H συγκεκριµένη άσκηση

Διαβάστε περισσότερα

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

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 14: Δέντρα IV B Δένδρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: 2 3 Δένδρα, Εισαγωγή και άλλες πράξεις Άλλα Δέντρα: Β δένδρα, Β+ δέντρα, R δέντρα Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ231

Διαβάστε περισσότερα

ΕΠΛ232: Εργαστήριο 2

ΕΠΛ232: Εργαστήριο 2 ΕΠΛ232: Εργαστήριο 2 Παράδειγμα σε Στοίβες 1 Υπολογισμός Αριθμητικών Παραστάσεων - Πολωνικός Συμβολισμός A + (B * C) A + (BC * ) A(BC *) + ABC * + Ενδοθεματική μορφή Μεταθεματική μορφή Οι κανόνες που διέπουν

Διαβάστε περισσότερα

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω εµπρός Ουρές (Queues) A B C FIFO εµπρός πίσω B C Διαγραφή εµπρός πίσω B C D E Εισαγωγή πίσω Ορισµός Η ουρά είναι µια γραµµική λίστα στην οποία η διαγραφή ενός στοιχείου γίνεται στο ένα άκρο το οποίο καλείται

Διαβάστε περισσότερα

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while) 5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while) 5.1 Ο βρόχος while Η εντολή while παρέχει έναν μηχανισμό επανάληψης των δηλώσεων όσο μια συνθήκη είναι αληθινή. Χρησιμοποιείται όταν ο αριθμός των επαναλήψεων

Διαβάστε περισσότερα

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 9: Στοίβες:Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Υλοποίηση Στοιβών με Δυναμική Δέσμευση Μνήμης Εφαρμογή Στοιβών 1: Αναδρομικές συναρτήσεις Εφαρμογή

Διαβάστε περισσότερα

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

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΟΔΗΓΙΕΣ: ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - 14 ΙΟΥΝΙΟΥ 2015 Τα θέματα που έχετε στα χέρια σας είναι σε τρεις (3) σελίδες. Επιβεβαιώστε το και αν λείπει κάποια σελίδα

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου 2011 Θέµα 1 (α') 1 - i 2 - ii 3 - iii 4 - iv 5 - v 6 - vi 7 - vii 8 - viii 9 - ix 10 - x Το αποτέλεσµα είναι η αντιστοιχία των

Διαβάστε περισσότερα

A[0] = 0; /* To μηδέν δεν έχει διαιρέτες */ for (i=1; i<n; i++) { S=0; for (d=1; d<=i; d++) if (i % d == 0) S += d; A[i] = S; }

A[0] = 0; /* To μηδέν δεν έχει διαιρέτες */ for (i=1; i<n; i++) { S=0; for (d=1; d<=i; d++) if (i % d == 0) S += d; A[i] = S; } TEI Λάρισας / ΣΤΕΦ Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών B Εξεταστική Περίοδος, 19 Φεβρουαρίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Ι Ηλίας. Κ. Σάββας Α 1) Να γράψετε ένα πρόγραμμα το οποίο να γεμίζει ένα ακέραιο

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Δομές Δεδομένων & Αλγόριθμοι - Πίνακες 1 Πίνακες Οι πίνακες έχουν σταθερό μέγεθος και τύπο δεδομένων. Βασικά πλεονεκτήματά τους είναι η απλότητα προγραμματισμού τους και η ταχύτητα. Ωστόσο δεν παρέχουν την ευελιξία η οποία απαιτείται

Διαβάστε περισσότερα

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων. Διπλωματική εργασία

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων. Διπλωματική εργασία Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων Διπλωματική εργασία ΤΙΤΛΟΣ : Μελέτη Δομής Λεξικού με Ευαισθησία στην Κατανομή Προσπέλασης ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ : ΜΠΟΖΑΝΗΣ ΠΑΝΑΓΙΩΤΗΣ

Διαβάστε περισσότερα

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ουρές Προτεραιότητας. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Ουρές Προτεραιότητας Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρά Προτεραιότητας Το πρόβλημα Έχουμε αντικείμενα με κλειδιά και θέλουμε ανά πάσα στιγμή

Διαβάστε περισσότερα

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή Στο εργαστήριο αυτό θα μάθουμε για τη χρήση συναρτήσεων με σκοπό την κατασκευή αυτόνομων τμημάτων προγραμμάτων που υλοποιούν μία συγκεκριμένη διαδικασία, τα οποία

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 6: Πίνακες. Κ.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 6: Πίνακες. Κ. ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στον Προγραμματισμό Ενότητα 6: Πίνακες Κ. Κουκουλέτσος Τμήμα: Τμήμα Υπολογιστικών Συστημάτων Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εργαστήριο 10η εβδομάδα. Κοζάνη, 14 Ιανουαρίου 2009. Τα προγράμματα 1 έως 4 αφορούν την ταξινόμηση και αναζήτηση δεδομένων. Το πρόγραμμα 5 υλοποιεί μια στοίβα

Διαβάστε περισσότερα

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

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 10: Στοίβες:Υλοποίηση& Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση Στοιβών με Δυναμική Δέσμευση Μνήμης - Εφαρμογή Στοιβών 1: Αναδρομικές συναρτήσεις - Εφαρμογή

Διαβάστε περισσότερα

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 8: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά με Στατική Δέσμευση

Διαβάστε περισσότερα

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

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - 2 ΙΟΥΝΙΟΥ 2013 ΟΔΗΓΙΕΣ: Τα θέματα που έχετε στα χέρια σας είναι τέσσερις (4) σελίδες. Επιβεβαιώστε το και αν λείπει κάποια σελίδα

Διαβάστε περισσότερα

Γλώσσα Προγραμματισμού C

Γλώσσα Προγραμματισμού C Προγραμματισμός HY: Γλώσσα Προγραμματισμού C Δρ. Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας Email: savvas@teilar.gr URL: http://teilar.academia.edu/iliassavvas

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα