Το παρακάτω παράδειγμα ορίζει έναν ΑΤΔ για πίνακα ακεραίων δύο διαστάσεων με δυναμικά οριζόμενες διαστάσεις. Ο υπολογισμός της θέσης ενός στοιχείου γίνεται με τη απεικόνιση των δύο διαστάσεων του πίνακα στη μία διάσταση της δυναμικής μνήμης.
/* * Abstract Data Type Definition file array2d.h */ typedef struct s_array2d *array2d; array2d new_array2d(int rows, int cols); void array2d_set_value(array2d a, int row, int col, int val); int array2d_get_value(array2d a, int row, int col); void array2d_delete(array2d a);
/* * Abstract Data Type Implementation file array2d.c * 2D -> 1D mapping implementation */ #include <stdlib.h> #include <assert.h> #include "array2d.h" struct s_array2d { int *values; /* Value storage */ int rows, cols; /* Dimensions */ }; array2d new_array2d(int rows, int cols) { array2d a; a = (array2d)malloc(sizeof(struct s_array2d)); assert(a != NULL); a->values = (int *)malloc(rows * cols * sizeof(int)); assert(a->values != NULL); a->rows = rows; a->cols = cols; } void array2d_set_value(array2d a, int row, int col, int val) { assert(row > 0 && row < a->rows); assert(col > 0 && col < a->cols); a->values[row * a->cols + col] = val; } int array2d_get_value(array2d a, int row, int col) { assert(row > 0 && row < a->rows); assert(col > 0 && col < a->cols); return (a->values[row * a->cols + col]); } void array2d_delete(array2d a) { free(a->values); free(a); }
Εναλλακτικά, μπορούμε να υλοποιήσουμε τον πίνακα δύο διαστάσεων με βάση έναν πίνακα από δείκτες σε πίνακες μιας διάστασης. Η τεχνική αυτή υλοποίησης μπορεί να είναι αποδοτικότερη σε αρχιτεκτονικές όπου ο πολλαπλασιασμός διαρκεί μεγαλύτερο χρόνο από την πρόσβαση στη μνήμη ή σε περιπτώσεις όπου οι διαστάσεις των γραμμών του πίνακα δεν είναι όλες ίσες.
Οι δηλώσεις του ΑΤΔ παραμένουν φυσικά οι ίδιες.
/* * Abstract Data Type Implementation file array2d.c * Array of pointer implementation */ #include <stdlib.h> #include <assert.h> #include "array2d.h" struct s_array2d { int **values; /* Value storage */ int rows, cols; /* Dimensions */ }; array2d new_array2d(int rows, int cols) { array2d a; int i; a = (array2d)malloc(sizeof(struct s_array2d)); assert(a != NULL); a->values = (int **)malloc(rows * sizeof(int *)); assert(a->values != NULL); for (i = 0; i < rows; i++) { a->values[i] = (int *)malloc(cols * sizeof(int)); assert(a->values[i] != NULL); } a->rows = rows; a->cols = cols; } void array2d_set_value(array2d a, int row, int col, int val) { assert(row > 0 && row < a->rows); assert(col > 0 && col < a->cols); a->values[row][col] = val; } int array2d_get_value(array2d a, int row, int col) { assert(row > 0 && row < a->rows); assert(col > 0 && col < a->cols); return (a->values[row][col]); } void array2d_delete(array2d a) { int i; for (i = 0; i < a->rows; i++) free(a->values[i]); free(a->values); free(a); }