![]() |
ΠΟΛΥΤΕΧΝΕΙΟ
ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχ. και Μηχ. Υπολογιστών ΛΟΓ 102: Τεχνολογία Λογισμικού
Ι |
Η υλοποίηση της σταθεράς listEmpty καθώς και της συνάρτησης listInsert
είναι απλές και έχουν περιγραφεί αρκετές φορές στις παραδόσεις. Το ίδιο ισχύει
και για την υλοποίηση της συνάρτησης listPrint, η οποία μπορεί
να γίνει επαναληπτικά ή αναδρομικά.
Ένας απλός αλγόριθμος που μπορεί να χρησιμοποιηθεί για την υλοποίηση της listSort
είναι αυτός της ταξινόμησης με επιλογή, που περιγράφεται παρακάτω:
Τέλος, η υλοποίηση της συνάρτησης listReverse θα πρέπει να αντιστρέφει
τη φορά των δεικτών για κάθε κόμβο της λίστας.
Ο κόμβος του δυαδικού δένδρου μπορεί να παρασταθεί με μια δομή της μορφής:
typedef struct node_tag {
int data;
struct node_tag * left;
struct node_tag * right;
} node, * tree;
Η υλοποίηση της συνάρτησης treeSort πρέπει να εξασφαλίζει ότι
η ελάχιστη τιμή κάθε υποδένδρου βρίσκεται στη ρίζα του. Για το λόγο αυτό, είναι
ευκολότερο η υλοποίηση να να είναι αναδρομική. Ένας απλός αλγόριθμος είναι ο
ακόλουθος:
Φυσικά υπάρχουν και πολλοί άλλοι αλγόριθμοι (αναδρομικοί ή επαναληπτικοί) που οδηγούν σε σωστά αποτελέσματα.
Προκειμένου να ελέγξετε τη σωστή λειτουργία της treeSort, θα χρειαστεί
να υλοποιήσετε τη σταθερά treeEmpty και τις συναρτήσεις treeMake
και treePrint, που χρησιμοποιούνται στο κυρίως πρόγραμμα της εκφώνησης.
Η υλοποίηση των treeEmpty και treeMake είναι εξαιρετικά
απλή και δίνεται παρακάτω:
const tree treeEmpty = NULL;
tree treeMake(int i, tree l, tree r)
{
node * n = (node *) malloc(sizeof(node));
if (n != NULL) {
n->data = i;
n->left = l;
n->right = r;
}
return n;
}
Η υλοποίηση της treePrint μπορεί να γίνει πολύ εύκολα με αναδρομικό
τρόπο. Το μοναδικό σημείο που αξίζει προσοχής είναι η σωστή εκτύπωση των παρενθέσεων.
Χρησιμοποιήστε για υπόδειγμα τα αποτελέσματα της εκτύπωσης που δίνονται στο
τέλος της εκφώνησης.
nickie@softlab.ntua.gr).
20/4/2000
.