C89实现动态数组

天涯浪子 提交于 2019-11-29 21:24:57

起因

已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺,

目标

纯C实现动态数组,提供方便易用泛型接口,避免依赖

实现一

vector.h

#ifndef VECTOR_H
#define VECTOR_H
#include <stddef.h>

struct Vector_;
typedef struct Vector_ Vector;

Vector* vector_new(size_t elem_size);
void vector_destory(Vector* v);

size_t vector_length(Vector* v);
void vector_append(Vector* v, void* elem_in);
void vector_get(Vector* v, size_t pos, void* elem_out);
void vector_set(Vector* v, size_t pos, void* elem_in);

#endif // VECTOR_H

vector.c

#include <stdlib.h>
#include <string.h> 
#include "vector.h"

#define DEFAULT_VECTOR_SIZE 10
typedef unsigned char byte;

typedef struct Vector_ {
    size_t size;
    size_t max_size;
    size_t elem_size;
    void* data;
} Vector;

static void vector_realloc(Vector* v) {
    v->data = realloc(v->data, v->elem_size*v->max_size);
}

static void vector_init(Vector* v, size_t elem_size) {
    v->size = 0;
    v->max_size = DEFAULT_VECTOR_SIZE;
    v->elem_size = elem_size;
    v->data = NULL;
    vector_realloc(v);
}

Vector* vector_new(size_t elem_size) {
    Vector* v = realloc(0, sizeof(Vector));
    vector_init(v, elem_size);
    return v;
}

void vector_destory(Vector* v) {
    free(v->data);
    free(v);
}

size_t vector_length(Vector* v) {
    return v->size;
}

void vector_append(Vector* v, void* elem_in) {
    byte* p = v->data;
    if (v->size >= v->max_size) {
        v->max_size *= 2;
        vector_realloc(v);
    }
    p += v->elem_size * v->size;
    memcpy(p, elem_in, v->elem_size);
    v->size ++;
}

void vector_get(Vector* v, size_t pos, void* elem_out) {
    byte* p = v->data;
    if (pos < v->size) {
        p += v->elem_size * pos;
        memcpy(elem_out, p, v->elem_size);
    }
}

void vector_set(Vector* v, size_t pos, void* elem_in) {
    byte* p = v->data;
    if (pos < v->size) {
        p += v->elem_size * pos;
        memcpy(p, elem_in, v->elem_size);
    }
}

测试

#include <stdio.h>
#include <stdlib.h>
#include "vector.h"

int main(int argc, char *argv[]) {
    int test_data[] = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
    size_t test_data_len = sizeof(test_data) / sizeof(int);
    Vector* v = vector_new(sizeof(int));
    int i, x;
    
    for (i=0; i<test_data_len; i++) {
        vector_append(v, &test_data[i]);
    }
    
    printf("len:%d \n", vector_length(v));
    
    for (i=0; i<test_data_len; i++) {
        vector_get(v, i, &x);
        printf("%d => %d \t", i, x);
        x *= 10;
        vector_set(v, i, &x);
        vector_get(v, i, &x);
        printf("%d => %d \n", i, x);
    }
    
    vector_destory(v);
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!