6 int* create_tab(int tab
[], unsigned tab_size
) {
7 tab
= malloc(sizeof(int) * tab_size
);
9 /* initialize to zero the integer array */
10 for (unsigned i
= 0; i
< tab_size
; i
++) {
17 void free_tab(int tab
[]) {
21 /* we suppose both tabs are already created */
22 static void copy_tab(int src_tab
[], int dest_tab
[], unsigned src_tab_size
, unsigned index_offset
) {
23 /* FIXME: I think it's worth doing some sanity checks on the array size:
24 * dest_tab_size >= src_tab_size */
25 if (src_tab
== NULL
|| dest_tab
== NULL
) {
26 printf("please ensure you have created both arrays beforehand\n");
29 for (unsigned i
= 0; i
< src_tab_size
; i
++) {
30 dest_tab
[i
+ index_offset
] = src_tab
[i
];
34 /* one must free the two source tabs in case they will be unused after to concatenation */
35 int* concat_tab(int tab1
[], unsigned tab_size1
, int tab2
[], unsigned tab_size2
) {
37 tab_dest
= create_tab(tab_dest
, tab_size1
+ tab_size2
);
39 copy_tab(tab1
, tab_dest
, tab_size1
, 0);
40 copy_tab(tab2
, tab_dest
, tab_size2
, tab_size1
);
44 int* resize_tab(int tab
[], unsigned old_tab_size
, unsigned new_tab_size
) {
45 tab
= realloc(tab
, sizeof(int) * new_tab_size
);
46 if (old_tab_size
< new_tab_size
) {
47 for (unsigned i
= old_tab_size
; i
< new_tab_size
; i
++) {
54 /* number of occurences of an element in an unsorted array */
55 unsigned count_tab_element(int tab
[], unsigned tab_size
, int element
) {
56 unsigned el_count
= 0;
58 for (unsigned i
= 0; i
< tab_size
; i
++) {
59 if (tab
[i
] == element
) {
66 unsigned count_tab_criteria(int tab
[], unsigned tab_size
, c_criteria_cb c_criteria
) {
67 unsigned cr_count
= 0;
69 for (unsigned i
= 0; i
< tab_size
; i
++) {
70 if (c_criteria(tab
[i
])) {
86 void sort_tab(int tab
[], unsigned tab_size
, s_criteria_cb sort_criteria
) {
87 sort_bubble_array(tab
, tab_size
, sort_criteria
);