(Εργασίες Μελέτες περιπτώσεων)

Σχετικά έγγραφα
ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

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

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

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

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

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

Ενδεικτικές Ερωτήσεις Θεωρίας

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

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

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

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

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

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

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

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

Περιεχόμενα. Πρόλογος... 17

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

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

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

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

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

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

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

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

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

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

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

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

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

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

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

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

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

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

Α2. Να γράψετε στο τετράδιο απαντήσεών σας το κατάλληλο τμήμα κώδικα, κάνοντας τις απαραίτητες αλλαγές σύμφωνα με την εκάστοτε εκφώνηση:

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

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

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

Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II

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

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

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

Κεφάλαιο 10 Ψηφιακά Λεξικά

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

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

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

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

8. Η δημιουργία του εκτελέσιμου προγράμματος γίνεται μόνο όταν το πηγαίο πρόγραμμα δεν περιέχει συντακτικά λάθη.

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

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

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

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

Εργαστήριο 2: Πίνακες

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

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

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

Εργαστήριο 2 Δυναμικές Δομές Δεδομένων Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

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

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

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

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

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΠΕΡΙΕΧΟΜΕΝΑ. Μονοδιάστατοι πίνακες Πότε πρέπει να χρησιμοποιούνται πίνακες Πολυδιάστατοι πίνακες Τυπικές επεξεργασίες πινάκων

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

Εργαστήριο 5. Εαρινό Εξάμηνο

Περιεχόμενα. Πρόλογος... 21

Transcript:

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Head node Data Next node Data Next Δεδομένο 2 Δεδομένο 1 Δομές Δεδομένων (Εργασίες Μελέτες περιπτώσεων) Δρ. Πάρις Μαστοροκώστας Καθηγητής Σέρρες 2015

ΠΕΡΙΕΧΟΜΕΝΑ Εργασία 1: Πίνακες και αλγοριθμική πολυπλοκότητα Εκφώνηση...................................................................... 3 Εργασία 2: Σειριακή δυαδική αναζήτηση Εκφώνηση...................................................................... 5 Εργασία 3: Ταξινόμηση (μέρος πρώτο): Απευθείας επιλογή και απευθείας εισαγωγή Εκφώνηση...................................................................... 6 Εργασία 4: Ταξινόμηση (μέρος δεύτερο) Εκφώνηση...................................................................... 8 Αλγόριθμοι φυσαλίδας και Quicksort Εφαρμογή του αλγορίθμου φυσαλίδας στην ταξινόμηση αλφαριθμητικών Συγκριτική ανάλυση των αλγορίθμων ταξινόμησης Εργασία 5: Στατικές στοίβες Εκφώνηση...................................................................... 12 Εργασία 6: Στατικές ουρές Εκφώνηση...................................................................... 14 Εργασία 7: Συνδεδεμένες λίστες Εκφώνηση...................................................................... 17 Εργασία 8: Υλοποίηση στοιβών και ουρών με χρήση συνδεδεμένων λιστών Εκφώνηση...................................................................... 20 Υλοποίηση στοίβας ως συνδεδεμένη λίστα Υλοποίηση ουράς ως συνδεδεμένη λίστα Εργασία 9: Δυαδικά δένδρα αναζήτησης Εκφώνηση...................................................................... 23 Εργασία 10: Γράφοι Εκφώνηση...................................................................... 30 Εργασία 11: Πίνακες κατακερματισμού Εκφώνηση...................................................................... 31 Βιβλιογραφία 2

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Πρώτη εργασία Να καταστρωθεί πρόγραμμα <project_1.cpp>, το οποίο να επιτελεί τις ακόλουθες εργασίες: Να δημιουργεί πίνακα ακεραίων p, μεγέθους Ν = 10, με στοιχεία τους αριθμούς i + 1, i = 0,1,,Ν-1. Nα υπολογίζει τα μερικά αθροίσματα των στοιχείων του πίνακα, τα οποία θα αποθηκεύει στον πίνακα s. Οι πίνακες p και s θα δημιουργούνται με δυναμική εκχώρηση μνήμης. Τα μερικά αθροίσματα θα υπολογισθούν με δύο διαφορετικούς αλγόριθμους, οι οποίοι θα υλοποιηθούν με τις αντίστοιχες συναρτήσεις: s k k p k = 0,1, Ν-1 int sum1(int *s, int *p, int rows); rows = μέγεθος p i 0 i s k p, για k 0 0 k = 0,1, Ν-1 int sum2(int *s, int *p, int rows); rows = μέγεθος p s p, για k 0 k 1 k Οι συναρτήσεις sum1 και sum2 θα επιστρέφουν τον πλήθος των πράξεων που εκτελούνται σε κάθε αλγόριθμο. Τα περιεχόμενα του πίνακα s και το πλήθος των πράξεων θα απεικονίζονται στην οθόνη. Να εξετασθεί η περίπτωση κατά την οποία ο πίνακας p θα είναι 30000 θέσεων και θα λαμβάνει τιμές με χρήση της συνάρτηση int getuniquenumber(int *p, int i) (ο κώδικάς της δίνεται στις σημειώσεις του εργαστηρίου). Για κάθε έναν από τους ανωτέρω αλγορίθμους θα εξάγεται το πλήθος των πράξεων και θα υπολογίζεται ο συνολικός χρόνος υλοποίησης του αλγορίθμου με χρήση της συνάρτησης time (dos.h). Συγκεκριμένα, πριν τη λειτουργία του κάθε αλγορίθμου θα εκτελείται ο κώδικας: gettime(&t); to = 360000*t.ti_hour + 6000*t.ti_min + 100*t.ti_sec + t.ti_hund; 3

και μετά την ολοκλήρωση του αλγορίθμου θα εκτελείται ο κώδικας: gettime(&t); t1 = 360000*t.ti_hour + 6000*t.ti_min + 100*t.ti_sec + t.ti_hund; Η διαφορά t1-t0 θα δίνει το χρόνο εκτέλεσης του αλγορίθμου σε εκατοστά του δευτερολέπτου. Τα περιεχόμενα του s δε θα απεικονίζονται στην οθόνη. Ένα στιγμιότυπο των αποτελεσμάτων δίνεται ακολούθως: 4

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Δεύτερη εργασία Να καταστρωθεί πρόγραμμα <project_2.cpp>, το οποίο να επιτελεί τις ακόλουθες εργασίες: Να δημιουργεί πίνακα ακεραίων p, μεγέθους Ν = 30000, με στοιχεία τους αριθμούς i = 0,1,,Ν-1. Nα διαβάζει από το πληκτρολόγιο έναν ακέραιο και να τον αναζητεί στον πίνακα p. Η αναζήτηση θα υλοποιηθεί με δύο διαφορετικούς αλγόριθμους: Τη σειριακή μέθοδο αναζήτησης (int sequential_search(int *p, int key)), η οποία θα δέχεται ως είσοδο ένα δείκτη στον πίνακα p και τον προς αναζήτηση ακέραιο (όρισμα key) και θα επιστρέφει είτε το -1, σε περίπτωση που δε βρεθεί ο ακέραιος μέσα στον πίνακα, είτε τη θέση του πίνακα, στην οποία βρέθηκε το προς αναζήτηση στοιχείο. Την αναδρομική μέθοδο δυαδικής αναζήτησης (int binary_search(int left, int right, int *p, int key)), η οποία θα δέχεται ως είσοδο ένα δείκτη στον πίνακα p, τον προς αναζήτηση ακέραιο (όρισμα key), καθώς και τα όρια του διαστήματος αναζήτησης, και θα επιστρέφει είτε το -1, σε περίπτωση που δε βρεθεί ο ακέραιος μέσα στον πίνακα, είτε τη θέση του πίνακα, στην οποία βρέθηκε το προς αναζήτηση στοιχείο. Για κάθε μέθοδο να εμφανίζεται το πλήθος των ελέγχων που πραγματοποιούνται. Ο κώδικας/ψευδοκώδικας και των δύο μεθόδων αναζήτησης φιλοξενείται στις σημειώσεις του εργαστηρίου. Ένα στιγμιότυπο των αποτελεσμάτων δίνεται ακολούθως: 5

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Τρίτη εργασία Να καταστρωθεί πρόγραμμα <project_3.cpp> το οποίο να επιτελεί τις ακόλουθες εργασίες: Να δημιουργεί πίνακα χαρακτήρων p[] με περιεχόμενο το αλφαριθμητικό ASORTINGEXAMPLE και πίνακα ακεραίων s[] με περιεχόμενο την ακολουθία ακεραίων 44,55,12,42,94,18,06,67, η οποία θα βρίσκεται αποθηκευμένη στο αρχείο κειμένου int_input.txt. Να ταξινομεί τους ανωτέρω πίνακες με τις μεθόδους ταξινόμησης απευθείας επιλογής και απευθείας εισαγωγής. Προς τούτο θα αναπτυχθούν οι συναρτήσεις: void straight_insert_string(char *p, int n); void straight_insert_int(int *s, int n); για την ταξινόμηση με απευθείας εισαγωγή και void straight_select_string(char *p, int n); void straight_select_int(int *s, int n); για την ταξινόμηση με απευθείας επιλογή. Ο κώδικας των μεθόδων ταξινόμησης παρατίθεται στις σημειώσεις του εργαστηρίου. Ο κώδικας της μεθόδου ταξινόμησης απευθείας επιλογής παρατίθεται στις σημειώσεις του εργαστηρίου, ενώ ο κώδικας για τον αλγόριθμο απευθείας εισαγωγής έχει ως ακολούθως: for (i = 1; i < N; i++) x = p[i]; j = i-1; while ((x < p[j]) && (j >= 0)) p[j+1] = p[j] ; j = j-1 ; p[j+1] = x ; 6

Να εμφανίζει στην οθόνη την εξέλιξη στα περιεχόμενα των πινάκων s και p σε κάθε βήμα των διαδικασιών ταξινόμησης, όπως φαίνεται ενδεικτικά στις ακόλουθες εικόνες: 7

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Τέταρτη εργασία A. Να καταστρωθεί πρόγραμμα <project_4_1.cpp> το οποίο να επιτελεί τις ακόλουθες εργασίες: Να δημιουργεί πίνακα χαρακτήρων p[] με περιεχόμενο το αλφαριθμητικό ASORTINGEXAMPLE και πίνακα ακεραίων s[] με περιεχόμενο την ακολουθία ακεραίων 44,55,12,42,94,18,06,67, η οποία θα βρίσκεται αποθηκευμένη στο αρχείο κειμένου int_input.txt. Να ταξινομεί τους ανωτέρω πίνακες με τις μεθόδους ταξινόμησης φυσαλίδας και quicksort. Προς τούτο θα αναπτυχθούν οι συναρτήσεις: void bubblesort_string(char *p, int n); για την ταξινόμηση φυσαλίδας και void quicksort_string(int left, int right, char *p); για την ταξινόμηση με τον αλγόριθμο quicksort. void bubblesort_int(int *s, int n); void quicksort_int(int left, int right, int *s); O κώδικας της μεθόδου ταξινόμησης φυσαλίδας παρατίθεται στις σημειώσεις του εργαστηρίου, ενώ ο κώδικας για τον αλγόριθμο quicksort έχει ως ακολούθως: if (left < right) i = left; j = right; mid = (left+right)/2; x = p[mid]; while (i < j) while (p[i] < x) i++; while (p[j] > x) if (i < j) if (p[i] == p[j]) if (i<mid) if (j>mid) j--; i++; j--; 8

else quicksort(left,j-1,p); quicksort(j+1,right,p); temp = p[i]; p[i] = p[j]; p[j] = temp; Να εμφανίζει στην οθόνη την εξέλιξη στα περιεχόμενα των πινάκων s και p σε κάθε βήμα των διαδικασιών ταξινόμησης, όπως φαίνεται ενδεικτικά στις ακόλουθες εικόνες: 9

B. Να καταστρωθεί πρόγραμμα <project_4_2.cpp>, το οποίο να διαβάζει από ένα προϋπάρχον αρχείο κειμένου (strings_input.txt) δέκα ονόματα των είκοσι χαρακτήρων κατά μέγιστο, να τα αποθηκεύει σε πίνακα αλφαριθμητικών και να τα ταξινομεί με τον αλγόριθμο φυσαλίδας, όπως φαίνεται ενδεικτικά στις ακόλουθες εικόνες (απαιτείται η χρήση των συναρτήσεων strcmp και strcpy για τη σύγκριση και αντιγραφή αλφαριθμητικών, αντίστοιχα): Γ. Να καταστρωθεί πρόγραμμα <project_4_3.cpp>, το οποίο να επιτελεί τις ακόλουθες εργασίες: Να δημιουργεί πίνακα ακεραίων p[], τον οποίο να ταξινομεί με τις μεθόδους της απευθείας επιλογής, της απευθείας εισαγωγής, της φυσαλίδας και την quicksort. Για την υλοποίησή τους θα κατασκευασθεί διεπαφή sorting_methods.h, η οποία θα περιλαμβάνει τις ήδη αναπτυχθείσες συναρτήσεις void straight_select_int(int *s, int n); void straight_insert_int(int *s, int n); void bubblesort_int(int *s, int n); void quicksort_int(int left, int right, int *s); Στον πίνακα θα αποδίδονται αρχικές τιμές με τη συνάρτηση int getuniquenumber(int *p, int i) (ο κώδικάς της δίνεται στις σημειώσεις του εργαστηρίου) και για κάθε μία μέθοδο θα υπολογίζεται ο συνολικός χρόνος υλοποίησης της ταξινόμησης με χρήση της συνάρτησης time (dos.h). Στο χρόνο εκτέλεσης δε θα προσμετράται ο χρόνος απόδοσης τιμών στον πίνακα, παρά μόνο ο χρόνος εκτέλεσης της εκάστοτε μεθόδου. Συγκεκριμένα, πριν τη λειτουργία κάθε μεθόδου θα εκτελείται ο κώδικας: gettime(&t); to = 360000*t.ti_hour + 6000*t.ti_min + 100*t.ti_sec + t.ti_hund; και μετά την ολοκλήρωση της μεθοδου θα εκτελείται ο κώδικας: 10

gettime(&t); t1 = 360000*t.ti_hour + 6000*t.ti_min + 100*t.ti_sec + t.ti_hund; Η διαφορά t1-t0 θα δίνει το χρόνο εκτέλεσης της μεθόδου σε εκατοστά του δευτερολέπτου. Ο πίνακας να ορισθεί αρκετά μεγάλος, π.χ. 30000 θέσεων, και να κρατηθεί ένα αντίγραφό του, έτσι ώστε κάθε μία από τις τέσσερις μεθόδους ταξινόμησης να εφαρμόζεται στις ίδιες αρχικές τιμές. Να εκτελεσθεί η τετράδα των μεθόδων ταξινόμησης 100 φορές για διαφορετικούς αρχικούς πίνακες με τη χρήση της συνάρτησης randomize και οι χρόνοι εκτέλεσης για τους τέσσερις διαφορετικούς αλγόριθμους στο αρχείο κειμένου results.txt, το οποίο θα περιλαμβάνει 100 γραμμές (που αφορούν στις δοκιμές) και 4 στήλες (που αφορούν στις μεθόδους σε κάθε δοκιμή). Το αρχείο να εισαχθεί ακολούθως σε λογιστικό φύλλο και να εξαχθούν στατιστικά συμπεράσματα για την επίδοση των τεσσάρων μεθόδων (μέση τιμή και τυπική απόκλιση του χρόνου εκτέλεσης, μέγιστος και ελάχιστος χρόνος εκτέλεσης). Ενδεικτικά αποτελέσματα σε Intel Pentium 4, 2.6GHz, 2003, όπου παρουσιάζονται οι τελευταίες 10 από τις συνολικές 100 δοκιμές: 11

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Πέμπτη εργασία Να καταστρωθεί πρόγραμμα <project_5.cpp>, το οποίο θα χρησιμοποιεί την Αντίστροφη Πολωνική Σημειογραφία (Reverse Polish Notation, RPN) και θα υπολογίζει την τιμή παράστασης μονοψήφιων ακεραίων. Ο υπολογισμός τής παράστασης θα γίνεται με χρήση μίας στοίβας, η οποία θα υλοποιείται με πίνακα. Η λειτουργία του προγράμματος θα έχει ως εξής: Η παράσταση ως ακολουθία χαρακτήρων, οι οποίοι θα διαβάζονται με χρήση της getchar() και θα ολοκληρώνεται με ENTER. Θα γίνεται έλεγχος κατά πόσον οι χαρακτήρες ανήκουν στο σύνολο 0,... 9, +, *, -, /. Κάθε φορά που θα διαβάζεται ένας τελεσταίος θα τοποθετείται στη στοίβα. Κάθε φορά που θα διαβάζεται ένας τελεστής, θα εξάγονται δύο τελεσταίοι από την κορυφή της στοίβας, θα γίνεται η ανάλογη αριθμητική πράξη και το αποτέλεσμα θα τοποθετείται πίσω στη στοίβα. Στην μεν πράξη της αφαίρεσης θα αφαιρείται ο πρώτος τελεσταίος από το δεύτερο, στη δε πράξη της διαίρεσης θα διαιρείται ο δεύτερος τελεσταίος με τον πρώτο, ενώ θα γίνεται και έλεγχος διαίρεσης με το μηδέν. Ο έλεγχος του είδους του χαρακτήρα που διαβάστηκε (τελεστής ή τελεσταίος) θα γίνεται με τη συνάρτηση isdigit() (περιέχεται στο ctype.h). Εφόσον διαβαστεί και ο τελευταίος χαρακτήρας του αλφαριθμητικού, το εναπομείναν στοιχείο της στοίβας θα είναι το αποτέλεσμα της παράστασης. Θα δημιουργηθεί αρχείο κεφαλίδας mystack.h, το οποίο θα φιλοξενεί τις απαιτούμενες συναρτήσεις (όπως παρουσιάζονται στις σημειώσεις του εργαστηρίου): void push(int stack[], int *t, int obj), για την εισαγωγή στοιχείου στη στοίβα (το μέγεθος της στοίβας δίνεται μέσω define στο αρχείο κεφαλίδας) int pop(int stack[], int *t), για την εξαγωγή στοιχείου από τη στοίβα 12

Μετά από κάθε ανάγνωση χαρακτήρα και ενέργεια επί της στοίβας, θα τυπώνεται ο αναγνωσθείς χαρακτήρας, χαρακτηριζόμενος κατά πόσον είναι τελεστής ή τελεσταίος, και θα εμφανίζεται στην οθόνη η τρέχουσα κατάσταση της στοίβας, όπως φαίνεται στο ακόλουθο στιγμιότυπο: Παρατηρήσεις: 1) Στον κώδικα λειτουργίας της στοίβας η μεταβλητή top, που εκφράζει την τρέχουσα κορυφή της στοίβας, είναι τύπου int. 2) Σε μία αριθμητική παράσταση σε RPN δεν υπάρχουν παρενθέσεις και οι τελεστές έπονται των τελεσταίων. Για παράδειγμα, η παράσταση 2 * ( 5 + 3 ) σε RPN γίνεται 5 3 + 2 *. 13

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Έκτη εργασία Να καταστρωθεί πρόγραμμα <project_6.cpp> για την εξυπηρέτηση αυτοκινήτων σε διόδια με την χρήση ουράς, η οποία θα υλοποιείται με πίνακα. Συγκεκριμένα: Θα δημιουργηθεί συνάρτηση int display_menu(), η οποία θα υλοποιεί το παρακάτω μενού: ΜΕΝU ====== 1.Car arrival 2.Car departure 3.Queue state 0.Exit (επιλογή για νέα άφιξη αυτοκινήτου) (επιλογή για αναχώριση αυτοκινήτου) (επιλογή για την εμφάνιση της τρέχουσας κατάστασης της ουράς) (επιλογή για έξοδο) Η επιλογή θα επιστρέφεται στην κύρια συνάρτηση και θα επιτελούνται οι ακόλουθες λειτουργίες: Επιλογή 1: Επιλογή 2: Επιλογή 3: Επιλογή 4: Θα πληκτρολογούνται τα στοιχεία της πινακίδας του αυτοκινήτου σε αλφαριθμητικό plate, το οποίο θα τοποθετείται στο τέλος της ουράς, με χρήση της συνάρτησης void enqueue(char **q, int *r, char *obj) Το αυτοκίνητο που βρίσκεται πρώτο στην ουρά θα διαγράφεται μαζί με ένα ανάλογο μήνυμα επιβεβαίωσης, με χρήση της συνάρτησης void dequeue(char **q, int *f, int r, int length) όπου length το μήκος του αλφαριθμητικού που φιλοξενεί την πινακίδα (7 + πιθανό κενό + \0\ = 9) Θα εμφανίζονται, με τη σειρά, οι πινακίδες των αυτοκινήτων που παραμένουν στην ουρά για να εξυπηρετηθούν, με χρήση της συνάρτησης void printqueue(char **q, int f, int r) Το πρόγραμμα θα τερματίζεται. 14

Οι τρεις ανωτέρω συναρτήσεις διαχείρισης της ουράς θα φιλοξενηθούν στο αρχείο κεφαλίδας myqueue.h. Οι πίνακες χαρακτήρων που θα απαιτηθούν στο κύριο πρόγραμμα, θα υλοποιηθούν με δυναμική δέσμευση μνήμης. Ο κώδικας των συναρτήσεων διαχείρισης της ουράς έχει ως ακολούθως: void enqueue(char **q, int *r, char *obj) if ((*r)==(n-1)) printf("queue is full..."); getch(); else strcpy(q[++(*r)],obj); void dequeue(char **q, int *f, int r, int length) if ((*f)==r) printf("queue is empty...\n"); else printf("%s has been served and deleted from the queue...", q[++(*f)]); void printqueue(char **q, int f, int r) int i; for (i=(f+1);i<=r;i++) printf("\n\tqueue[%d]=%s",i,q[i]); Ένα στιγμιότυπο των αποτελεσμάτων φιλοξενείται στην επόμενη σελίδα: 15

16

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Έβδομη εργασία Να καταστρωθεί πρόγραμμα <project_7.cpp>, το οποίο να κατασκευάζει μία ταξινομημένη συνδεδεμένη λίστα, σε κάθε κόμβο της οποίας να περιέχεται ένας χαρακτήρας. Συγκεκριμένα: Θα δημιουργηθεί συνάρτηση int display_menu(), η οποία θα υλοποιεί το παρακάτω μενού: ΜΕΝU ====== 1. List insert (επιλογή για εισαγωγή στοιχείου στη λίστα) 2. List delete (επιλογή για διαγραφή στοιχείου από τη λίστα) 3. List display (εμφάνιση των τρεχόντων περιεχομένων της λίστας) 0.Exit (επιλογή για έξοδο) Η επιλογή θα επιστρέφεται στην κύρια συνάρτηση και θα επιτελούνται οι ακόλουθες λειτουργίες: Επιλογή 1: Επιλογή 2: Επιλογή 3: Επιλογή 4: Θα πληκτρολογείται ένας νέος χαρακτήρας και θα εισάγεται σε ένα νέο κόμβο στη λίστα στη σωστή θέση, με χρήση της συνάρτησης PTR insert_to_list(ptr head, char c) Θα πληκτρολογείται ένας χαρακτήρας και, εφόσον βρεθεί στα περιεχόμενα της λίστας, θα διαγράφεται από αυτήν ο κόμβος που τον περιέχει, με χρήση της συνάρτησης PTR delete_from_list(ptr head, char c) Θα εμφανίζονται τα περιεχόμενα των κόμβων της λίστας, με χρήση της συνάρτησης void print_list(ptr head) Το πρόγραμμα θα τερματίζεται. Ο κώδικας των συναρτήσεων διαχείρισης της λίστας φιλοξενείται στις σημειώσεις του εργαστηρίου. 17

Οι τρεις ανωτέρω συναρτήσεις διαχείρισης της ουράς θα φιλοξενηθούν στο αρχείο κεφαλίδας mylist.h, στο οποίο θα δηλωθεί και ο τύπος δεδομένου για τον κόμβο της λίστας: struct node char data; struct node *next; ; typedef struct node * PTR; Ένα στιγμιότυπο των αποτελεσμάτων φιλοξενείται διαδοχικά στις ακόλουθες εικόνες: 18

19

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Όγδοη εργασία Να καταστρωθούν τα προγράμματα <project_8_1.cpp> και <project_8_2.cpp>, τα οποία θα υλοποιούν τα ζητούμενα των εργασιών 5 και 6, αντίστοιχα, με τη στοίβα και την ουρά να υλοποιούνται με χρήση δεικτών και λίστας. Ο κώδικας για τη διαχείριση της λίστας και της ουράς φιλοξενείται στις σημειώσεις του εργαστηρίου. Ο τύπος δεδομένου του κόμβου έχει ως εξής: struct node data_type 1 data; struct node *next; ; typedef struct node * PTR; Για να εκτυπώνονται τα περιεχόμενα της στοίβας μετά την εισαγωγή κάθε νέου χαρακτήρα, να ενταχθεί στο αρχείο κεφαλίδας (βλ. Εργασία 5) η ακόλουθη συνάρτηση: void print(ptr top) PTR current; current=top; if (current==null) printf("stack is empty. Press any key to continue\n"); 1 Ακέραιος για την εργασία 5, πίνακας χαρακτήρων για την εργασία 6. 20

else while (current!=null) printf("\t\t\t%d\n",current->data); current=current->next; Ενδεικτικό στιγμιότυπο των αποτελεσμάτων για την Εργασία 5 παρατίθεται ακολούθως: 21

Για να εκτυπώνονται τα περιεχόμενα της ουράς, να ενταχθεί στο αρχείο κεφαλίδας (βλ. Εργασία 6) η ακόλουθη συνάρτηση: void printqueue(ptr p) while (p!=null) printf("\n\t\t%s",p->data); p=p->next; Η κλήση της ανωτέρω συνάρτησης στο κύριο αρχείο θα γίνεται με την εντολή printqueue(front); Ένα στιγμιότυπο των αποτελεσμάτων για την Εργασία 6 φιλοξενείται στην επόμενη εικόνα: 22

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Ένατη εργασία Να καταστρωθεί πρόγραμμα <project_9.cpp> για τη διαχείριση και εφαρμογή δυαδικών δένδρων αναζήτησης. Συγκεκριμένα: Να διαβάζει τα ονόματα και τα τηλέφωνα διαφόρων ατόμων από ένα προϋπάρχον δυαδικό αρχείο και να τα τοποθετεί σε ένα δυαδικό δένδρο αναζήτησης. Η εισαγωγή των στοιχείων θα γίνεται με χρήση της συνάρτησης void insert_node(ptr *pt, struct personτ). Η δομή persont θα περιλαμβάνει τα αλφαριθμητικά όνομα και τηλέφωνο. Να υπολογίζει το πλήθος των κόμβων και το ύψος του δένδρου με χρήση των συναρτήσεων int count(ptr t) και int height(ptr t), αντίστοιχα. Να υλοποιείται το παρακάτω μενού με χρήση της συνάρτησης int display_menu(): ΜΕΝU ====== 1. Preorder traversal (επιλογή για προδιατεταγμένη διάσχιση του δένδρου) 2. Inorder traversal (επιλογή για ενδοδιατεταγμένη διάσχιση του δένδρου) 3. Postorder traversal (επιλογή για μεταδιατεταγμένη διάσχιση του δένδρου) 4. Tree search (επιλογή για αναζήτηση στοιχείου στο δένδρο, με κλειδί το όνομα) 0. Exit (επιλογή για έξοδο) Η επιλογή να επιστρέφεται στην κύρια συνάρτηση και να επιτελούνται οι ακόλουθες λειτουργίες: Επιλογή 1: Θα εμφανίζονται τα περιεχόμενα των κόμβων του δένδρου (δεδομένα και διευθύνσεις) με την προδιατεταγμένη μέθοδο διάσχισης και με χρήση της συνάρτησης void preorder_traversal(ptr t) 23

Επιλογή 2: Θα εμφανίζονται τα περιεχόμενα των κόμβων του δένδρου (δεδομένα και διευθύνσεις) με την ενδοδιατεταγμένη μέθοδο διάσχισης και με χρήση της συνάρτησης void inorder_traversal(ptr t) Επιλογή 3: Θα εμφανίζονται τα περιεχόμενα των κόμβων του δένδρου (δεδομένα και διευθύνσεις) με τη μεταδιατεταγμένη μέθοδο διάσχισης και με χρήση της συνάρτησης void postorder_traversal(ptr t) Επιλογή 4: Θα πληκτρολογείται ένα όνομα και θα αναζητείται στο δένδρο. Ακολούθως θα εμφανίζεται ένα μήνυμα αν η αναζήτηση ήταν επιτυχής ή όχι, το πλήθος των ελέγχων, καθώς επίσης και τα στοιχεία του κόμβου (όνομα και τηλέφωνο) εφόσον η αναζήτηση ήταν επιτυχής. Προς τούτο θα χρησιμοποιηθεί η συνάρτηση void find_node(ptr t, char *n, int i) Επιλογή 0: Το πρόγραμμα θα τερματίζεται. Όλες οι ανωτέρω συναρτήσεις διαχείρισης του δένδρου, πλην της int display_menu(), να φιλοξενηθούν στο αρχείο κεφαλίδας mytree.h. Ο βασικός κώδικας των συναρτήσεων insert_node, preorder_traversal, inorder_traversal και postorder_traversal βρίσκεται στις σημειώσεις του εργαστηρίου. Ο κώδικας των λοιπων συναρτήσεων διαχείρισης του δένδρου δίνεται ακολούθως: void find_node(ptr t, char *n, int i) i++; if (t==null) printf("\nthe node was not found.\n"); printf("number of searches:%d\n",i); else if (strcmp(t->data.name,n)==0) printf("\nthe node was found!!!\n"); printf("number of searches:%d\n",i); printf(" %s\n",t->data.name); 24

printf(" %s\n\n",t->data.phone); else if (strcmp(n,t->data.name)<0) find_node(t->left,n,i); else find_node(t->right,n,i); int count(ptr t) if (t==null) return(0); return(count(t->left)+count(t->right)+1); int height(ptr t) int u,v; if (t==null) return(-1); u=height(t->left); v=height(t->right); if (u>v) return(u+1); else return(v+1); 25

Ο τύπος δεδομένου του κόμβου, που δηλώνεται στο αρχείο κεφαλίδας mytree.h, έχει ως εξής: struct treenode persont data; struct treenode *left; struct treenode *right; typedef struct treenode *PTR; Να απεικονισθεί γραφικά η μορφή του δένδρου. Στις ακόλουθες εικόνες παρουσιάζονται ενδεικτικά αποτελέσματα και επικουρικά στοιχεία. Συγκεκριμένα. Εικόνα 1: Στιγμιότυπο των δεδομένων που εισάγονται στο δυαδικό αρχείο. Εικόνα 2: Αποτελέσματα επιτυχούς ανεπιτυχούς αναζήτησης ονόματος στο δένδρο. Εικόνα 3: Αποτελέσματα για το πλήθος των κόμβων και το ύψος του δένδρου. Εικόνα 4: Αποτελέσματα των τριών μεθόδων διάσχισης του δένδρου. Εικόνα 5: Απεικόνιση του δένδρου. 26

Εικόνα 1 Εικόνα 2 Εικόνα 3 27

(α) (β) (γ) Εικόνα 4 28

9392540 John 9392588 9392636 9392588 Jim 9392636 Julia 9392684 NULL NULL 9392732 9392684 Jane 9392732 Martha NULL 9392780 NULL 9392828 9392780 Lycy Timothy 9392828 NULL NULL NULL NULL Εικόνα 5 29

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Δέκατη εργασία Να καταστρωθεί πρόγραμμα <project_10.cpp> για την αναζήτηση σε γράφο. Συγκεκριμένα: Θεωρούμε τον ακόλουθο γράφο: Να υλοποιηθεί η μέθοδος αναζήτησης με προτεραιότητα πλάτους (Breadth First Search). Η αναπαράσταση του γράφου γίνεται με τη χρήση πίνακα διπλανών κορυφών. Οι συναρτήσεις που θα αναπτυχθούν να φιλοξενηθούν στο αρχείο κεφαλίδας mygraph.h. To αποτέλεσμα της αναζήτησης είναι το ακόλουθο: 30

Τμήμα Μηχανικών Πληροφορικής Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Εργαστήριο Δομών Δεδομένων Ενδέκατη εργασία Να καταστρωθεί πρόγραμμα <project_11.cpp> για την εφαρμογή των πινάκων κατακερματισμού με ξεχωριστή σύνδεση (separate chaining). Συγκεκριμένα: Να διαβάζει τα ονόματα και τα τηλέφωνα διαφόρων ατόμων από ένα προϋπάρχον δυαδικό αρχείο και να τα τοποθετεί στον πίνακα. Η εισαγωγή των στοιχείων θα γίνεται με χρήση της συνάρτησης void insert_person(ptr ht[], personτ p). Η δομή persont θα περιλαμβάνει τα αλφαριθμητικά όνομα και τηλέφωνο. Ο υπολογισμός της θέσης του νέου στοιχείου στον πίνακα θα γίνεται μέσω της συνάρτησης κατακερματισμού: strlen ( nam e ) 1 hashing _ value (int) nam e[ i] m od( N ) i 0 όπου mod το υπόλοιπο της διαίρεσης ακεραίων και N το μέγεθος του πίνακα κατακερματισμού. Η συνάρτηση υλοποιείται μέσω της int get_hash_val(char name[]), η οποία καλείται από την insert_person() λαμβάνοντας ως όρισμα το όνομα του στοιχείου, υπολογίζει τη θέση, την οποία και επιστρέφει στην insert_person(). Να υλοποιείται το παρακάτω μενού με χρήση της συνάρτησης int display_menu(): ΜΕΝU ====== 1. Find person (αναζήτηση ατόμου) 2. Display table (εμφάνιση πίνακα) 0. Exit (επιλογή για έξοδο) Η επιλογή να επιστρέφεται στην κύρια συνάρτηση και να επιτελούνται οι ακόλουθες λειτουργίες: 31

Επιλογή 1: Θα πληκτρολογείται ένα όνομα και θα αναζητείται στον πίνακα. Ακολούθως θα εμφανίζονται τα στοιχεία του ατόμου αν η αναζήτηση ήταν επιτυχής ή ένα ανάλογο μήνυμα αν η αναζήτηση ήταν ανεπιτυχής. Προς τούτο θα χρησιμοποιηθεί η συνάρτηση void find_person(ptr ht[], char name[], int *k). Επιλογή 2: Θα εμφανίζονται τα περιεχόμενα των κόμβων του πίνακα με χρήση της συνάρτησης void display_table(ptr ht[]). Όλες οι ανωτέρω συναρτήσεις διαχείρισης του δένδρου, πλην της display_menu(), να φιλοξενηθούν στο αρχείο κεφαλίδας myhash.h. Ο βασικός κώδικας των συναρτήσεων διαχείρισης του πίνακα κατακερματισμού, πλην της get_hash_val(), βρίσκεται στις σημειώσεις του εργαστηρίου. Ο τύπος δεδομένου του κόμβου, που δηλώνεται στο αρχείο κεφαλίδας myhash.h, έχει ως εξής: struct node persont data; struct node *next; typedef struct node *PTR; Στις ακόλουθες εικόνες παρουσιάζονται ενδεικτικά αποτελέσματα και επικουρικά στοιχεία. Για να καταδειχθεί η λειτουργία του πίνακα κατακερματισμού, το N τέθηκε ίσο με 4 και τα στοιχεία του αρχείου είναι 7. Συγκεκριμένα. Εικόνα 1: Αποτελέσματα επιτυχούς ανεπιτυχούς αναζήτησης ονόματος στον πίνακα. Εικόνα 1: Στιγμιότυπο των δεδομένων που έχουν εισαχθεί στον πίνακα. Εικόνα 3: Απεικόνιση του πίνακα κατακερματισμού, όπου εμφανίζεται η διάρθρωση της λίστας σε κάθε θέση του πίνακα. 32

Εικόνα 1 Εικόνα 2 33

3 κόμβοι στη λίστα της δεύτερης θέσης του πίνακα Εικόνα 3 34

ΒΙΒΛΙΟΓΡΑΦΙΑ 1. S. Andersen, Data structures in Java a laboratory course, Jones and Bartlett Publishers, 2002. 2. X. Κοίλιας, Δομές δεδομένων και οργανώσεις αρχείων, Εκδόσεις Νέων Τεχνολογιών, 2004. 3. Π. Μποζάνης, Αλγόριθμοι, Εκδόσεις Τζιόλα, 2006. 4. Π. Μποζάνης, Δομές δεδομένων, Εκδόσεις Τζιόλα, 2006. 5. Π. Μποζάνης, Προβλήματα και ασκήσεις στους αλγόριθμους, Εκδόσεις Τζιόλα, 2009. 6. Ευάγ. Ούτσιος, Αλγόριθμοι και δομές δεδομένων (σημειώσεις εργαστηρίου), Τ.Ε.Ι. Σερρών, 2004. 7. S. Sahni, Δομές δεδομένων, αλγόριθμοι και εφαρμογές στη C++, Εκδόσεις Τζιόλα, 2004. 8. R. Sedgewick, Αλγόριθμοι σε C, Μέρη 1-4 (θεμελιώδεις έννοιες, δομές δεδομένων, ταξινόμηση, αναζήτηση), 3 η έκδοση, Εκδόσεις Κλειδάριθμος, 2005. 9. N. Wirth, Αλγόριθμοι και δομές δεδομένων, Εκδόσεις Κλειδάριθμος, 2004. 35