aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleiyu3 <s444814187@gmail.com>2022-09-22 13:47:34 -0400
committerleiyu3 <s444814187@gmail.com>2022-09-22 13:47:34 -0400
commitaa784eaece4425c6145419ea9d1baa5da51a3cc6 (patch)
treeb7870f82031ad67270f3b9dc288018a9e6c7b086
parentb7d835727149e2bbc23e018251138645da8baebb (diff)
downloadvector_c-aa784eaece4425c6145419ea9d1baa5da51a3cc6.tar.gz
vector_c-aa784eaece4425c6145419ea9d1baa5da51a3cc6.zip
add resizing
-rw-r--r--libvector.c37
-rw-r--r--vector.c120
-rw-r--r--vector.h4
-rw-r--r--vector_test.c32
4 files changed, 55 insertions, 138 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
44void push(vector_t *vec, int value){ 44void 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
56void insert(vector_t *vec, int index, int val){ 50void 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
87void remove_val(vector_t *vec, int value){ 77void 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
98void prepend(vector_t *vec, int value){ 89void 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
122int find(vector_t vec, int value){ 114int 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
123void 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
135void 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
diff --git a/vector.c b/vector.c
deleted file mode 100644
index 2c8f8d2..0000000
--- a/vector.c
+++ /dev/null
@@ -1,120 +0,0 @@
1#include <stdio.h>
2#include <stdlib.h>
3
4vector_t vector_init(int size){
5 vector_t vec;
6 vec.max_size = size;
7 vec.arr = malloc(sizeof(int)*vec.max_size);
8 vec.cur_size = 0;
9 return vec;
10}
11
12int size(vector_t vec){
13 return vec.cur_size;
14}
15
16int capacity(vector_t vec){
17 return vec.max_size;
18}
19
20int is_empty(vector_t vec){
21 if (vec.cur_size == 0){
22 return 1;
23 }
24 return 0;
25}
26
27int is_full(vector_t vec){
28 if (vec.cur_size >= vec.max_size){
29 return 1;
30 }
31 return 0;
32}
33
34int at(vector_t vec, int index){
35 if (index >= vec.max_size){
36 printf("Index out of bound!!\n");
37 exit(1);
38 }
39
40 return vec.arr[index];
41}
42
43void push(vector_t *vec, int value){
44 if (is_full(*vec)){
45 printf("Array out of Size!!\n\
46 Can't push!! \n\
47 Not yet implemented resize!!\n");
48 exit(1);
49 }
50
51 vec->arr[vec->cur_size] = value;
52 vec->cur_size++;
53}
54
55void insert(vector_t *vec, int index, int val){
56 if (is_full(*vec)){
57 printf("Array out of Size!!\n\
58 Can't insert!\n\
59 Not yet implemented resize!!\n");
60 exit(1);
61 }
62
63 int tmp;
64 for (int i = index; i <= vec->cur_size; i++){
65 tmp = val;
66 val = vec->arr[i];
67 vec->arr[i] = tmp;
68 }
69 vec->cur_size += 1;
70}
71
72void delete(vector_t *vec, int index){
73 if (!(index < vec->cur_size)){
74 printf("Invalid Index!\nFailed to Delete Element\n");
75 exit(-1);
76 }
77 int len = vec->cur_size - 1;
78
79 for (int i = index; i < len; i++){
80 vec->arr[i] = vec->arr[i+1];
81 }
82
83 vec->cur_size = vec->cur_size - 1;
84}
85
86void remove_val(vector_t *vec, int value){
87 int i = 0;
88 while (i < vec->cur_size){
89 if (vec->arr[i] == value){
90 delete(vec, i);
91 continue;
92 }
93 i++;
94 }
95}
96
97void prepend(vector_t *vec, int value){
98 insert(vec, 0, value);
99}
100
101int pop(vector_t *vec){
102 // remove item at the end, return value
103 int ret = vec->arr[vec->cur_size-1];
104 vec->cur_size--;
105 return ret;
106}
107
108void print_vec(vector_t vec){
109 printf("[");
110 for (int i = 0; i < vec.cur_size; i++){
111 printf("%d ", vec.arr[i]);
112
113 }
114 printf("]\n");
115}
116
117void destroy_vec(vector_t *vec){
118 free(vec->arr);
119}
120
diff --git a/vector.h b/vector.h
index 2dec5ec..aa91c89 100644
--- a/vector.h
+++ b/vector.h
@@ -21,6 +21,8 @@ void prepend(vector_t *vec, int value);
21int pop(vector_t *vec); 21int pop(vector_t *vec);
22void print_vec(vector_t vec); 22void print_vec(vector_t vec);
23void destroy_vec(vector_t *vec); 23void destroy_vec(vector_t *vec);
24int find(vector_t vec, int value); 24int find_vec(vector_t vec, int value);
25void resize_vec_check(vector_t *vec);
26void resize_vec(vector_t *vec, int new_capacity);
25 27
26#endif 28#endif
diff --git a/vector_test.c b/vector_test.c
index dcab29b..3fcfd46 100644
--- a/vector_test.c
+++ b/vector_test.c
@@ -84,7 +84,7 @@ Test(vectortests, delete_check){
84} 84}
85 85
86Test(vectortests, remove_test){ 86Test(vectortests, remove_test){
87 for (int i = 0; i < vec.max_size; i++){ 87 for (int i = 0; i < 16; i++){
88 if (i%2 == 0){ 88 if (i%2 == 0){
89 push(&vec, 5); 89 push(&vec, 5);
90 continue; 90 continue;
@@ -120,11 +120,37 @@ Test(vectortests, find_test){
120 push(&vec, 6); 120 push(&vec, 6);
121 push(&vec, 9); 121 push(&vec, 9);
122 122
123 cr_assert(find(vec, 9)==2); 123 cr_assert(find_vec(vec, 9)==2);
124 cr_assert(find_vec(vec, 99)==-1);
125}
126
127Test(vectortests, resize_test){
128 cr_assert(capacity(vec)==n);
129 resize_vec(&vec, 8);
130 cr_assert(capacity(vec)==8, "new capacity is %d", capacity(vec));
131 resize_vec(&vec, 32);
132 cr_assert(capacity(vec)==32, "new capacity is %d", capacity(vec));
133}
134
135Test(vectortests, resize_large_size_test){
136 for (int i = 0; i < 65; i++){
137 push(&vec, i);
138 }
124 139
125 cr_assert(find(vec, 99)==-1); 140 cr_assert(capacity(vec)==128);
126 141
142 for (int i = 0; i < 63; i++){
143 pop(&vec);
144 }
145
146 cr_assert(capacity(vec)==4, "capacity is %d", capacity(vec));
147
148 pop(&vec);
149
150 cr_assert(capacity(vec)==2, "capacity is %d", capacity(vec));
127} 151}
128 152
129 153
130 154
155
156