-
Notifications
You must be signed in to change notification settings - Fork 0
/
AdptArray.c
132 lines (108 loc) · 2.37 KB
/
AdptArray.c
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
125
126
127
128
129
130
131
132
#include <stdlib.h>
#include "AdptArray.h"
typedef struct AdptArray_
{
PElement* arr;
int size;
COPY_FUNC copy_element;
DEL_FUNC delete_element;
PRINT_FUNC print_element;
}AdptArray;
PAdptArray CreateAdptArray(COPY_FUNC copy, DEL_FUNC del, PRINT_FUNC print)
{
PAdptArray paa = (PAdptArray)malloc(sizeof(AdptArray));
paa->arr = NULL;
paa->size = 0;
paa->copy_element = copy;
paa->delete_element = del;
paa->print_element = print;
return paa; // NULL if malloc was failed.
}
void DeleteAdptArray(PAdptArray paa)
{
// free the elements inside the array.
for (int i = 0; i < paa->size; i++)
{
if (paa->arr[i])
{
paa->delete_element(paa->arr[i]);
paa->arr[i] = NULL;
}
}
// free the array itself.
if (paa->arr) {free(paa->arr);}
paa->arr = NULL;
// clean the rest.
paa->size = 0;
paa->copy_element = NULL;
paa->delete_element = NULL;
paa->print_element = NULL;
free(paa);
}
Result SetAdptArrayAt(PAdptArray paa, int index, PElement pe)
{
// index is exist
if (index < paa->size)
{
// free the older element if it was there.
if (paa->arr[index])
{
paa->delete_element(paa->arr[index]);
}
}
else
{
// if this is the first time of inserting element.
if (!paa->arr)
{
paa->arr = (PElement*)calloc(index + 1, sizeof(PElement));
if(paa->arr)
{
paa->size = index + 1;
}
else{ paa->size = -1; }
}
else
{
//paa->arr = (PElement*)realloc(paa->arr, sizeof(PElement) * (index + 1));
PElement* new_arr = (PElement*)calloc(index + 1, sizeof(PElement));
if(new_arr)
{
for (int i = 0; i < paa->size; i++)
{
new_arr[i] = paa->arr[i];
}
free(paa->arr);
paa->arr = new_arr;
paa->size = index + 1;
}
else { paa->size = -1; }
}
}
// assign a copy of the new element.
if(paa->size != -1) {paa->arr[index] = paa->copy_element(pe);}
return paa->size != -1 ? SUCCESS : FAIL;
}
PElement GetAdptArrayAt(PAdptArray paa, int index)
{
if (index >= paa->size)
{
return NULL;
}
PElement pe = paa->arr[index];
return pe != NULL ? paa->copy_element(pe) : NULL;
}
int GetAdptArraySize(PAdptArray paa)
{
return paa->size;
}
void PrintDB(PAdptArray paa)
{
for (int i = 0; i < paa->size; i++)
{
if (paa->arr[i])
{
paa->print_element(paa->arr[i]);
}
}
}