Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.38 KB | None | 0 0
  1. Vector vc1 now contains 5 characters (capacity=8): ciao
  2. Vector vc2 now contains 9 characters (capacity=16): ciaociao
  3. Vector vc2 now contains 11 characters (capacity=16): ciao--ciao
  4. Vector vi1 now contains 10 integers: 0 1 2 3 4 5 6 7 8 9
  5. Vector vc2 now contains 21 characters (capacity=32): ciao-0123456789-ciao
  6. Vector vc2 now contains 5 characters (capacity=8): ciao
  7. Vector vd1 now contains 10 doubles (capacity=16): 9.5 8.5 6.5 5.5 3.14159 4.5 3.5 2.5 1.5 0.5
  8. Vector vd1 now contains 1 double (capacity=2): 6.28318
  9. Vector vi1 now contains 2 integers (capacity=4): 0 9
  10.  
  11. #include "vector.h"
  12.  
  13.  
  14. void fail(const char* msg){
  15. fprintf(stderr,"nERROR: %snn",msg);
  16. exit(1);
  17. }
  18.  
  19.  
  20. void * check_a(void*p){
  21. if ( p == NULL )
  22. fail("check_a(): NULL pointer");
  23. return p;
  24. }
  25.  
  26.  
  27. vector_type v_create_empty(char type){
  28. vector_type my_v = (vector_type)check_a(malloc(sizeof(struct vector_struct)));
  29.  
  30. my_v->e_sz = (type == V_INT ? sizeof(int) : type == V_DOUBLE ? sizeof(double) : 1);
  31.  
  32. my_v->e_type = type;
  33. my_v->no_e = my_v->cur_cap = 0;
  34. my_v->e_array = NULL;
  35. return my_v;
  36. }
  37.  
  38.  
  39. void v_destroy(vector_type my_v){
  40. if ( my_v == NULL )
  41. return;
  42.  
  43. /*** TO BE DONE START ***/
  44. free(my_v->e_array); //THIS IS WHAT I'VE ADDED
  45. /*** TO BE DONE END ***/
  46.  
  47. free((void*)my_v);
  48. }
  49.  
  50.  
  51. void* v_at(vector_type v, iterator i) {
  52. if ( v == NULL )
  53. fail("v_at() Error: no such vector");
  54. if ( i == iterator_end )
  55. i = v->no_e -1;
  56. if ( i < 0 || i >= v->no_e )
  57. fail("v_at() Error: no such element in this vector");
  58.  
  59. /*** TO BE DONE START ***/
  60. else //THIS IS WHAT I'VE ADDED
  61. v->e_array[i];
  62. /*** TO BE DONE END ***/
  63.  
  64. }
  65.  
  66.  
  67. void v_push_back(vector_type v, void* new_val){
  68. if ( v->no_e >= v->cur_cap ) {
  69. /*** need to expand the array ***/
  70. v->cur_cap += (v->cur_cap)? v->cur_cap : 2;
  71.  
  72. /*** TO BE DONE START ***/
  73.  
  74. /*** TO BE DONE END ***/
  75.  
  76. }
  77. /*** copy new_val into the array at end position (v->no_e) ***/
  78.  
  79. /*** TO BE DONE START ***/
  80. v->e_array[v->no_e] = e_array //THIS IS WHAT I'VE ADDED
  81. v->e_array[v->e_sz++] = e_array;
  82. /*** TO BE DONE END ***/
  83.  
  84. (v->no_e)++;
  85. }
  86.  
  87.  
  88. void v_pop_back(vector_type v){
  89. if ( v == NULL )
  90. fail("v_pop_back(): no such vector");
  91. if ( v->no_e == 0 )
  92. return;
  93. if ( --(v->no_e) < ((v->cur_cap)>>1) ) {
  94. /*** reallocate a smaller array ***/
  95. (v->cur_cap) >>= 1;
  96.  
  97. /*** TO BE DONE START ***/ //THIS IS WHAT I'VE ADDED (but I'm lost on this one)
  98. // for (int i = 0; i < v->no_e - 1; i++) {
  99. // v->e_array[i] = v->e_array[i + 1];
  100. // v->e_array[i + 1] = NULL;
  101. // }
  102. // v->no_e--;
  103. /*** TO BE DONE END ***/
  104.  
  105. }
  106. }
  107.  
  108.  
  109. void v_insert_n(vector_type v,iterator start_i,unsigned n,void* new_val){
  110. char tmp[v->e_sz];
  111. int i;
  112. unsigned to_move;
  113.  
  114. if ( n==0 ) /*** nothing to insert ***/
  115. return;
  116. if ( v == NULL )
  117. fail("v_insert_n(): no such vector");
  118. if ( start_i == iterator_end )
  119. start_i = v->no_e;
  120. if ( start_i < 0 )
  121. fail("v_insert_n(): bad iterator");
  122.  
  123. /*** a zero element of suitable size ***/
  124. memset((void*)tmp,0,v->e_sz);
  125.  
  126. if ( start_i >= v->no_e ) {
  127. /*** want to append past the end ***/
  128. /*** fill the possible gap with zero elements... ***/
  129. while ( start_i > v->no_e )
  130. v_push_back(v,(void*)tmp);
  131. /*** ...then append new elements at end ***/
  132. for (i=0; i<n; i++)
  133. v_push_back(v,new_val);
  134. return;
  135. }
  136.  
  137. /*** want to insert at intermediate position ***/
  138. /*** expand the array by appending zero elements ***/
  139. /*** then move some elements towards end to make room ***/
  140.  
  141. to_move = v->no_e - start_i;
  142.  
  143. for (i=0; i<n; i++)
  144. v_push_back(v,tmp);
  145.  
  146. for (i=0; i<to_move; i++)
  147. memcpy (
  148. v->e_array + (v->no_e-1-i) * v->e_sz,
  149. v->e_array + (v->no_e-1-i-n) * v->e_sz,
  150. v->e_sz);
  151.  
  152. /*** now copy new elements in the room ***/
  153. for (i=0; i<n; i++) {
  154.  
  155. /*** TO BE DONE START ***/
  156.  
  157. /*** TO BE DONE END ***/
  158.  
  159. }
  160. }
  161.  
  162.  
  163. void v_erase_range(vector_type v,iterator start_i,iterator end_i){
  164. int i, j;
  165.  
  166. if ( v == NULL )
  167. fail("v_erase_range(): no such vector");
  168. if ( start_i == iterator_end )
  169. start_i = v->no_e-1;
  170. if ( end_i == iterator_end )
  171. end_i = v->no_e;
  172. if ( start_i < 0 || start_i >= v->no_e || end_i < 0 )
  173. fail("v_erase_range(): bad iterator");
  174. if ( start_i >= end_i ) /*** nothing to erase ***/
  175. return;
  176.  
  177. for ( i = start_i, j = end_i ; j < v->no_e ; i++, j++ )
  178. memcpy(
  179. v->e_array + (v->e_sz) * i,
  180. v->e_array + (v->e_sz) * j,
  181. v->e_sz);
  182.  
  183. /*** call v_pop_back() to actually erase elements ***/
  184. /*** TO BE DONE START ***/
  185.  
  186. /*** TO BE DONE END ***/
  187.  
  188. }
  189.  
  190. #include "vector.h"
  191.  
  192. #include <stdio.h>
  193. #include <stdlib.h>
  194.  
  195. int main(){
  196. vector_type vi1, vd1, vc1, vc2;
  197. char c1;
  198. int i1;
  199. double d1;
  200.  
  201. vi1 = v_create_empty(V_INT);
  202. vd1 = v_create_empty(V_DOUBLE);
  203. vc1 = v_create_empty(V_CHAR);
  204. vc2 = v_create_empty(V_CHAR);
  205.  
  206. c1 = 'c'; v_push_back(vc1,(void*)&c1);
  207. c1 = 'i'; v_push_back(vc1,(void*)&c1);
  208. c1 = 'a'; v_push_back(vc1,(void*)&c1);
  209. c1 = 'o'; v_push_back(vc1,(void*)&c1);
  210. c1 = 0; v_push_back(vc1,(void*)&c1);
  211.  
  212. printf("Vector vc1 now contains %d characters (capacity=%1d): %sn",
  213. vector_size(vc1),vector_capacity(vc1),vector_string(vc1));
  214.  
  215. for ( i1 = 0, c1 = vector_char_at(vc1,i1) ; c1 ; i1++, c1 = vector_char_at(vc1,i1) )
  216. v_push_back(vc2,(void*)&c1);
  217. for ( i1 = 0, c1 = vector_char_at(vc1,i1) ; c1 ; i1++, c1 = vector_char_at(vc1,i1) )
  218. v_push_back(vc2,(void*)&c1);
  219. v_insert_n(vc2,iterator_end,1,(void*)&c1); /*** inserting 0 at the end ***/
  220.  
  221. printf("Vector vc2 now contains %d characters (capacity=%1d): %sn",
  222. vector_size(vc2),vector_capacity(vc2),vector_string(vc2));
  223.  
  224. c1 = '-'; v_insert_n(vc2,vector_size(vc1)-1,2,(void*)&c1);
  225.  
  226. printf("Vector vc2 now contains %d characters (capacity=%1d): %sn",
  227. vector_size(vc2),vector_capacity(vc2),vector_string(vc2));
  228.  
  229. for ( i1 = 0 ; i1 < 10 ; i1++ )
  230. v_push_back(vi1,(void*)&i1);
  231.  
  232. printf("Vector vi1 now contains %d integers: ",vector_size(vi1));
  233. for ( i1 = 0 ; i1 < vector_size(vi1) ; i1++ )
  234. printf(" %1d",vector_int_at(vi1,i1));
  235. printf("n");
  236.  
  237. for ( i1 = 0 ; i1 < vector_size(vi1) ; i1++ ) {
  238. c1 = '0' + vector_int_at(vi1,i1); /*** converting decimal number to char ***/
  239. v_insert_n(vc2,5+i1,1,(void*)&c1);
  240. }
  241.  
  242. printf("Vector vc2 now contains %d characters (capacity=%1d): %sn",
  243. vector_size(vc2),vector_capacity(vc2),vector_string(vc2));
  244.  
  245. v_erase_range(vc2,2,3+vector_size(vc1)+vector_size(vi1));
  246.  
  247. printf("Vector vc2 now contains %d characters (capacity=%1d): %sn",
  248. vector_size(vc2),vector_capacity(vc2),vector_string(vc2));
  249.  
  250. v_destroy(vc1); v_destroy(vc2);
  251.  
  252. for ( i1 = vector_size(vi1)-1 ; i1 >= 0 ; i1-- ) {
  253. d1 = 0.5 + (double)(vector_int_at(vi1,i1));
  254. v_push_back(vd1,(void*)&d1);
  255. }
  256. d1 = 3.14159192; /*** approximation of Pi ***/
  257. v_insert_n(vd1,5,1,(void*)&d1);
  258. v_erase_range(vd1,2,3);
  259.  
  260. printf("Vector vd1 now contains %d doubles (capacity=%1d): ",
  261. vector_size(vd1),vector_capacity(vd1));
  262. for ( i1 = 0 ; i1 < vector_size(vd1) ; i1++ )
  263. printf(" %lg",vector_double_at(vd1,i1));
  264. printf("n");
  265.  
  266. d1 = vector_double_at(vd1,8) + vector_double_at(vd1,9); /*** d1 = 1.5+0.5 = 2.0 ***/
  267. v_erase_range(vd1,0,4); /*** erase first 4 elements **/
  268. vector_double_at(vd1,0) *= d1; /*** 2*Pi at index 0 ***/
  269. v_erase_range(vd1,1,iterator_end); /*** erase all elements but the first ***/
  270.  
  271. printf("Vector vd1 now contains %d double (capacity=%1d): ",
  272. vector_size(vd1),vector_capacity(vd1));
  273. for ( i1 = 0 ; i1 < vector_size(vd1) ; i1++ )
  274. printf(" %lg",vector_double_at(vd1,i1));
  275.  
  276. /*** TO BE DONE START ***/
  277. d1 = vector_double_at(vd1,8) + vector_double_at(vd1,9); /*** d1 = 1.5+0.5 = 2.0 ***/
  278. /*** TO BE DONE END ***/
  279.  
  280. v_erase_range(vi1,1,9); /*** erase elements 1,...,8 ***/
  281. printf("Vector vi1 now contains %d integers (capacity=%1d): ",
  282. vector_size(vi1),vector_capacity(vi1));
  283. for ( i1 = 0 ; i1 < vector_size(vi1) ; i1++ )
  284. printf(" %1d",vector_int_at(vi1,i1));
  285. printf("n");
  286. v_destroy(vi1);
  287.  
  288. exit(0);
  289. }
  290.  
  291. #ifndef vECTOR_h
  292. #define vECTOR_h
  293.  
  294. #include <string.h>
  295. #include <stdio.h>
  296. #include <stdlib.h>
  297.  
  298. typedef int iterator;
  299. #define iterator_begin 0
  300. #define iterator_end -1
  301.  
  302. typedef struct vector_struct {
  303. size_t e_sz;
  304. char e_type;
  305.  
  306. #define V_INT 1
  307. #define V_DOUBLE 2
  308. #define V_CHAR 3
  309.  
  310. unsigned no_e;
  311. unsigned cur_cap;
  312. void* e_array;
  313.  
  314. }* vector_type;
  315.  
  316. #define vector_size(v) ((v)->no_e)
  317. #define vector_capacity(v) ((v)->cur_cap)
  318.  
  319. #define vector_int_at(v,i) (*((int*)v_at(v,i)))
  320. #define vector_double_at(v,i) (*((double*)v_at(v,i)))
  321. #define vector_char_at(v,i) (*((char*)v_at(v,i)))
  322. #define vector_string(v) ((char*)v_at(v,0))
  323.  
  324.  
  325. extern void* check_a(void*);
  326. extern void fail(const char*);
  327. extern vector_type v_create_empty(char);
  328. extern void v_destroy(vector_type);
  329. extern void* v_at(vector_type, iterator);
  330. extern void v_push_back(vector_type,void*);
  331. extern void v_pop_back(vector_type);
  332. extern void v_insert_n(vector_type,iterator,unsigned,void*);
  333. extern void v_erase_range(vector_type,iterator,iterator);
  334.  
  335. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement