Σημειώσεις ένατης εβδομάδας

Σχετικά έγγραφα
Σημειώσεις όγδοης εβδομάδας

Σημειώσεις έκτης και έβδομης εβδομάδας

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

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

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

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

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

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

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

ΔυαδικάΔΕΝΔΡΑΑναζήτησης

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

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

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

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

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

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

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

5 ΔΕΝΤΡΑ (Trees) Σχήµα 5.1 : ενδροειδής αναπαράσταση αρχείων στα Windows. έντρα. \ {root directory} Accessories. Program Files.

Σημειώσεις δεύτερης εβδομάδας

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

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

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

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

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

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

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

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

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

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

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

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

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

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

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

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

AVL-trees C++ implementation

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο 5. Εντολή if και παραλλαγές: if-else, πολλαπλές if, πολλαπλές if-else. Απλές και σύνθετες εντολές. Εντολή switch.

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

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

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

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

Προγραμματισμός Αναδρομή

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

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ένδρα u o Κόµβοι (nodes) o Ακµές (edges) o Ουρά και κεφαλή ακµής (tail, head) o Γονέας Παιδί Αδελφικός κόµβος (parent, child, sibling) o Μονοπάτι (pat

Προγραμματισμός Αναδρομή

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αρχές Προγραμματισμού

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

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

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

Συγκρίσιμα Αντικείμενα (comparable)

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

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

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

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

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

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

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

Transcript:

Σημειώσεις ένατης εβδομάδας Η δομή της ουράς (queue), είναι και αυτή γραμμική δομή, όπως η λίστα και η στοίβα. Το βασικό χαρακτηριστικό της είναι ότι, όπως και στις φυσικές ουρές, εξυπηρετείται πρώτος, αυτός που ήρθε πρώτος. Η εισαγωγή κόμβων γίνεται στην ουρά του Queue, ενώ η εξαγωγή κόμβων γίνεται πάντα από την κεφαλή της ουράς. Οι βασικές λειτουργίες είναι enqueue και dequeue. Ο λόγος ότι προσθέτουμε στο τέλος ενώ τραβάμε τιμές από την κορυφή μας αναγκάζει να χρησιμοποιήσουμε δύο δείκτες. /* ** παράδειγμα Queue από το βιβλίο Deitel & Deitel */ #include <stdio.h> #include <stdlib.h> struct queuenode { char data; struct queuenode *nextptr; ; typedef struct queuenode QueueNode; typedef QueueNode *QueueNodePtr; void printqueue(queuenodeptr currentptr); int isempty(queuenodeptr headptr); char dequeue(queuenodeptr *headptr, QueueNodePtr *tailptr); void enqueue(queuenodeptr *headptr, QueueNodePtr *tailptr, char value); void instructions(void); int main(void){ QueueNodePtr headptr=null; QueueNodePtr tailptr=null; int choice; char item; instructions(); printf("? "); scanf("%d",&choice); while(choice!=3) { switch(choice){ case 1: printf("enter a char: "); scanf("\n%c",&item); enqueue(&headptr,&tailptr,item); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 1 costis@teicrete.gr

printqueue(headptr); break; case 2: if(!isempty(headptr)){ item=dequeue(&headptr,&tailptr); printf("%c has been dequeued.\n",item); printqueue(headptr); break; default: printf("invalid choice.\n"); instructions(); break; printf("? "); scanf("%d",&choice); printf("end of run.\n"); return 0; void instructions(void) { printf("enter your choice:\n" " 1 to add an item to the queue.\n" " 2 to remove an item from the queue.\n" " 3 to end.\n"); void enqueue(queuenodeptr *headptr, QueueNodePtr *tailptr, char value){ QueueNodePtr newptr; newptr=malloc(sizeof(queuenode)); if(newptr!=null){ newptr->data=value; newptr->nextptr=null; if(isempty(*headptr)) *headptr=newptr; (*tailptr)->nextptr=newptr; *tailptr=newptr; printf("%c not inserted. No memory.\n",value); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 2 costis@teicrete.gr

char dequeue(queuenodeptr *headptr, QueueNodePtr *tailptr){ char value; QueueNodePtr tempptr; value=(*headptr)->data; tempptr=*headptr; *headptr=(*headptr)->nextptr; if(*headptr==null){ *tailptr=null; free(tempptr); return value; int isempty(queuenodeptr headptr){ return headptr==null; void printqueue(queuenodeptr currentptr) { if (currentptr == NULL) printf("queue is empty.\n\n"); { printf("the queue is:\n"); while (currentptr!= NULL) { printf("%c --> ", currentptr->data); currentptr = currentptr->nextptr; printf("null\n\n"); Η δομή του δένδρου (tree), είναι μη γραμμική δομή. Κάθε κόμβος περιέχει δύο δείκτες. Σε μία απλή υλοποίηση η κορυφή του δέντρου παραμένει σταθερή. Εισαγωγή κόμβων γίνεται πάντα μετά από αναζήτηση και τοποθετούνται στην κατάλληλη θέση έτσι ώστε ο κανόνας: ο αριστερός κόμβος να είναι μικρότερος από τον τρέχοντα και ο δεξιός μεγαλύτερος να ισχύει πάντα. /* ** παράδειγμα Binary Tree από το βιβλίο Deitel & Deitel */ #include <stdio.h> #include <stdlib.h> struct treenode { struct treenode *leftptr; int data; Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 3 costis@teicrete.gr

; struct treenode *rightptr; typedef struct treenode TreeNode; typedef TreeNode* TreeNodePtr; void insertnode(treenodeptr *treeptr,int value); void inorder(treenodeptr treeptr); int main(void){ TreeNodePtr rootptr = NULL; insertnode(&rootptr, 13); insertnode(&rootptr, 6); insertnode(&rootptr, 17); insertnode(&rootptr, 27); insertnode(&rootptr, 33); insertnode(&rootptr, 42); insertnode(&rootptr, 48); printf("\n -----inorder---------------------------------------\n"); inorder(rootptr); return 0; void insertnode(treenodeptr *treeptr,int value){ if(*treeptr==null) { *treeptr=malloc(sizeof(treenode)); if(*treeptr!=null){ (*treeptr)->data=value; (*treeptr)->leftptr=null; (*treeptr)->rightptr=null; { printf("no memory\n"); { if(value < (*treeptr)->data) insertnode(&((*treeptr)->leftptr), value); if(value>(*treeptr)->data) insertnode(&((*treeptr)->rightptr), value); printf("dup"); void inorder(treenodeptr treeptr) { if (treeptr!= NULL) { inorder(treeptr->leftptr); printf("%3d ", treeptr->data); inorder(treeptr->rightptr); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 4 costis@teicrete.gr

Η πρόσβαση στους κόμβους το δένδρου μπορεί να γίνει με τους παρακάτω τρόπους 1 : 1 Wikipedia http://en.wikipedia.org/wiki/tree_traversal Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 5 costis@teicrete.gr

Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 6 costis@teicrete.gr

Ψευδοκώδικας: preorder(node) if node == null then return preorder(node.left) preorder(node.right) iterativepreorder(node) parentstack = empty stack while (not parentstack.isempty() or node null) if (node null) parentstack.push(node) node = node.left node = parentstack.pop() node = node.right In-order inorder(node) if node == null then return inorder(node.left) inorder(node.right) iterativeinorder(node) parentstack = empty stack while (not parentstack.isempty() or node null) if (node null) parentstack.push(node) node = node.left node = parentstack.pop() node = node.right Post-order postorder(node) if node == null then return postorder(node.left) postorder(node.right) iterativepostorder(node) parentstack = empty stack lastnodevisited = null while (not parentstack.isempty() or node null) if (node null) parentstack.push(node) node = node.left peeknode = parentstack.peek() if (peeknode.right null and lastnodevisited peeknode.right) /* if right child exists AND traversing node from left child, move right */ node = peeknode.right parentstack.pop() visit(peeknode) lastnodevisited = peeknode Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 7 costis@teicrete.gr

Πρόσβαση levelorder: 1. Ψευδοκώδικας: levelorder(root) q = empty queue q.enqueue(root) while not q.empty do node := q.dequeue() if node.left null then q.enqueue(node.left) if node.right null then q.enqueue(node.right) 2. Υλοποίηση σε C: void levelorder(treenodeptr treeptr) { QueueNodePtr qh= NULL; QueueNodePtr qt= NULL; enqueue(&qh, &qt, treeptr); do { treeptr=dequeue(&qh, &qt); printf("%3d ", treeptr->data); if(treeptr->leftptr!=null) enqueue(&qh, &qt, treeptr->leftptr); if(treeptr->rightptr!=null) enqueue(&qh,&qt, treeptr->rightptr); while(!isempty(qh)); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week9 8 costis@teicrete.gr