Professional Documents
Culture Documents
3ος Τόμος
13/3/2020
1
Σύμφωνα με τον Κανονισμό Σπουδών, η καταληκτική ημερομηνία για την παραλαβή της Γ.Ε. από το μέλος
ΣΕΠ είναι η επόμενη Τετάρτη από το τέλος της εβδομάδας παράδοσης Γ.Ε.
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Σελίδα 2 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Σελίδα 4 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Ένας γράφος Γ(Κ, Α) αποτελείται από ένα σύνολο κόμβων Κ και ένα σύνολο ακμών Α. Κάθε
ακμή συνδέει δύο κόμβους που κείνται στα άκρα της ακμής. Το πλήθος των ακμών που
συνδέονται με ένα κόμβο λέγεται βαθμός του κόμβου. Στο σχήμα εικονίζεται ένας γράφος με 5
κόμβους και 5 ακμές. Οι γράφοι είναι χρήσιμοι για περιγραφή διαφόρων φαινομένων, όπως οι
“φίλοι” σε ένα κοινωνικό δίκτυο, ένα ηλεκτρικό δίκτυο, η διάδοση μιας ασθένειας, κλπ. Η
αποθήκευση ενός γράφου μπορεί να γίνει με πολλούς τρόπους. Στην εργασία αυτή ζητείται να
αποθηκεύσουμε ένα μη κατευθυνόμενο γράφο (δηλαδή ένα γράφο στον οποίο δεν ορίζεται η
φορά διαπέρασης των ακμών) με χρήση δυναμικών δομών, οι οποίες επιτρέπουν την
αποθήκευση ενός γράφου χωρίς να ορίζεται εκ των προτέρων όριο στο μέγεθος του. Θα
θεωρήσουμε ότι οι κόμβοι αριθμούνται με συνεχόμενους ακέραιους αριθμούς ξεκινώντας από
το 0. Η δομή που θα χρησιμοποιηθεί είναι η δομή δυναμικού πίνακα (πίνακας που υλοποιείται
με δείκτη και δυναμική δέσμευση μνήμης) ο οποίος θα έχει πλήθος στοιχείων όσοι οι κόμβοι
του γράφου. Κάθε στοιχείο του πίνακα θα αντιστοιχεί σε έναν κόμβο του γράφου και θα είναι
μια λίστα με τους κόμβους με τους οποίους ο κόμβος αυτός είναι συνδεδεμένος. Υποθέτουμε
ότι ένας κόμβος δεν μπορεί να έχει ακμή με τον εαυτό του. Για παράδειγμα, έστω ο γράφος 5
κόμβων του σχήματος.
1
4
0
3
2
Η αποθήκευση του γράφου αυτού θα μπορούσε να αναπαρασταθεί στην παρακάτω δομή (εικόνα
4):
0 3 1
1 2 3 0
2 3 1
3 2 1 0
Σελίδα 5 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Στον παραπάνω πίνακα για να προσθέσουμε την ακμή (0,1) θα πρέπει να προσθέσουμε τον
κόμβο 1 στη λίστα του κόμβου 0 και τον κόμβο 0 στη λίστα του κόμβου 1. Η σειρά των
στοιχείων στις λίστες διασύνδεσης των κόμβων είναι τυχαία και εξαρτάται από τη σειρά των
κόμβων κατά τη διαδικασία προσθήκης στις αντίστοιχες λίστες.
Σελίδα 6 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
επιλογή:1
Πρόσθεσε ακμή μεταξύ των κόμβων 0 ως 4 (παράδειγμα: 0,4):1,3
>>> η ακμή ανάμεσα στους κόμβους 1 και 3 έχει προστεθεί
Επιλογή 3. Το πλήθος συνδέσεων ενός κόμβου (βαθμός του κόμβου), παράδειγμα διαλόγου:
επιλογή:3
Ζητείται:
Β. Να κατασκευάσετε συνάρτηση που εισάγει μια ακμή στο γράφο. Η συνάρτηση να δηλώνεται
ως int addEdge(struct Graph* graph, int src, int dest). Η συνάρτηση να
δέχεται ως ορίσματα ένα δείκτη προς τη δομή Graph, που περιέχει το γράφο και δύο ακέραιους
αριθμούς που είναι οι δύο κόμβοι τους οποίους συνδέει η ακμή. Στη συνάρτηση να γίνεται
έλεγχος αν η ακμή υπάρχει ήδη στον γράφο, έτσι ώστε να μην πραγματοποιείται εισαγωγή ακμής
εκ νέου. Επίσης, να υλοποιηθεί αμυντικός προγραμματισμός ώστε ένας κόμβος να μην έχει ακμή
με τον εαυτό του. Η συνάρτηση να επιστρέφει 1 αν η ακμή έχει εισαχθεί και 0 αν δεν έχει
εισαχθεί επιτυχώς.
Σελίδα 7 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Σελίδα 8 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
δέντρο Α δέντρο Β
7 20
6 14 9 33
31
1 10 30 3
29
(α) ο κόμβος 7 ως ρίζα του δέντρου Β (β) αριστερό υποδέντρο του (γ) δεξί υποδέντρο του
δέντρου Α δέντρου Α
7
3 20
6 14
9 33
1 10 30
31
29
Σχήμα 1
Τέλος, συγχωνεύουμε το δεξί υποδέντρο του Α (σχήμα 1γ) µε το δεξί του νέου Β, δηλαδή με
όλο το υποδέντρο με ρίζα τον κόμβο 20 (κόμβοι 20, 9, 33, 31, 29, σχήμα 2α). Πρώτα ο κόμβος
14 εισάγεται ως ρίζα του υποδέντρου με ρίζα τον κόμβο 20. Ο κόμβος 9, ως μικρότερος
Σελίδα 9 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
μετακινείται ως αριστερό παιδί του κόμβου 14, ενώ οι υπόλοιποι κόμβοι 33, 31 και 29
παραμένουν ως δεξί υποδέντρο του κόμβου 20 (σχήμα 3α).
Στη συνέχεια κατ’ αναλογία, το αριστερό υποδέντρο του δέντρου με ρίζα 14 (σχήμα 1γ), δηλαδή
ο κόμβος 10, θα συγχωνευθεί με το αριστερό υποδέντρο του νέου Β, που είναι ο κόμβος 9 (σχήμα
3α). Και τέλος, το δεξί υποδέντρο του δέντρου με ρίζα 14 (σχήμα 1γ), δηλαδή ο κόμβος 30, θα
συγχωνευθεί με το δεξί υποδέντρο του νέου Β, που είναι το υποδέντρο ρίζας 20 (κόμβοι 20, 33,
31, 29) (σχήμα 3α). Προκύπτει τελικά το ΔΔΑ του σχήματος 3β.
(α) ο κόμβος 6 ως ρίζα του υποδέντρου ρίζας 3 (β) αριστερό (γ) τελική διαμόρφωση του
υποδέντρο του αριστερού υποδέντρου
δέντρου Α ρίζας 7
7
(υπόλοιπο)
6 20 7
3 9 33
1 6
31 1
29 3
Σχήμα 2
14
7
9 20
14
6
33
10 30
1
31 33
9 20
3
29 31
29
Σχήμα 3
Σελίδα 10 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
δέντρο Α δέντρο Β
10
12
3 20
6 21
14
2 16
17 18
19
9 7
8 12 17 13
19 10 16 21 20
Σελίδα 11 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
δέντρο-σωρό μεγίστων που προκύπτει από τη διαγραφή αυτή, μαζί με μία σύντομη
αιτιολόγηση για το πώς αυτό προέκυψε.
iv. Κατασκευάστε ένα δυαδικό δέντρο αναζήτησης, εισάγοντας τα στοιχεία του δέντρου-
σωρού μεγίστων που προέκυψε μετά τη διαγραφή ρίζας (στο σκέλος iii), με τη σειρά
που συναντώνται κατά την ενδοδιατεταγμένη διαπέρασή του.
0 3 0 0 0 0 0 0 0 4
0 0 0 0 0 0 7 0 0 0
A= 0 0 0 0 0 0 0 0 0 0
0 0 0 0 8 0 0 0 0 0
Στην περίπτωση αραιών πινάκων είναι προτιμότερο από άποψη χώρου μνήμης να
αποθηκεύονται και να εκτελούνται πράξεις μόνο με τα μη-μηδενικά στοιχεία τέτοιων πινάκων
και να παραλείπεται η αποθήκευση των μηδενικών στοιχείων. Ένας αραιός πίνακας μπορεί να
αναπαρασταθεί είτε με πολλαπλές λίστες (Βοηθητικό Υλικό (study.eap.gr)- Τόμος Γ-
Εργαστηριακές Ασκήσεις σε Δομές Δεδομένων με τη Γλώσσα C, Άσκηση 2.2, όπου και
περιγράφεται η διαδικασία μετατροπής παραδοσιακού δισδιάστατου πίνακα σε πολλαπλές
λίστες) είτε με μία λίστα που είναι και η προσέγγιση που θα ακολουθήσουμε στην άσκηση αυτή.
Πιο συγκεκριμένα μία εναλλακτική μέθοδος αποθήκευσης ενός αραιού πίνακα στη μνήμη του
υπολογιστή είναι μέσω της χρήσης μίας απλά συνδεδεμένης λίστας, όπου κάθε μη μηδενικό
στοιχείο του πίνακα στη γραμμή i και στη στήλη j, αντιστοιχίζεται σε ένα κόμβο της. Κάθε
κόμβος περιέχει τον αριθμό της γραμμής και της στήλης στην οποία είναι αποθηκευμένο το
αντίστοιχο στοιχείο καθώς και την τιμή του. Τα στοιχεία στη λίστα εμφανίζονται σε σειρά
προσπέλασης του πίνακα ανά γραμμές (από αριστερά προς τα δεξιά και από πάνω προς τα
κάτω). Για παράδειγμα ο πίνακας Α θα αναπαρασταθεί με την ακόλουθη λίστα:
head 0 1 3 0 9 4 1 6 7 3 4 8 NULL
Σελίδα 12 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Είναι επίσης χρήσιμο, για να είναι εύκολη η επιβεβαίωση της εγκυρότητας πράξεων όπως ο
πολλαπλασιασμός πινάκων, να αποθηκεύεται πέρα από τη λίστα των μη μηδενικών στοιχείων
και το πλήθος των γραμμών και των στηλών του πίνακα.
Ας δούμε τώρα πως θα υλοποιηθούν τα όσα αναφέραμε στη γλώσσα C. Κάθε κόμβος της λίστας
θα έχει την πιο κάτω δομή node, η οποία έχει ως πεδία τρεις αριθμούς και ένα δείκτη σε ένα
κόμβο τύπου node. Το πρώτο πεδίο (row) αποθηκεύει τον αριθμό γραμμής, το δεύτερο πεδίο
(column) αποθηκεύει τον αριθμό της στήλης και το τρίτο πεδίο (value) αποθηκεύει την τιμή του
στοιχείου του πίνακα.
typedef struct node /* Κόμβος αποθήκευσης μη μηδενικού στοιχείου του
πίνακα */
{
int row; /* Γραμμή του στοιχείου */
int column; /* Στήλη του στοιχείου */
float value /* Τιμή του στοιχείου */
struct node * next; /* Επόμενο στοιχείο */
} node;
Κάθε πίνακας θα αναπαρίσταται από μία δομή τύπου table με τρία πεδία. To πρώτο πεδίο (head)
θα είναι δείκτης στην κεφαλή της λίστας που περιέχει τα μη μηδενικά στοιχεία του πίνακα το
δεύτερο πεδίο (number_of_rows) θα αποθηκεύει το πλήθος των γραμμών του πίνακα και το
τρίτο πεδίο (number_of_columns) θα αποθηκεύει το πλήθος των στηλών του πίνακα.
typedef struct table /* Δομή αναπαράστασης πίνακα */
{
node * head; /* Κεφαλή λίστας μη μηδενικών στοιχείων */
int number_of_rows; /* Πλήθος γραμμών */
int number_of_columns; /* Πλήθος στηλών */
} table;
Ζητείται να υλοποιήσετε συναρτήσεις που διαβάζουν τα στοιχεία ενός αραιού πίνακα, και
πολλαπλασιάζουν δύο αραιούς πίνακες που αναπαρίστανται σαν απλές συνδεδεμένες λίστες.
Πιο συγκεκριμένα ζητούνται τα εξής:
Α. Να ορίσετε συνάρτηση με όνομα void Entertable(table * input) που να ζητεί από
τον χρήστη τα στοιχεία ενός αραιού πίνακα που προσπελαύνεται μέσω ενός δείκτη με όνομα
input. Η συνάρτηση να ζητάει αρχικά να δοθεί το πλήθος των γραμμών και των στηλών, και
μετά να ζητάει τα μη μηδενικά στοιχεία του πίνακα ένα ένα ρωτώντας μετά από κάθε επανάληψη
τον χρήστη αν θέλει να συνεχίσει και να δώσει και άλλο στοιχείο. Πραγματοποιήστε αμυντικό
προγραμματισμό για να εγγυηθείτε ότι το πλήθος των γραμμών και στηλών είναι μεγαλύτερο
του μηδενός, ότι τα στοιχεία δίνονται ανά γραμμές (από αριστερά προς τα δεξιά και από πάνω
Σελίδα 13 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
προς τα κάτω) και ότι η γραμμή και η στήλη που δίνεται για τη θέση τους, δεν βγαίνει εκτός
ορίων πλήθους γραμμών και στηλών του πίνακα. Επίσης πρέπει να ελέγχετε ότι τα στοιχεία που
δίνονται είναι μη μηδενικά.
Β. Να ορίσετε μια συνάρτηση με όνομα void Multables(table table1, table
table2, table * table3) η οποία να παίρνει ως όρισμα δύο αραιούς πίνακες table1 και
table2, και να επιστρέφει το γινόμενο των δύο πινάκων μέσω ενός δείκτη σε πίνακα table3.
Υπενθυμίζεται (Τόμος Β- σελίδα 142-δραστηριότητα 6.4) ότι τo γινόμενο δύο πινάκων table1
διαστάσεων ΜxΝ και table2 διαστάσεων ΝxΤ είναι ένας νέος πίνακας διαστάσεων ΜxΤ όπου
το στοιχείο του στη γραμμή i και στήλη j προκύπτει αθροίζοντας τα γινόμενα κάθε στοιχείου
της γραμμής i του table1 με το αντίστοιχο στοιχείο της στήλης j του table2. Αν το πλήθος
στηλών του πίνακα table1 δεν είναι ίσο με το πλήθος γραμμών του πίνακα table2 τότε ο
πολλαπλασιασμός δεν ορίζεται. H συνάρτηση πρέπει να ελέγχει αν ο πολλαπλασιασμός ορίζεται
και αν όχι να επιστρέφει, αφήνοντας τον πίνακα στον οποίο δείχνει το όρισμα table3
αμετάβλητο. Επισημαίνεται ότι σε μερικές περιπτώσεις το αποτέλεσμα του πολλαπλασιασμού
δύο αραιών πινάκων μπορεί να μην είναι αραιό, όμως για τους σκοπούς της συνάρτησής μας
ζητάμε σε κάθε περίπτωση να επιστρέψουμε την αναπαράσταση του πίνακα αποτέλεσμα ως
λίστα.
Γενικές Υποδείξεις:
I) Για τις απαντήσεις της εργασίας μπορείτε να ανατρέξετε στην συμπληρωματική
βιβλιογραφία που δίνεται και στα βοηθητικά κείμενα που υπάρχουν στον δικτυακό τόπο /
portal της θεματικής ενότητας. Συνιστάται να προσθέσετε στο τέλος της εργασίας σας
κατάλογο βιβλιογραφίας.
II) Τρόπος παράδοσης εργασίας:
Οι απαντήσεις πρέπει να είναι γραμμένες με χρήση επεξεργαστή κειμένου (π.χ. Word) σε
σελίδες διαστάσεων Α4. Το αρχείο να περιέχει ως πρώτη σελίδα το κείμενο του Εντύπου
Υποβολής - Αξιολόγησης και ως δεύτερη σελίδα τον τίτλο «Σχόλια προς τον φοιτητή» (θα
συμπληρωθεί από τον καθηγητή σας). Οι απαντήσεις στις υπο-εργασίες θα αρχίζουν από
την τρίτη σελίδα, χωρίς να επαναλαμβάνονται οι εκφωνήσεις. Κάθε υπο-εργασία θα αρχίζει
από νέα σελίδα. Για την απάντησή σας θα πρέπει να χρησιμοποιείτε υποχρεωτικά το
Σελίδα 14 από 15
4η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
• Όλα τα .c αρχεία με τον πηγαίο κώδικα και το .doc αρχείο κειμένου να υποβληθούν στη
διεύθυνση http://study.eap.gr.
Σελίδα 15 από 15