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
133
134
135
136
137
138
139
|
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
vector_t vector_init(int size){
vector_t vec;
vec.max_size = size;
vec.arr = malloc(sizeof(int)*vec.max_size);
vec.cur_size = 0;
return vec;
}
int size(vector_t vec){
return vec.cur_size;
}
int capacity(vector_t vec){
return vec.max_size;
}
int is_empty(vector_t vec){
if (vec.cur_size == 0){
return 1;
}
return 0;
}
int is_full(vector_t vec){
if (vec.cur_size >= vec.max_size){
return 1;
}
return 0;
}
int at(vector_t vec, int index){
if (index >= size(vec) || index < 0){
printf("Index out of bound!!\n");
exit(-1);
}
return vec.arr[index];
}
void push(vector_t *vec, int value){
resize_vec_check(vec);
vec->arr[vec->cur_size] = value;
vec->cur_size++;
}
void insert(vector_t *vec, int index, int val){
resize_vec_check(vec);
int tmp;
for (int i = index; i <= vec->cur_size; i++){
tmp = val;
val = vec->arr[i];
vec->arr[i] = tmp;
}
vec->cur_size += 1;
}
void delete_vec(vector_t *vec, int index){
if (!(index < vec->cur_size)){
printf("Invalid Index!\nFailed to Delete Element\n");
exit(-1);
}
int len = vec->cur_size - 1;
for (int i = index; i < len; i++){
vec->arr[i] = vec->arr[i+1];
}
vec->cur_size = vec->cur_size - 1;
resize_vec_check(vec);
}
void remove_val(vector_t *vec, int value){
int i = 0;
while (i < vec->cur_size){
if (vec->arr[i] == value){
delete_vec(vec, i);
continue;
}
i++;
}
resize_vec_check(vec);
}
void prepend(vector_t *vec, int value){
insert(vec, 0, value);
}
int pop(vector_t *vec){
// remove item at the end, return value
int ret = vec->arr[vec->cur_size-1];
vec->cur_size--;
resize_vec_check(vec);
return ret;
}
void print_vec(vector_t vec){
printf("[");
for (int i = 0; i < vec.cur_size; i++){
printf("%d ", vec.arr[i]);
}
printf("]\n");
}
void destroy_vec(vector_t *vec){
free(vec->arr);
}
int find_vec(vector_t vec, int value){
for (int i = 0; i < size(vec); i++){
if (at(vec, i) == value){
return i;
}
}
return -1;
}
void resize_vec_check(vector_t *vec){
int capacity = vec->max_size;
int cur_size = vec->cur_size;
if (cur_size == capacity){
resize_vec(vec, capacity*2);
}
if (cur_size <= capacity/4){
resize_vec(vec, capacity/2);
}
}
void resize_vec(vector_t *vec, int new_capacity){
vec->arr = (int*)realloc(vec->arr, sizeof(int)*new_capacity);
vec->max_size = new_capacity;
}
|