设计简易的Vector数组

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define _CRT_SECURE_NO_WARNINGS
#include "Vector.h"
int main(void) {
Vector* v = create_vector();
if (!v) {
printf("create_vector failed!\n");
exit(1);
}
for(int val = 0;val <= 99;val++)
push_back(v, val);

for (int i = 0; i < 100; i++)
printf("%d\n", v->elements[i]);
destroy_vector(v);
return 0;
}

Vector.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
#include "Vector.h"
#define DEFAULT_CAPACITY 8
#define THRESHOLD 1024
Vector* create_vector() {
//类似C++中的无参构造方法
Vector* v = malloc(sizeof(Vector));
if (!v) {
return NULL;
}
v->capacity = DEFAULT_CAPACITY;
v->elements = malloc(sizeof(int) * v->capacity);
if (!v->elements) {
free(v);// Caution: 一定要free(v)
return NULL;
}

v->size = 0;

return v;
}
void destroy_vector(Vector* v) {
//类似C++里面的析构函数
free(v->elements);
free(v);
}

void grow_capacity(Vector* v) {
if (v->capacity <= THRESHOLD) {
v->capacity += v->capacity;
}
else {
v->capacity += (v->capacity >> 1);
}
int* result = realloc(v->elements, sizeof(int) * v->capacity);

if (!result) {
printf("grow_capacity failed!\n");
exit(1);
}
// 指向新的内存空间
v->elements = result;

}


void push_back(Vector* v, int val) {
//先判断要不要扩容
if (v->size == v->capacity)//此时刚好满了
{
grow_capacity(v);
}
v->elements[v->size++] = val;
return;
}


Vector.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdlib.h>
#include<stdio.h>
//对外的接口:结构体的定义, API
typedef struct {
int* elements; // 指向堆空间的数组
int size;//元素的个数
int capacity;//数组的容量
}Vector ;

Vector* create_vector();
void destroy_vector(Vector* v);
void push_back(Vector* v, int val);
void grow_capacity(Vector* v);