K08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού
Κώστας Χατζηκοκολάκης
A collection of data and operations that
ADTBookStore (from the first lecture)
insert(title)
remove(title)
find(title)
Do we know any such type?
int
implemented?int a = -2;
store in memory?
10...10
(sign-magnitude)1111101
(1-complement)1111110
(2-complement)a++
implemented?int a = 1
stores some representation of 1 in a
a++
stores the representation of $a+1$ in a
a
printf("%d", a)
prints the number $a$ represented in a
We can write programs without thinking (or even knowing) about how these operations are implemented
We can change the implementation of int
(eg change the CPU) without changing the code
It would be impossible to write complex programs without these features!
ADTFoo will be represented by the module ADTFoo.h
To use ADTFoo
#include "ADTFoo.h"
foo_create()
foo.o
(or some library containing it)To implement ADTFoo
foo.c
, implementing all functionsThe ADTs we learn in this class are containers
Store values of any type: void*
They have similar interfaces
ADT | Description |
---|---|
ADTVector | An abstract growable “array” |
ADTList | Insert at any position, no “random access” |
ADTQueue | First-in, First-out |
ADTStack | Last-in, First-out |
ADTPriorityQueue | Fast-access of the maximum element |
ADTMap | Associate key => value (array with any type of index) |
ADTSet | Ordered collection of unique items |
We use different names for ADTs and Data Structures
Loosely following the naming of the C++ standard library
Be careful: each ADT/DS is known under many different names
Remember the substance, not just the names!
// ADTFoo.h
// Ένα foo αναπαριστάται από τον τύπο Foo. Ο χρήστης δε χρειάζεται να
// γνωρίζει το περιεχόμενο του τύπου αυτού, απλά χρησιμοποιεί τις συναρτήσεις
// foo_* που δέχονται και επιστρέφουν Foo.
typedef struct foo* Foo;
struct foo
variables or access their contentstruct foo
created by the module
Foo
typedef we forget that they are pointers!// Δημιουργεί και επιστρέφει ένα νεό foo
Foo foo_create();
// Επιστρέφει τον αριθμό στοιχείων που περιέχει το foo
int foo_size(Foo foo);
// Προσθέτει την τιμή value στο foo
void foo_insert(Foo foo, Pointer value, ...);
// Αφαιρεί και επιστρέφει μια τιμή από το foo
Pointer foo_remove(Foo foo, ...);
// Βρίσκει και επιστρέφει ένα στοιχείο από το foo
Pointer foo_find(Foo foo, ...);
// Ελευθερώνει όλη τη μνήμη που δεσμεύει το foo
void foo_destroy(Foo foo);
#include "ADTFoo.h"
int main() {
Foo foo = foo_create();
// Προσθήκη στοιχείων στον ADT
foo_insert(foo, int_pointer1);
foo_insert(foo, int_pointer2);
// Εύρεση στοιχείου
int* value = foo_find(foo, ...);
printf("found: %d", *value);
// Αφαίρεση στοιχείου
foo_remove(foo, ...);
// Εκκαθάριση μνήμης
foo_destroy(foo);
}
Using the concept of node.
Foo foo = foo_create();
// ...insert...
// Διάσχιση όλων των στοιχείων (η σειρά εξαρτάται από τον ADT)
for(FooNode node = foo_first(foo); // ξενικάμε από τον πρώτο κόμβο
node != FOO_EOF; // μέχρι να φτάσουμε στο EOF
node = foo_next(foo, node)) { // μετάβαση στον επόμενο κόμβο
int* value = foo_node_value(foo, node); // η τιμή του συγκεκριμένου κόμβου
printf("value: %d\n", *value);
}