ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Εργαστήριο Τεχνολογίας και Επεξεργασίας Δεδομένων Δομές Δεδομένων ΠΕΡΙΓΡΑΦΗ ΑΝΤΙΚΕΙΜΕΝΟΥ ΕΡΓΑΣΙΑ 2007-2008 Στη εργασία αυτή καλείστε να υλοποιήσετε σε C++ ένα σύνολο δομών δεδομένων και βασικών αλγορίθμων. Η εργασία λαμβάνει το 40% του συνολικού βαθμού του μαθήματος. Σε περίπτωση που δεν παραδοθεί εργασία αυτομάτως χάνετε 4 μονάδες από τον τελικό βαθμό. Θα πρέπει να υλοποιηθούν οι ακόλουθες δομές δεδομένων: Ι) Στοίβα Η κατασκευή της στοίβας πρέπει να γίνει με δυναμική δέσμευση μνήμης. Θα πρέπει να υποστηριχθούν οι λειτουργίες: κατασκευή άδειας στοίβας, εισαγωγή στην κορυφή (push), διαγραφή από την κορυφή (pop), ανάγνωση της κορυφής, καταστροφή της στοίβας. ΙΙ) Ουρά Προτεραιότητας Η κατασκευή της ουράς πρέπει να γίνει με δυναμική δέσμευση μνήμης. Θα πρέπει να υποστηριχθούν οι λειτουργίες: κατασκευή άδειου σωρού ελαχίστων ή μεγίστων, εισαγωγή, διαγραφή της κορυφής, ανάγνωση της κορυφής, καταστροφή. ΙΙΙ) Δένδρο AVL Η κατασκευή του δένδρου θα πρέπει να γίνει με δυναμική δέσμευση μνήμης. Θα πρέπει να υποστηριχθούν οι λειτουργίες: κατασκευή άδειου δένδρου, εισαγωγή στοιχείου, διαγραφή στοιχείου, αναζήτηση στοιχείου, postorder, inorder, preorder, καταστροφή δένδρου. ΙV) Κατακερματισμός με Αλυσίδες Ο χρήστης δίνει το μέγεθος του πίνακα κατακερματισμού. Θα πρέπει να υποστηριχθούν οι λειτουργίες: κατασκευή άδειου πίνακα κατακερματισμού, εισαγωγή στοιχείου, διαγραφή στοιχείου, αναζήτηση στοιχείου, καταστροφή. V) Κατευθυνόμενος Γράφος με Βάρη Η υλοποίηση του γράφου πρέπει να γίνει με δυναμική δέσμευση μνήμης. Θα πρέπει να υποστηριχθούν οι λειτουργίες: κατασκευή άδειου γράφου, εισαγωγή κορυφής, εισαγωγή ακμής, διαγραφή κορυφής, διαγραφή ακμής, εύρεση ελάχιστων μονοπατιών, εύρεση ελάχιστου δένδρου, διάσχιση DFS, καταστροφή. 1
ΟΔΗΓΙΕΣ ΥΛΟΠΟΙΗΣΗΣ Ακολουθείστε πιστά τις παρακάτω οδηγίες υλοποίησης. Το πρόγραμμά σας θα διαβάζει εντολές από ένα αρχείο με όνομα INPUT.TXT και θα δίνει την έξοδο στο αρχείο OUTPUT.TXT. Οι εντολές που θα περιέχονται στο αρχείο εισόδου είναι οι ακόλουθες: STACK_CREATE stackid; STACK_PUSH stackid, value; STACK_POP stackid; STACK_READ_TOP stackid; STACK_DESTROY stackid; HEAP_CREATE heapid, 0; // σωρός ελαχίστων HEAP_CREATE heapid, 1; // σωρός μεγίστων HEAP_INSERT heapid, value; HEAP_READ_TOP heapid; HEAP_DELETE_TOP heapid; HEAP_DESTROY heapid; AVL_CREATE treeid; AVL_INSERT treeid, value; AVL_DELETE treeid, value; AVL_SEARCH treeid, value; AVL_COMPUTE_POSTORDER treeid; AVL_COMPUTE_PREORDER treeid; AVL_COMPUTE_INORDER treeid; AVL_DESTROY treeid; HASH_CREATE hashid, value; // value είναι το μέγεθος του hash table HASH_INSERT hashid, value; HASH_DELETE hashid, value; HASH_SEARCH hashid, value; HASH_DESTROY hashid; GRAPH_CREATE graphid; GRAPH_INSERT_VERTEX graphid, vertexid; GRAPH_INSERT_EDGE graphid, edgeid, weight, from, to; GRAPH_DELETE_VERTEX graphid, vertexid; GRAPH_DELETE_EDGE graphid, edgeid; GRAPH_COMPUTE_MINSPANTREE graphid; GRAPH_COMPUTE_SHORTEST_PATHS graphid, vertexid; GRAPH_DESTROY graphid; 2
Στις παραπάνω εντολές, stackid, heapid, treeid, hashid και graphid είναι ακέραιοι αριθμοί που δηλώνουν τον κωδικό (όνομα) της κάθε δομής δεδομένων. Επίσης, value είναι ένας ακέραιος αριθμός. Σχετικά με τη δομή του γράφου, vertexid, edgeid είναι κωδικοί κορυφής και ακμής, weight είναι τα βάρος μίας ακμής (ακέραιος) και from, to είναι οι κωδικοί της κορυφής αρχής και τέλους για μία ακμή. Η κάθε εντολή τερματίζεται με το ελληνικό ερωτηματικό ;. Οι εντολές στο αρχείο εισόδου μπορεί να είναι μπερδεμένες. Για παράδειγμα: STACK_CREATE 1; // κατασκευή στοίβας με κωδικό 1 AVL_CREATE 1; // κατασκευή δένδρου AVL με κωδικό 1 STACK_PUSH 1, 10; // εισαγωγή του 10 στη στοίβα AVL_INSERT 1, 100; // εισαγωγή του 100 στο δένδρο AVL AVL_SEARCH 1, 100; // αναζήτηση του 100 στο δένδρο AVL STACK_DESTROY 1; // καταστροφή της στοίβας 1 AVL_DETROY 1; // καταστροφή του δένδρου AVL 1 Η κάθε εντολή θα πρέπει να γράφει κάποιο αποτέλεσμα στο αρχείο εξόδου OUTPUT.TXT. Οι περισσότερες εντολές γράφουν στην έξοδο ένα μήνυμα για επιτυχία ή για αποτυχία. Για παράδειγμα: Είσοδος STACK_PUSH 1, 10; Έξοδος Η εντολή <STACK_PUSH 1, 10> εκτελέστηκε επιτυχώς ή Η εντολή <STACK_PUSH 1, 10> απέτυχε Εξαίρεση αποτελούν οι εντολές αναζήτησης στοιχείων και υπολογισμού, που είναι οι: STACK_READ_TOP 1; Γράφει το στοιχείο που είναι στην κορυφή της στοίβας 1 π.χ. 10 STACK_POP 1; Γράφει το στοιχείο που είναι στην κορυφή της στοίβας 1 π.χ. 10 HEAP_READ_TOP 5; Γράφει το στοιχείο που είναι στην κορυφή της ουράς 5 π.χ. 20 AVL_SEARCH 7, 1; Το στοιχείο 1 δεν υπάρχει στο δένδρο 7 AVL_SEARCH 7, 2; Το στοιχείο 2 βρέθηκε στο δένδρο 7 AVL_COMPUTE_POSTORDER 7; Εδώ θα πρέπει να εμφανιστούν όλα τα στοιχεία του δένδρου σύμφωνα με την postorder 3
AVL_COMPUTE_PREORDER 7; Εδώ θα πρέπει να εμφανιστούν όλα τα στοιχεία του δένδρου σύμφωνα με την preorder AVL_COMPUTE_INORDER 7; Εδώ θα πρέπει να εμφανιστούν όλα τα στοιχεία του δένδρου σύμφωνα με την inorder HASH_SEARCH 12, 5; Το στοιχείο 5 βρέθηκε στον πίνακα κατακερματισμού 12 GRAPH_COMPUTE_MINSPANTREE 6; Εδώ στην έξοδο γράφονται οι ακμές του γράφου 6 που σχηματίζουν το ελάχιστο δένδρο. GRAPH_COMPUTE_SHORTEST_PATHS 6, 1; Εμφανίζεται το κόστος διαδρομής από την κορυφή 1 προς όλες τις κορυφές του γράφου 6 Προσοχή, όταν διαγράφουμε μία κορυφή από το γράφο θα πρέπει να διαγραφούν και όλες οι ακμές που προσπίπτουν σε αυτή. Δεν επιτρέπεται να χρησιμοποιηθεί έτοιμος κώδικας για οποιοδήποτε τμήμα της εργασίας. Θα πρέπει να υλοποιήσετε μόνοι σας τόσο τις δομές δεδομένων όσο και τους αλγορίθμους. Σε περίπτωση που διαπιστωθεί ότι χρησιμοποιήσατε έτοιμο κώδικα η εργασία θα ακυρώνεται. Δεν επιτρέπεται η χρήση της βιβλιοθήκης STL (standard template library). Σε όλες τις περιπτώσεις η κάθε δομή αποθηκεύει ακέραιους αριθμούς (int). Η υλοποίηση των δομών θα πρέπει να ομαδοποιηθεί σε ένα εκτελέσιμο αρχείο με όνομα data_structures.exe. Προσοχή, όλο το πρόγραμμα πρέπει να λειτουργεί σε console mode, χωρίς παράθυρα! Σε αντίθετη περίπτωση η εργασία δε θα βαθμολογηθεί. ΟΔΗΓΙΕΣ ΠΑΡΑΔΟΣΗΣ Τι πρέπει να παραδώσετε Για να θεωρηθεί η εργασία σας ολοκληρωμένη θα πρέπει να παραδώσετε τα ακόλουθα: - Πηγαίος κώδικας του προγράμματος ο οποίος θα περιλαμβάνει όλα τα αρχεία.cpp και.h που κατασκευάσατε για την παραγωγή του προγράμματος data_structures.exe. Ο πηγαίος κώδικας θα πρέπει να είναι σχολιασμένος με σωστό τρόπο. - Το εκτελέσιμο αρχείο data_structures.exe. - Τεχνική έκθεση όπου θα αναλύονται τα θεωρητικά στοιχεία των δομών δεδομένων που έχετε αναπτύξει, χωρίς να γίνεται αναφορά στον κώδικα του προγράμματος. - Τεχνική έκθεση όπου θα αναλύετε τον τρόπο που υλοποιήσατε τον κώδικα του προγράμματος. 4
Προσοχή: απαιτούνται όλα τα παραπάνω αρχεία ώστε να βαθμολογηθεί η εργασία. Πότε και πως πρέπει να παραδώσετε την εργασία Η εργασία θα εκπονηθεί σε ομάδες αυστηρά των δύο ατόμων. Η ημερομηνία παράδοσης της εργασίας είναι η τελευταία μέρα της εξεταστικής του Ιανουαρίου 2008. Όλα τα παραδοτέα θα πρέπει να συμπιεστούν με το WINZIP σε ένα μόνο αρχείο το οποίο θα έχει όνομα AEM1-AEM2.ZIP, όπου ΑΕΜ1 και ΑΕΜ2 είναι οι αριθμοί μητρώου των μελών της ομάδας εργασίας. Το αρχείο αυτό θα πρέπει να το στείλετε στην ηλεκτρονική διεύθυνση apostol@delab.csd.auth.gr μέχρι την προβλεπόμενη ημερομηνία παράδοσης. Τονίζεται ότι δε θα δοθεί νέα εργασία για το Σεπτέμβρη. Αυτό σημαίνει ότι αν δεν παραδώσετε την εργασία μέχρι την προβλεπόμενη ημερομηνία, δε θα μπορέσετε να την παραδώσετε στην εξεταστική του Σεπτεμβρίου. Περισσότερες πληροφορίες και οδηγίες σχετικά με την εργασία θα δοθούν κατά τις επόμενες διαλέξεις. Ο διδάσκων, Απόστολος Ν. Παπαδόπουλος Λέκτορας 5