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

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

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

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

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

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

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

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

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

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


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

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

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

Προγραµµατιστική Εργασία 1 ο Μέρος

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

Προγραµµατιστική Εργασία - 2 ο Μέρος

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

Προγραµµατιστική Εργασία 2 ο Μέρος

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 1 ο Μέρος

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

HY-486 Αρχές Κατανεμημένου Υπολογισμού

My Instagram Παρουσίαση Α Μέρους Προγραμματιστικής Εργασίας


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

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

Θεωρητικό Μέρος. 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); } }

Προγραμματιστική Εργασία

Προγραµµατιστική Εργασία 1 ο Μέρος

HY240 : Δομές Δεδομένων. Φροντιστήριο Προγραμματιστικής Εργασίας 2 ο και 3 ο Μέρος

Προγραμματιστική Εργασία Μέρος Β. Δρακωνάκης Κώστας Παπαϊωάννου Αντώνης

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

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

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

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

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

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

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

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

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

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

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

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

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

Santa Claus Παρουσίαση Α Μέρους Προγραμματιστικής Εργασίας

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

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

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

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

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

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

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

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

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

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

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

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

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

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

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

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

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

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

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

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

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

Ενηµερώσεις λογισµικού Οδηγός χρήσης

Πληροφορική 2. Δομές δεδομένων και αρχείων

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

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

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

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

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

h/2. Άρα, n 2 h/2-1 h 2log(n+1). Πως υλοποιούµε τη LookUp()? Πολυπλοκότητα?

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

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

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

Atlantis - Νέο user interface

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

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

Insert(K,I,S) Delete(K,S)

Ιεραρχία Οργανισµών Οι οργανισµοί που ζουν στο οικοσύστηµά µας κατατάσσονται σύµφωνα µε την παρακάτω ιεραρχία: Organisms

0 The quick brown fox leaped over the lazy lazy dog 1 Quick brown foxes leaped over lazy dogs for fun

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

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

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

Παρακάτω προτείνεται μια αλληλουχία ενεργειών την οποία ο χρήστης πρέπει να ακολουθήσει για να αξιοποιήσει τις δυνατότητες της εφαρμογής.

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

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

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

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

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

ΗΥ252 - Οντοκεντρικός Προγραµµατισµός Προγραµµατιστική Εργασία Εαρινού Εξαµήνου 2004 Περιγραφή Παραδοτέων

Transcript:

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος Ηµεροµηνία Παράδοσης: Δευτέρα, 3 Απριλίου 2017, ώρα 23:59. Τρόπος Παράδοσης: Χρησιµοποιώντας το πρόγραµµα turnin. Πληροφορίες για το πώς λειτουργεί το πρόγραµµα turnin παρέχονται στην ιστοσελίδα του µαθήµατος. Γενική Περιγραφή Στην εργασία αυτή καλείστε να υλοποιήσετε ένα πρόγραµµα που προσοµοιώνει τη λειτουργία ενός συστήµατος καταγραφής «σηµείων ενδιαφέροντος» (π.χ. ξενοδοχεία, µουσεία, εστιατόρια, αξιοθέατα), από τουριστικής απόψεως, για ένα σύνολο τοποθεσιών. Οι χρήστες του συστήµατος µπορούν να αντλήσουν από αυτό πληροφορίες για τις τοποθεσίες που σκοπεύουν να επισκεφτούν. Αναλυτική Περιγραφή Ζητούµενης Υλοποίησης Το σύστηµα αποτελείται από ένα σύνολο «σηµείων ενδιαφέροντος» (points of interest (POI)) τα οποία είναι οργανωµένα ανά τοποθεσία. Για κάθε τοποθεσία, θεωρείστε δεδοµένο ένα σηµείο αναφοράς (π.χ. 1

αυτό µπορεί να είναι κάποιο κεντρικό σηµείο της τοποθεσίας). Οι διαθέσιµες τοποθεσίες αποθηκεύονται σε µια απλά συνδεδεµένη λίστα, η οποία είναι ταξινοµηµένη, σε αύξουσα διάταξη, µε βάση το αναγνωριστικό της κάθε τοποθεσίας. Η λίστα αυτή ονοµάζεται λίστα τοποθεσιών. Ο κάθε κόµβος της λίστας είναι µια εγγραφή τύπου location (struct location) µε τα ακόλουθα πεδία: o o o lid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά την τοποθεσία. next: Δείκτης (τύπου location) στον επόµενο κόµβο της λίστας τοποθεσιών. poi_list: Ένας δείκτης (τύπου poi) στο πρώτο στοιχείο µιας διπλά συνδεδεµένης λίστας που ονοµάζεται λίστα σηµείων ενδιαφέροντος της τοποθεσίας. Η λίστα αυτή είναι ταξινοµηµένη βάσει της απόστασης του σηµείου ενδιαφέροντος από το σηµείο αναφοράς της κάθε τοποθεσίας. Κάθε στοιχείο της λίστας είναι µια εγγραφή τύπου poi (struct poi) µε τα παρακάτω πεδία: pid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά το σηµείο ενδιαφέροντος. distance: Ένας αριθµός (τύπου int) που αντιστοιχεί στην απόσταση του σηµείου ενδιαφέροντος µε αναγνωριστικό pid από το προηγούµενο σηµείο ενδιαφέροντος της ίδιας τοποθεσίας. Προσοχή για να υπολογίσετε την απόσταση ενός σηµείου ενδιαφέροντος poi x από το σηµείο αναφοράς της τοποθεσίας όπου ανήκει πρέπει να αθροίσετε τις αποστάσεις όλων των σηµείων ενδιαφέροντος που προηγούνται του poi x στη λίστα. type: Αναγνωριστικό (τύπου int) που αντιστοιχεί στην κατηγορία του σηµείου ενδιαφέροντος. Η µεταβλητή αυτή λαµβάνει τιµές από 1 µέχρι 4, µε κάθε τιµή να αντιστοιχεί σε µια κατηγορία (1: ξενοδοχείο, 2: µουσείο, 3: εστιατόριο, 4: αξιοθέατο) prev: Δείκτης (τύπου poi) στον προηγούµενο κόµβο της λίστας σηµείων ενδιαφέροντος της τοποθεσίας lid. next: Δείκτης (τύπου poi) στον επόµενο κόµβο της λίστας σηµείων ενδιαφέροντος της τοποθεσίας lid. Στο Σχήµα 1 παρουσιάζεται η λίστα των τοποθεσιών, ο κάθε κόµβος της οποίας περιέχει µια λίστα σηµείων ενδιαφέροντος. 2

Σχήµα 1: H απλά συνδεδεµένη λίστα τοποθεσιών, η οποία είναι ταξινοµηµένη σε αύξουσα διάταξη µε βάση το αναγνωριστικό της κάθε τοποθεσίας και οι λίστες σηµείων ενδιαφέροντος που δεικτοδοτούνται από κάθε κόµβο της. Η λίστα των σηµείων ενδιαφέροντος κάθε τοποθεσίας είναι διπλά συνδεδεµένη και ταξινοµηµένη βάσει της απόστασης από το σηµείο αναφοράς της τοποθεσίας. Το σύστηµα χρησιµοποιείται από ένα σύνολο χρηστών. Για το σκοπό αυτό θα δηµιουργήσετε µια απλά συνδεδεµένη, µη-ταξινοµηµένη λίστα µε κόµβο φρουρό, η οποία ονοµάζεται λίστα χρηστών. Ο κάθε κόµβος της λίστας είναι µια εγγραφή τύπου user (struct user) µε τα ακόλουθα πεδία: o o o uid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά τον χρήστη. next: Δείκτης (τύπου poi) στον επόµενο κόµβο της λίστας χρηστών. interesting_poi: Δείκτης (τύπου user_poi *) στο πρώτο στοιχείο µιας απλά συνδεδεµένης λίστας, η οποία ονοµάζεται λίστα σηµείων ενδιαφέροντος χρήστη. Η λίστα αυτή περιέχει τα σηµεία ενδιαφέροντος τα οποία σκοπεύει να επισκεφτεί ο χρήστης και είναι ταξινοµηµένη σε αύξουσα διάταξη βάσει του αναγνωριστικού των σηµείων ενδιαφέροντος. Κάθε στοιχείο της λίστας είναι µια εγγραφή τύπου user_poi (struct user_poi) µε τα παρακάτω πεδία: upid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά το σηµείο ενδιαφέροντος. next: Δείκτης (τύπου user_poi) στον επόµενο κόµβο της λίστας σηµείων ενδιαφέροντος του χρήστη uid. O κόµβος φρουρός της λίστας είναι ένας διαχειριστικός κόµβος για τον οποίο ισχύουν τα εξής: είναι και αυτός τύπου user µε την ιδιαιτερότητα ότι το πεδίο uid έχει τιµή -1 και οι δείκτες interesting_poi και next 3

έχουν τιµή NULL (δηλαδή δεν χρησιµοποιούνται). Το Σχήµα 2 απεικονίζει τη λίστα χρηστών. Σχήµα 2 Η µη ταξινοµηµένη λίστα χρηστών µε κόµβο φρουρό. Ο κάθε κόµβος (χρήστης) περιέχει µια απλά συνδεδεµένη, ταξινοµηµένη λίστα σηµείων ενδιαφέροντος χρήστη. 4

Τρόπος Λειτουργίας Προγράµµατος Το πρόγραµµα που θα δηµιουργηθεί θα πρέπει να εκτελείται καλώντας την ακόλουθη εντολή: <executable> <input-file> όπου <executable> είναι το όνοµα του εκτελέσιµου αρχείου του προγράµµατος (π.χ. a.out) και <input-file> είναι το όνοµα ενός αρχείου εισόδου (π.χ. testfile) το οποίο περιέχει γεγονότα των ακόλουθων µορφών: L <lid> Γεγονός που υποδηλώνει την εισαγωγή µιας νέας τοποθεσίας µε αναγνωριστικό <lid> στο σύστηµα. Κατά το γεγονός αυτό θα γίνεται εισαγωγή ενός νέου κόµβου τύπου location στη λίστα τοποθεσιών. Μετά από κάθε εισαγωγή, η λίστα τοποθεσιών πρέπει να παραµένει ταξινοµηµένη. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: L <lid> Locations = <lid 1 >, <lid 2 >,..., <lid n > όπου n είναι ο αριθµός των κόµβων στη λίστα τοποθεσιών και για κάθε i {1,, n}, <lid i > είναι το αναγνωριστικό της τοποθεσίας που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. P <pid> <type> <distance> <lid> Γεγονός που υποδηλώνει την εισαγωγή ενός νέου σηµείου ενδιαφέροντος µε αναγνωριστικό <pid> στην τοποθεσία µε αναγνωριστικό <lid>. H παράµετρος <type> αντιστοιχεί στον τύπο του σηµείου ενδιαφέροντος όπως περιγράφεται παραπάνω στο πρώτο σκέλος της εκφώνησης. Η παράµετρος <distance> περιγράφει την απόσταση του νέου σηµείου ενδιαφέροντος από το σηµείο αναφοράς της τοποθεσίας <lid>. Το γεγονός αυτό προσθέτει το νέο σηµείο ενδιαφέροντος στην κατάλληλη θέση βάσει του <distance> στη λίστα σηµείων ενδιαφέροντος της τοποθεσίας <lid>. Είναι αξιοσηµείωτο ότι το πεδίο distance της εγγραφής του νέου σηµείου ενδιαφέροντος πρέπει να περιέχει την απόσταση του από το σηµείο ενδιαφέροντος στην προηγούµενη θέση της λίστας και όχι την απόστασή του από το σηµείο αναφοράς της τοποθεσίας. Ωστόσο στην περίπτωση που το σηµείο ενδιαφέροντος είναι αυτό που βρίσκεται πιο κοντά στο σηµείο αναφοράς της τοποθεσίας (δηλ. ο πρώτος κόµβος της λίστας), τότε το πεδίο distance είναι η απόστασή του από το σηµείο αναφοράς. Σε περίπτωση που το νέο σηµείο ενδιαφέροντος τοποθετείται ανάµεσα σε υπάρχοντα σηµεία ενδιαφέροντος, τότε πρέπει να ενηµερώνεται κατάλληλα το πεδίο distance του κόµβου που θα είναι ο επόµενος του νέου κόµβου µετά την εισαγωγή. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: P <pid> <lid> <distance> Location = <pid 1 :type 1 :distance 1 >, <pid 2 :type 2 :distance 2 >, <pid n :type n :distance n > όπου n είναι ο αριθµός των κόµβων στη λίστα σηµείων ενδιαφέροντος της τοποθεσίας µε αναγνωριστικό <lid> και για κάθε i {1,, n}, <pid i > και <type i > είναι το αναγνωριστικό και ο τύπος αντίστοιχα τoυ σηµείου ενδιαφέροντος που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής και <distance i > η απόσταση 5

του i-οστού κόµβου της λίστας από τον προηγούµενο κόµβο. A <pid> <lid> Γεγονός που υποδηλώνει ότι ένα σηµείο ενδιαφέροντος µε αναγνωριστικό pid που βρίσκεται στην τοποθεσία µε αναγνωριστικό lid δεν θα είναι πλεόν διαθέσιµο στους επισκέπτες. Κατά το γεγονός αυτό αρχικά θα αναζητήσετε στη λίστα τοποθεσιών την τοποθεσία µε αναγνωριστικό lid και στη συνέχεια θα διαγράψετε από τη λίστα σηµείων ενδιαφέροντός της, τον κόµβο µε αναγνωριστικό pid. Μετά από τη διαγραφή, η λίστα των σηµείων ενδιαφέροντος της τοποθεσίας πρέπει να παραµένει ταξινοµηµένη. Επίσης θα πρέπει να ανανεωθεί το πεδίο τη απόστασης του επόµενου κόµβου απ αυτόν που διαγράφεται προσθέτοντας την απόσταση του κόµβου που θα διαγραφεί. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: A <pid> <lid> Location = <pid 1 :type 1 :distance 1 >, <pid 2 :type 2 :distance 2 >, <pid n :type n :distance n > όπου n είναι ο αριθµός των κόµβων στη λίστα σηµείων ενδιαφέροντος της τοποθεσίας µε αναγνωριστικό <lid> και για κάθε i {1,, n}, <pid i > και <type i > είναι το αναγνωριστικό και ο τύπος αντίστοιχα τoυ σηµείου ενδιαφέροντος που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής και <distance i > η απόσταση του i-οστού κόµβου της λίστας από τον προηγούµενο κόµβο. R <uid> Γεγονός που υποδηλώνει την εγγραφή ενός νέου χρήση µε αναγνωριστικό <uid> στο σύστηµα. Κατά το γεγονός αυτό θα γίνεται εισαγωγή ενός νέου κόµβου τύπου user στη λίστα χρηστών. Η κάθε εισαγωγή πρέπει να πραγµατοποιείται σε πολυπλοκότητα Ο(1). Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: R <uid> Users = <uid 1 >, <uid 2 >,..., <uid n > όπου n είναι ο αριθµός των κόµβων στη λίστα χρηστών και για κάθε i {1,, n}, <uid i > είναι το αναγνωριστικό του χρήστη που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. I <uid> <pid> Γεγονός που υποδηλώνει ότι ο χρήστης µε αναγνωριστικό uid ενδιαφέρεται για το σηµείο ενδιαφέροντος µε αναγνωριστικό pid. Κατά το γεγονός αυτό αρχικά θα πρέπει να γίνεται αναζήτηση του χρήστη µε αναγνωριστικό uid στη λίστα χρηστών. Στη συνέχεια θα γίνεται εισαγωγή του σηµείου ενδιαφέροντος µε αναγνωριστικό pid στη λίστα σηµείων ενδιαφέροντος του χρήστη στην κατάλληλη θέση (ώστε η λίστα να παραµένει ταξινοµηµένη µε βάση το αναγνωριστικό των σηµείων ενδιαφέροντος). Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: 6

I <uid> <pid> POI = <pid 1 >, <pid 2 >,..., <pid n > όπου n είναι ο αριθµός των κόµβων στη λίστα σηµείων ενδιαφέροντος του χρήστη µε αναγνωριστικό uid και για κάθε i {1,, n}, <pid i > είναι το αναγνωριστικό του σηµείου ενδιαφέροντος που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. G <uid 1 > <uid 2 > <uid 3 > Γεγονός που υποδηλώνει τη δηµιουργία µιας οµάδας τριών χρηστών µε αναγνωριστικά uid 1, uid 2, και uid 3 οι οποίοι θα περιηγηθούν µαζί στα κοινά σηµεία που τους ενδιαφέρουν. Κατά το γεγονός αυτό, αρχικά θα εντοπίσετε τους τρεις χρήστες στη λίστα χρηστών. Η διαδικασία αυτή θα πρέπει να επιτυγχάνεται µε πολυπλοκότητα O(n), όπου n είναι ο αριθµός των κόµβων της λίστας χρηστών (δηλαδή η αναζήτηση των 3 χρηστών θα πρέπει να γίνεται µε µία µόνο διάσχιση της λίστας). Στη συνέχεια θα πρέπει να εντοπίσετε τα κοινά σηµεία ενδιαφέροντος από τις λίστες των τριών χρηστών. Η διαδικασία αυτή (τοµή των τριών λιστών) πρέπει να επιτυγχάνεται µε πολυπλοκότητα O(m 1 + m 2 + m 3 ), όπου m 1, m 2 και m 3 είναι οι αριθµοί των κόµβων της λίστας ενδιαφέροντος του πρώτου, του δεύτερου και του τρίτου χρήστη, αντίστοιχα (ο αλγόριθµος υπολογισµού της τοµής που θα σχεδιάσετε θα πρέπει να διατρέχει την καθεµιά από τις τρεις αυτές λίστες το πολύ µια φορά). Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: G <uid 1 > <uid 2 > <uid 3 > User 1 = <pid 1,1 >, <pid 1,2 >,..., <pid 1,n1 > User 2 = <pid 2,1 >, <pid 2,2 >,..., <pid 2,n2 > User 3 = <pid 3,1 >, <pid 3,2 >,..., <pid 3,n3 > για κάθε j, 1 j 3, n j είναι το µέγεθος της λίστας σηµείων ενδιαφέροντος του χρήστη που αντιστοιχεί στην j-οστή παράµετρο του γεγονότος, και για κάθε i {1 n j }, pid i,j είναι το αναγνωριστικό του σηµείου ενδιαφέροντος που αντιστοιχεί στον i-στο κόµβο της λίστας σηµείων ενδιαφέροντος του j-οστού χρήστη. B <lid> <pid 1 > <pid 2 > <pid 3 > Γεγονός κατά το οποίο θα πρέπει να υπολογιστεί η απόσταση που πρέπει να διανύσει ένας επισκέπτης για να επισκεφτεί τα σηµεία ενδιαφέροντος µε αναγνωριστικά pid 1, pid 2 και pid 3 µε τη σειρά που αυτά δίνονται. Κατά το γεγονός αυτό, αρχικά πρέπει να αναζητήσετε την τοποθεσία µε αναγνωριστικό lid στη λίστα τοποθεσιών. Στη συνέχεια, θα εντοπίσετε τους κόµβους µε αναγνωριστικά pid 1, pid 2 και pid 3 στη λίστα σηµείων ενδιαφέροντος της τοποθεσίας, πραγµατοποιώντας ένα µόνο πέρασµα της λίστας αυτής. Γι αυτό το γεγονός, θα πρέπει να γνωρίζετε την κατεύθυνση (προς τα αριστερά ή προς τα δεξιά) που πρέπει να ακολουθήσετε για να µεταβείτε από τον κόµβο µε αναγνωριστικό pid 1 στον κόµβο µε αναγνωριστικό pid 2 και στη συνέχεια στον κόµβο µε αναγνωριστικό pid 3. Για το σκοπό αυτό θα 7

χρησιµοποιήσετε έναν βοηθητικό πίνακα τριών θέσεων µε περιεχόµενα δείκτες τύπου poi. Καθώς διατρέχετε τη λίστα σηµείων ενδιαφέροντος για να εντοπίσετε αυτά που δόθηκαν ως παράµετροι του γεγονότος, θα αποθηκεύετε στον βοηθητικό πίνακα δείκτες στους κόµβους που τους αντιστοιχούν µε τη σειρά που συναντάτε αυτούς τους κόµβους στη λίστα. Για παράδειγµα, χρησιµοποιώντας τις εγγραφές του Σχήµατος 1, θεωρήστε ότι οι παράµετροι του γεγονότος είναι: B 20 60 44 19. Τότε, αφού εντοπίσετε την τοποθεσία µε αναγνωριστικό 20, θα επικεντρωθείτε στη λίστα µε τα σηµεία ενδιαφέροντος αυτής της τοποθεσίας όπως φαίνεται στο Σχήµα 3α. Καθώς διατρέχετε τη λίστα, κάθε φορά που συναντάτε κάποιο απ τα σηµεία µε αναγνωριστικό 60, 44 ή 19 (τα οποία αποτελούν παραµέτρους του γεγονότος) θα αποθηκεύετε, στο βοηθητικό πίνακα, έναν δείκτη στον αντίστοιχο κόµβο µε τη σειρά που συναντάτε τους κόµβους αυτούς. Στο τέλος αυτής της διαδικασίας, ο πίνακας του παραδείγµατος θα περιέχει δείκτες στους κόµβους που αντιστοιχούν στα σηµεία αυτά µε την ακόλουθη σειρά: 44, 60, 19 (όπως φαίνεται στο Σχήµα 3β, όπου π.χ. η σηµειογραφία 44 υποδηλώνει έναν δείκτη στον κόµβο που αντιστοιχεί στο σηµείο ενδιαφέροντος µε αναγνωριστικό 44). Σχήµα 3 Στη συνέχεια χρησιµοποιώντας το δείκτη στο σηµείο ενδιαφέροντος της πρώτης παραµέτρου θα εξετάσετε αν πρέπει να διασχίσετε τη λίστα προς τα εµπρός ή προς τα πίσω. Για το σκοπό αυτό θα ελέγχετε αν το αναγνωριστικό του πρώτου σηµείου ενδιαφέροντος βρίσκεται σε προγενέστερη ή µεταγενέστερη θέση του πίνακα σε σχέση µε το αναγνωριστικό της δεύτερης παραµέτρου. Αν είναι σε µεταγενέστερη θέση, τότε σηµαίνει ότι πρέπει να διασχίσετε τη λίστα προς τα αριστερά (ακολουθώντας δείκτες prev) ενώ αν είναι σε προγενέστερη θέση, θα πρέπει να προχωρήσετε στη λίστα προς τα εµπρός. Στη συνέχεια, επαναλαµβάνετε την ίδια διαδικασία για το δεύτερο και τρίτο σηµείο ενδιαφέροντος που έχουν δοθεί ως παράµετροι στο γεγονός. Στο παραπάνω παράδειγµα το πρώτο σηµείο ενδιαφέροντος που δίνεται ως παράµετρος είναι το 60, το οποίο βρίσκεται στη δεύτερη θέση του βοηθητικού πίνακα. Το δεύτερο σηµείο ενδιαφέροντος είναι το 44 που βρίσκεται στην πρώτη θέση του βοηθητικού πίνακα. Αυτό σηµαίνει ότι ξεκινώντας από το σηµείο ενδιαφέροντος µε αναγνωριστικό 60, πρέπει να ακολουθήσουµε δείκτες prev για να εντοπίσουµε τον κόµβο µε αναγνωριστικό 44 (όπως φαίνονται στα δύο πρώτα βήµατα της εικόνας 3α). Στη συνέχεια εξετάζουµε το τρίτο σηµείο ενδιαφέροντος µε αναγνωριστικό 19, το οποίο βρίσκεται στην τρίτη θέση του βοηθητικού πίνακα. Αυτό σηµαίνει ότι το δεύτερο σηµείο βρίσκεται σε προγενέστερη θέση σε σχέση µε το τρίτο σηµείο. Αυτό σηµαίνει ότι πρέπει να προχωρήσουµε στη λίστα ακολουθώντας δείκτες next από το σηµείο 44 για να συναντήσουµε το σηµείο 19 (βήµατα 3-5 στην εικόνα 3α). 8

Για να υπολογίσετε την απόσταση που πρέπει να διανύσει ένας επισκέπτης για να µεταβεί από το ένα σηµείο ενδιαφέροντος στο άλλο όπως ορίζονται από τις παραµέτρους του γεγονότος, πρέπει να µετράτε και τις αποστάσεις των ενδιάµεσων κόµβων. Στο παραπάνω παράδειγµα για να µεταβεί κάποιος από το σηµείο ενδιαφέροντος 60 στο 44 πρέπει να περάσει από αυτό µε αναγνωριστικό 11. Άρα πρέπει να αθροίσετε την απόσταση από το 60 στο 11 και την απόσταση από το 11 στο 44. Αντίστοιχα για να µεταβεί ο επισκέπτης από το σηµείο 44 στο 19 πρέπει να αθροίσετε την απόσταση από το 44 στο 11, την απόσταση από το 11 στο 60 και από το 60 στο 19. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: B <lid> <pid 1 > <pid 2 > <pid 3 > Total distance: <distance> X Γεγονός τύπου print locations το οποίο σηµατοδοτεί την εκτύπωση όλων των τοποθεσιών από τη λίστα τοποθεσιών. Για την κάθε τοποθεσία θα πρέπει να εκτυπώνονται όλα τα σηµεία ενδιαφέροντός του. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: X LOCATIONS: Location 1 = <pid 1,1 :type 1,1 :distance 1,1 >,... <pid 1,n1 :type 1,n1 :distance 1,n1 > Location 2 = <pid 2,1 :type 2,1 :distance 2,1 >,... <pid 2,n2 :type 2,n2 :distance 2,n2 >... Location k = <pid k,1 :type k,1 :distance k,1 >,... <pid k,nk :type k,nk :distance k,nk > όπου k είναι ο αριθµός των κόµβων στη λίστα τοποθεσιών, για κάθε j, 1 j k, n j είναι το µέγεθος της λίστας σηµείων ενδιαφέροντος της j-οστής τοποθεσίας, και για κάθε ι {1 n j }, pid j,i, type j,i και distance j,i είναι το αναγνωριστικό, το είδος και η απόσταση αντίστοιχα του σηµείου ενδιαφέροντος που αντιστοιχεί στον i-στο κόµβο της λίστας της j-οστής τοποθεσίας. Y Γεγονός τύπου print users το οποίο σηµατοδοτεί εκτύπωση όλων των χρηστών της λίστας χρηστών. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: 9

Υ User 1 : <pid 1,1 >, <pid 1,2 >,... <pid 1,n1 > User 2 : <pid 2,1 >, <pid 2,2 >,... <pid 2,n2 >... User k : <pid k,1 >, <pid k,2 >,... <pid k,nk > όπου k είναι ο αριθµός των κόµβων στη λίστα χρηστών, για κάθε j, 1 j k, n j είναι το µέγεθος της λίστας σηµείων ενδιαφέροντος του j-οστού χρήστη, και για κάθε ι {1 n j }, pid j,i, είναι το αναγνωριστικό του σηµείου ενδιαφέροντος που αντιστοιχεί στον i-στο κόµβο της λίστας του j-οστού χρήστη. Z <uid> Γεγονός τύπου search user το οποίο σηµατοδοτεί την αναζήτηση του χρήστη µε αναγνωριστικό uid στη λίστα χρηστών. Όταν ο χρήστης εντοπιστεί θα πρέπει να εκτυπώνετε το ξενοδοχείο που διαµένει αλλά και τη λίστα µε τα σηµεία ενδιαφέροντός του. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: Z <uid> Hotel: <hotel-id> Interesting_poi: <poi 1 >, <poi 2 >,... <poi n >, όπου n είναι το µέγεθος της λίστας σηµείων ενδιαφέροντος του χρήστη µε αναγνωριστικό uid και για κάθε i {1,, n}, <pid i > είναι το αναγνωριστικό του σηµείου ενδιαφέροντος που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. 10

Βαθµολογία γεγονότων L 10 P 15 A 10 R 10 I 12 G 15 B 16 X 4 Y 4 Z 4 11

Δοµές Δεδοµένων Στην υλοποίησή σας δεν επιτρέπεται να χρησιµοποιήσετε έτοιµες δοµές δεδοµένων (πχ., ArrayList) είτε η υλοποίηση πραγµατοποιηθεί στη C είτε στη Java. Στη συνέχεια παρουσιάζονται οι δοµές σε C που πρέπει να χρησιµοποιηθούν για την υλοποίηση της παρούσας εργασίας. struct location { int lid; struct * poi poi_list; struct location * next; }; struct poi { int pid; int distance; int type struct poi * next; struct poi * prev; }; struct user { int uid; struct user_poi * interesting_poi; struct visitor * next; }; struct user_poi { int upid; struct user_poi * next; }; /* global variable, pointer to the beginning of the locations list*/ struct location * locations_list; /* global variable, pointer to the beginning of the users list*/ struct user * users_list; /* global variable, pointer to the sentinel node of the users list */ struct user * users_sentinel; 12

13