C实现Vector

GlassCatBlog / 2023-08-16 / 原文

/*
 *
 * Copyright (C) 2023-08-16 14:22 zxinlog <zxinlog@126.com>
 *
 */
#include <func.h>

// 定义结构体
typedef struct vector {
    int *start;
    int *finish;
    int *end_of_storage;
} Vector;

Vector *init(int capacity);
int getSize(Vector *vec);
void growCapcaty(Vector *vec);
void push_back(Vector *vec, int data);
int pop(Vector *vec);
void printVec(Vector *vec);

#if 1
int main(int argc, char *argv[]) {
    Vector *vec = init(10);
    int size = getSize(vec);
    printf("vec size = %d\n", size);
    printVec(vec);

    for (int i = 0; i < 100; i++) {
        push_back(vec, i + 1024);
    }

    size = getSize(vec);
    printVec(vec);
    printf("vec size = %d\n", size);

    for (int i = 0; i < 10; i++) {
        pop(vec);
    }

    size = getSize(vec);
    printVec(vec);
    printf("vec size = %d\n", size);
    return 0;
}
#endif

// 初始化
Vector *init(int capacity) {
    Vector *vec = (Vector *) malloc(sizeof(Vector));
    vec->start = (int *) malloc(sizeof(int) * capacity);
    vec->finish = vec->start;
    vec->end_of_storage = vec->start + capacity + 1;
    return vec;
}

int getSize(Vector *vec) {
    int size = 0;
    if (vec->start != NULL) {
        size = vec->finish - vec->start;
    }
    return size;
}

void push_back(Vector *vec, int data) {
    if (vec->finish + 1 == vec->end_of_storage) {
        // printf("vec is full.\n");
        // return;

        growCapcaty(vec);
    }
    *(vec->finish) = data;
    vec->finish++;
}

int pop(Vector *vec) {
    if (vec->finish == vec->start) {
        printf("vec is empty.\n");
        return -1;
    }

    int data = *(vec->finish - 1);
    vec->finish--;
    return data;
}

void printVec(Vector *vec) {
    int *p = vec->start;
    int count = 0;

    while (p != vec->finish) {
        printf("%d ", *p);
        p++;
        count++;
        if (count % 10 == 0) {
            printf("\n");
        }
    }
    printf("\n");
}

void growCapcaty(Vector *vec) {
    int size = vec->finish - vec->start;
    int *p = (int *) malloc(sizeof(int) * size * 2);
    int *temp = vec->start;
    for (int i = 0; i < size; i++) {
        p[i] = temp[i];
    }
    free(vec->start);
    vec->start = p;
    vec->finish = vec->start + size;
    vec->end_of_storage = vec->start + (size * 2 + 1);
}