#include<stdio.h>
#include<stdlib.h>
#include"Vector.h"
#define DEFAULT_CAPACITY 10
#define MAX_PREALLOC 1024
typedef int E;
typedef struct {
E* elements; //存数组元素
int size; //当前元素个数
int capacity; //数组容量
}Vector;
//创建动态数组
Vector* vector_create(void) {
Vector* v = malloc(sizeof(Vector));
if (!v) {
printf("Error: malloc failed\n");
exit(1);
}
v->elements = malloc(DEFAULT_CAPACITY * sizeof(E));
if (!v->elements) {
printf("Error: malloc failed\n");
exit(1);
}
v->size = 0;
v->capacity = DEFAULT_CAPACITY;
return v;
}
//删除回收数组
void vector_destroy(Vector* v) {
free(v->elements);
free(v);
}
//扩容
void grow_capacity(Vector* v) {
//小了翻倍,大了给点
int new_capacity = v->capacity < MAX_PREALLOC ?
(v->capacity << 1) : (v->capacity + MAX_PREALLOC);
//v->elements = realloc(v->elements, new_capacity * sizeof(E));
E* ptr = realloc(v->elements, new_capacity * sizeof(E));
if (!ptr) {
printf("Error: realloc failed\n");
exit(1);
}
v->elements = ptr;
v->capacity = new_capacity;
}
//添加
void push_back(Vector* v, E val) {
//判断容量,不够扩容
if (v->size == v->capacity) {
grow_capacity(v);
}
//依次往后放
v->elements[v->size] = val;
v->size++;
}
//打印
void vector_print(Vector* v) {
if (v->size <= 0) printf("Array is empty!\n");
for (int i = 0; i < v->size; i++) {
printf("%d ", v->elements[i]);
}
printf("\n");
}
//在数组最前面添加元素,所有元素依次后移
void push_front(Vector* v, E val) {
//判断容量,不够扩容
if (v->size >= v->capacity) {
grow_capacity(v);
}
for (int i = v->size; i > 0; i--) {
v->elements[i] = v->elements[i - 1];
}
v->elements[0] = val;
v->size++;
}
//删除最后一个元素, 并把最后一个元素返回
E pop_back(Vector* v) {
if (!v->size) exit(1);
return v->elements[--v->size];;
}
//删除第一个元素,并把第一个元素返回
E pop_front(Vector* v) {
if (!v->size) exit(1);
E first = v->elements[0];
for (int i = 0; i < v->size - 1; i++) {
v->elements[i] = v->elements[i + 1];
}
v->size--;
return first;
}
【C语言】17_结构体实现动态数组(动态分配内存)
于 2024-05-11 08:42:26 首次发布