-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathADTVector.h
124 lines (85 loc) · 6.86 KB
/
ADTVector.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
///////////////////////////////////////////////////////////////////
//
// ADT Vector
//
// Abstract "array" μεταβλητού μεγέθους. Παρέχει πρόσβαση σε
// οποιοδήποτε στοιχείο (μέσω της θέσης του), και προσθήκη/αφαίρεση
// στοιχείων στο τέλος του vector.
//
///////////////////////////////////////////////////////////////////
#pragma once // #include το πολύ μία φορά
#pragma once // #include το πολύ μία φορά
// Τύποι που χρησιμοποιούνται σε πολλά modules
// Χρήση του τύπου "bool" για μεταβλητές που παίρνουν μόνο τιμές true / false
#include <stdbool.h>
// Pointer προς ένα αντικείμενο οποιουδήποτε τύπου. Απλά είναι πιο ευανάγνωστο από το "void*" που μοιάζει με το "void"
typedef void* Pointer;
// unsigned int, για συντομία
typedef unsigned int uint;
// Δείκτης σε συνάρτηση που συγκρίνει 2 στοιχεία a και b και επιστρέφει:
// < 0 αν a < b
// 0 αν a και b είναι ισοδύναμα (_όχι_ αναγναστικά ίσα)
// > 0 αν a > b
typedef int (*CompareFunc)(Pointer a, Pointer b);
// Δείκτης σε συνάρτηση που καταστρέφει ένα στοιχείο value
typedef void (*DestroyFunc)(Pointer value);
// Ένα vector αναπαριστάται από τον τύπο Vector. Ο χρήστης δε χρειάζεται να γνωρίζει το περιεχόμενο
// του τύπου αυτού, απλά χρησιμοποιεί τις συναρτήσεις vector_<foo> που δέχονται και επιστρέφουν Vector.
//
// Ο τύπος Vector ορίζεται ως pointer στο "struct vector" του οποίου το περιεχόμενο είναι άγνωστο
// (incomplete struct), και εξαρτάται από την υλοποίηση του ADT Vector.
//
typedef struct vector* Vector;
// Δημιουργεί και επιστρέφει ένα νεό vector μεγέθους size, με στοιχεία αρχικοποιημένα σε NULL.
// Αν destroy_value != NULL, τότε καλείται destroy_value(value) κάθε φορά που αφαιρείται (ή αντικαθίσταται) ένα στοιχείο.
Vector vector_create(int size, DestroyFunc destroy_value);
// Επιστρέφει τον αριθμό στοιχείων που περιέχει το vector vec.
int vector_size(Vector vec);
// Προσθέτει την τιμή value στο _τέλος_ του vector vec. Το μέγεθος του vector μεγαλώνει κατά 1.
// Αν δεν υπάρχει διαθέσιμη μνήμη το vector παραμένει όπως ήταν (αυτό μπορεί να ελεγχθεί με τη vector_size)
void vector_insert_last(Vector vec, Pointer value);
// Αφαιρεί το τελευταίο στοιχείο του vector. Το μέγεθος του vector μικραίνει κατά 1.
// Αν το vector είναι κενό η συμπεριφορά είναι μη ορισμένη.
void vector_remove_last(Vector vec);
// Επιστρέφει την τιμή στη θέση pos του vector vec (μη ορισμένο αποτέλεσμα αν pos < 0 ή pos >= size)
Pointer vector_get_at(Vector vec, int pos);
// Αλλάζει την τιμή στη θέση pos του Vector vec σε value.
// ΔΕΝ μεταβάλλει το μέγεθος του vector, αν pos >= size το αποτέλεσμα δεν είναι ορισμένο.
void vector_set_at(Vector vec, int pos, Pointer value);
// Βρίσκει και επιστρέφει το πρώτο στοιχείο στο vector που να είναι ίσο με value
// (με βάση τη συνάρτηση compare), ή NULL αν δεν βρεθεί κανένα στοιχείο.
int vector_find(Vector vec, Pointer value, CompareFunc compare);
int compare_ints(Pointer a, Pointer b);
// Αλλάζει τη συνάρτηση που καλείται σε κάθε αφαίρεση/αντικατάσταση στοιχείου σε
// destroy_value. Επιστρέφει την προηγούμενη τιμή της συνάρτησης.
DestroyFunc vector_set_destroy_value(Vector vec, DestroyFunc destroy_value);
// Ελευθερώνει όλη τη μνήμη που δεσμεύει το vector vec.
// Οποιαδήποτε λειτουργία πάνω στο vector μετά το destroy είναι μη ορισμένη.
void vector_remove(Vector vec,int index);
void vector_destroy(Vector vec);
void vector_print(Vector vec);
// Διάσχιση του vector ////////////////////////////////////////////////////////////
//
// Οι παρακάτω συναρτήσεις επιτρέπουν τη διάσχιση του vector μέσω κόμβων.
// Δεν είναι τόσο συχνά χρησιμοποιούμενες όσο για άλλα ADTs, γιατί μπορούμε
// εύκολα να διασχίσουμε το array και μέσω indexes. Παραμένουν πάντως χρήσιμες,
// τόσο για ομοιομορφία με τους άλλους ADTs, αλλά και γιατί για κάποιες υλοποιήσεις
// η διάσχιση μέσω κόμβων μπορεί να είναι πιο γρήγορη.
char* get_element_at(struct vector* vec, int i);
// Οι σταθερές αυτές συμβολίζουν εικονικούς κόμβους _πριν_ τον πρώτο και _μετά_ τον τελευταίο
#define VECTOR_BOF (VectorNode)0
#define VECTOR_EOF (VectorNode)0
typedef struct vector_node* VectorNode;
// Επιστρέφουν τον πρώτο και τον τελευταίο κομβο του vector, ή VECTOR_BOF / VECTOR_EOF αντίστοιχα αν το vector είναι κενό
VectorNode vector_first(Vector vec);
VectorNode vector_last(Vector vec);
// Επιστρέφουν τον επόμενο και τον προηγούμενο κομβο του node, ή VECTOR_EOF / VECTOR_BOF
// αντίστοιχα αν ο node δεν έχει επόμενο / προηγούμενο.
VectorNode vector_next(Vector vec, VectorNode node);
VectorNode vector_previous(Vector vec, VectorNode node);
VectorNode vector_get(Vector vec,int i);
// Επιστρέφει το περιεχόμενο του κόμβου node
Pointer vector_node_value(Vector vec, VectorNode node);
// Βρίσκει το πρώτο στοιχείο στο vector που να είναι ίσο με value (με βάση τη συνάρτηση compare).
// Επιστρέφει τον κόμβο του στοιχείου, ή VECTOR_EOF αν δεν βρεθεί.
VectorNode vector_find_node(Vector vec, Pointer value, CompareFunc compare);