c语言实现vector及其相关函数(自存)
#include<stdio.h> #include <stdlib.h> #define PREALLOC_MAX 1024 #define DEFAULT_CAPACITY 8 typedef int E; typedef struct { E* elements; // 指向堆空间的数组 int size; // 元素的个数 int capacity; // 数组的容量 } Vector; void push_back(Vector* v, E val); // 在数组最前面添加元素,所有元素依次后移 void push_front(Vector* v, E val); // 删除最后一个元素, 并把最后一个元素返回 E pop_back(Vector* v); // 删除第一个元素,并把第一个元素返回 E pop_front(Vector* v); void grow_capacity(Vector* v); Vector* vector_create(void); int main(void){ // Vector v1; Vector* v = vector_create(); /* push_back(v, 1); push_back(v, 2); push_back(v, 3);*/ push_front(v, 1); push_front(v, 2); push_front(v, 3); int pb = pop_front(v); printf("%d", pb); return 0; } void grow_capacity(Vector* v) { int new_capacity = v->capacity < PREALLOC_MAX ? v->capacity << 1 : v->capacity + PREALLOC_MAX; E* p = realloc(v->elements, new_capacity * sizeof(E)); if (!p) { printf("ERROR:REALLOC FAILED IN REALLOC\n"); exit(1); } v->elements = p; v->capacity = new_capacity; } Vector* vector_create(void) { Vector* v = malloc(sizeof(Vector)); if (!v) { printf("Error: malloc failed in vector_create\n"); exit(1); } E* p = malloc(DEFAULT_CAPACITY * sizeof(E)); if (!p) { free(v); printf("Error: malloc failed in vector_create\n"); exit(1); } v->elements = p; v->size = 0; v->capacity = DEFAULT_CAPACITY; return v; } void vector_destroy(Vector* v) { free(v->elements); free(v); } void push_back(Vector* v, E val) { //判断是否需要扩容 if (v->size == v->capacity) { grow_capacity(v); } v->elements[v->size++] = val; } void push_front(Vector* v, E val) { //判断是否需要扩容 if (v->size == v->capacity) { grow_capacity(v); } //把元素往后移动一位 for (int i = v->size - 1; i >= 0; i--) v->elements[i+1] = v->elements[i]; //在数组最前面添加元素 v->elements[0] = val; v->size++; } E pop_back(Vector* v){ //判断是否为空 if (v->size == 0) { printf("error:vector size is %d!!!!", v->size); return -1; } //返回最后一个元素 int latter = v->elements[v->size - 1]; v->size--; return latter; } E pop_front(Vector* v) { //判断是否为空 if (v->size == 0) { printf("error:vector size is %d!!!!", v->size); return -1; } int val = v->elements[0]; for (int i = 1; i < v->size; i++) { v->elements[i-1] = v->elements[i]; } v->size--; return val; }