Η έννοια της δομής δεδομένων
Μια δομή δεδομένων είναι ένα γκρούπ σχετικών μεταβλητών που μπορούν να προσπελαστούν κάτω από κοινό όνομα. Κάθε μέλος της δομής δεδομένων έχει το δικό του τύπο, που μπορεί να είναι διαφορετικό από τα άλλα μέλη της δομής. Η σύνταξη ορισμού μιας δομής δεδομένων είναι η ακόλουθη:
struct structname{
tape1 member1;
tape2 member2;
. . .
};
Το όνομα της δομής structname είναι προερετικό. Στη δήλωση της δομής η δεξιά αγκύλη που τερματίζει την λίστα των μελών της δομής και μπορεί να ακολουθείται από μια λίστα μεταβλητών της δομής δεδομένων όπως σε κάθε βασικό τύπο. Το ακόλουθο παράδειγμα αναφέρεται σε μια κάρτα καταλόγου μιας βιβλιοθήκης.
struct catalog{
char author[40];
char title[40];
char pub[40];
unsigned int date;
unsigned int rev;
}card;
Εδώ η card δηλώνεται ως μια μεταβλητή της δομής catalog. Θα μπορούσαμε να δηλώσουμε και άλλες μεταβλητές της δομής, εισάγωντας τες στο τέλος με διαχωριστικό τον τελεστή κόμμα.
Μετά τη δήλωση της δομής του παραπάνω παραδείγματος, θα μπορούσαμε να δηλώσουμε μια νέα μεταβλητή δομής ως εξής:
struct catalog newcard;
Η δήλωση μιας δομής η οποία δεν ακολουθείται από ορισμό μεταβλητών δεν δεσμεύει μνήμη για αποθήκευση δεδομένων.
Ένα άλλο παράδειγμα δομής είναι η δήλωση μιας δομής δεδομένων που ορίζει ένα σημείο στο επίπεδο.
struct point {
int x;
int y;
};
Τώρα μπορούμε να δηλώσουμε ένα σημείο pt στο επίπεδο ως εξής:
struct point pt;
Για να προσπελάσουμε αυτή τη μεταβλητή που ορίζει το σημείο και να της δώσουμε τιμές, χρησιμοποιούμε τον τελεστή τελεία ως εξής:
pt.x = 10;
pt.y = 20;
δηλαδή το σημείο pt έχει συντεταγμένες (10, 20). Θα μπορούσαμε να δηλώσουμε το υπόδειγμα pt2 της δομής point, με άμεσο ορισμό των συντεταγμένων του ως εξής:
struct point {
int x;
int y;
} pt2 = {80, 90};
Κάνοντας χρήση του παραπάνω παραδείγματος μπορούμε να υπολογίσουμε το τετράγωνο της απόστασης του σημείου pt2 από την αρχή των αξόνων ως εξής:
sq_distance = pt2.x * pt2.x + pt2.y * pt2.y;
Μπορούμε να σχηματίζουμε φωλιασμένες δομές, έτσι μια δομή δεδομένων να έχει σαν μέλος μια άλλη δομή. Σαν παράδειγμα παίρνουμε τον ορισμό ενός κύκλου που να ορίζεται από το κέντρο του και την ακτίνα του. Ως συνέχεια του προηγούμενου παραδείγματος, έχουμε:
struct circle{
struct point center;
unsigned int radius;
};
Μπορούμε να έχουμε πίνακες που τα στοιχεία τους να είναι δομές δεδομένων. Σαν συνέχεια του παραπάνω παραδείγματος μπορούμε να ορίσουμε ένα πίνακα με τρία στοιχεία, τις κορυφές ενός τριγώνου, που να περιγράφονται από τη δομή δεδομένων point, ως εξής:
struct point triangle[3];
Όπου κάθε κορυφή του τριγώνου ορίζεται ως εξής:
triangle[0].x = 0;
triangle[0].y = 0;
triangle[1].x = 10;
triangle[1].y = 0;
triangle[2].x = 5;
triangle[2].y = 10;
Η εντολή typedef
Η γλώσσα C παρέχει την δυνατότητα να εκχωρούμε εναλλακτικά ονόματα σε ένα τύπο δεδομένων. Αυτό μπορεί να γίνει με την εντολή γνωστή ως typedef. Για παράδειγμα η εντολή:
typedef int Counter;
ορίζει το όνομα Counter σαν ισοδύναμο του τύπου δεδομένων int (ακέραιος) της C. Μεταβλητές μπορούν να δηλωθούν να είναι του τύπου Counter, όπως στην επόμενη εντολή:
Counter j, n;
O C compiler μεταχειρίζεται τις δηλώσεις των μεταβλητών j και n της προηγούμενης δήλωσης σαν να είναι κανονικές ακέραιες μεταβλητές. Από την δήλωση των μεταβλητών j και n τύπου Counter, φαίνεται ο σκοπός τους μέσα στο πρόγραμμα. Δηλώνοντας αυτές τις μεταβλητές σαν τον παραδοσιακό τύπο int δεν γίνεται σαφές για πιο σκοπό χρησιμοποιούνται. Επίσης εκλέγοντας ονόματα περισσότερο περιγραφικά θα μπορούσαμε να βοηθηθούμε με άλλο τρόπο.
Η επόμενη εντολή typedef δηλώνει το όνομα StringPtr ως ένας δείκτης σε χαρακτήρα:
typedef char *StringPtr
Μεταβλητές μπορούν να δηλωθούν με τύπο StringPtr, όπως:
StringPtr buffer1, buffer2;
Όπου ο compiler τις μεταχειρίζεται σαν δείκτες σε χαρακτήρα.
Στο επόμενο παράδειγμα ορίζεται ένας νέος τύπος με όνομα Date να είναι μια δομή, η οποία περιέχει τρεις ακέραιους αριθμούς με ονόματα month, day και year.
typedef struct{
int month;
int day;
int year;
} Date;
Με αυτό τον ορισμό typedef μπορούμε να δηλώσουμε μεταβλητές τύπου Date, όπως τον πίνακα:
Date birthdays[100];
Ο οποίος περιέχει 100 στοιχεία του τύπου δομής Date.