diff options
Diffstat (limited to 'libvector.c')
| -rw-r--r-- | libvector.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/libvector.c b/libvector.c index 69537ab..f099e34 100644 --- a/libvector.c +++ b/libvector.c | |||
| @@ -42,24 +42,13 @@ int at(vector_t vec, int index){ | |||
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | void push(vector_t *vec, int value){ | 44 | void push(vector_t *vec, int value){ |
| 45 | if (is_full(*vec)){ | 45 | resize_vec_check(vec); |
| 46 | printf("Array out of Size!!\n\ | ||
| 47 | Can't push!! \n\ | ||
| 48 | Not yet implemented resize!!\n"); | ||
| 49 | exit(-1); | ||
| 50 | } | ||
| 51 | |||
| 52 | vec->arr[vec->cur_size] = value; | 46 | vec->arr[vec->cur_size] = value; |
| 53 | vec->cur_size++; | 47 | vec->cur_size++; |
| 54 | } | 48 | } |
| 55 | 49 | ||
| 56 | void insert(vector_t *vec, int index, int val){ | 50 | void insert(vector_t *vec, int index, int val){ |
| 57 | if (is_full(*vec)){ | 51 | resize_vec_check(vec); |
| 58 | printf("Array out of Size!!\n\ | ||
| 59 | Can't insert!\n\ | ||
| 60 | Not yet implemented resize!!\n"); | ||
| 61 | exit(1); | ||
| 62 | } | ||
| 63 | 52 | ||
| 64 | int tmp; | 53 | int tmp; |
| 65 | for (int i = index; i <= vec->cur_size; i++){ | 54 | for (int i = index; i <= vec->cur_size; i++){ |
| @@ -82,6 +71,7 @@ void delete_vec(vector_t *vec, int index){ | |||
| 82 | } | 71 | } |
| 83 | 72 | ||
| 84 | vec->cur_size = vec->cur_size - 1; | 73 | vec->cur_size = vec->cur_size - 1; |
| 74 | resize_vec_check(vec); | ||
| 85 | } | 75 | } |
| 86 | 76 | ||
| 87 | void remove_val(vector_t *vec, int value){ | 77 | void remove_val(vector_t *vec, int value){ |
| @@ -93,6 +83,7 @@ void remove_val(vector_t *vec, int value){ | |||
| 93 | } | 83 | } |
| 94 | i++; | 84 | i++; |
| 95 | } | 85 | } |
| 86 | resize_vec_check(vec); | ||
| 96 | } | 87 | } |
| 97 | 88 | ||
| 98 | void prepend(vector_t *vec, int value){ | 89 | void prepend(vector_t *vec, int value){ |
| @@ -103,6 +94,7 @@ int pop(vector_t *vec){ | |||
| 103 | // remove item at the end, return value | 94 | // remove item at the end, return value |
| 104 | int ret = vec->arr[vec->cur_size-1]; | 95 | int ret = vec->arr[vec->cur_size-1]; |
| 105 | vec->cur_size--; | 96 | vec->cur_size--; |
| 97 | resize_vec_check(vec); | ||
| 106 | return ret; | 98 | return ret; |
| 107 | } | 99 | } |
| 108 | 100 | ||
| @@ -119,7 +111,7 @@ void destroy_vec(vector_t *vec){ | |||
| 119 | free(vec->arr); | 111 | free(vec->arr); |
| 120 | } | 112 | } |
| 121 | 113 | ||
| 122 | int find(vector_t vec, int value){ | 114 | int find_vec(vector_t vec, int value){ |
| 123 | for (int i = 0; i < size(vec); i++){ | 115 | for (int i = 0; i < size(vec); i++){ |
| 124 | if (at(vec, i) == value){ | 116 | if (at(vec, i) == value){ |
| 125 | return i; | 117 | return i; |
| @@ -128,3 +120,20 @@ int find(vector_t vec, int value){ | |||
| 128 | return -1; | 120 | return -1; |
| 129 | } | 121 | } |
| 130 | 122 | ||
| 123 | void resize_vec_check(vector_t *vec){ | ||
| 124 | int capacity = vec->max_size; | ||
| 125 | int cur_size = vec->cur_size; | ||
| 126 | |||
| 127 | if (cur_size == capacity){ | ||
| 128 | resize_vec(vec, capacity*2); | ||
| 129 | } | ||
| 130 | if (cur_size <= capacity/4){ | ||
| 131 | resize_vec(vec, capacity/2); | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 135 | void resize_vec(vector_t *vec, int new_capacity){ | ||
| 136 | vec->arr = (int*)realloc(vec->arr, sizeof(int)*new_capacity); | ||
| 137 | vec->max_size = new_capacity; | ||
| 138 | } | ||
| 139 | |||
