当前位置 : 主页 > 编程语言 > c++ >

纯C语言(C89)实现动态数组

来源:互联网 收集:自由互联 发布时间:2021-06-23
起因 已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺, 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现一 完全封装,隐藏结构

起因

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

目标

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

实现一

完全封装,隐藏结构体细节,不支持栈创建
如果需要在栈使用,请自行修改(公开Vector细节,vector_init、vector_free声明)

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);
}

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

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) {
    vector_free(v);
    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};
    size_t test_data_len = sizeof(test_data) / sizeof(int);
    Vector* v = vector_new(sizeof(int));
    int i, x, y;
    
    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, &y);
        printf("%d => %d \n", i, y);
    }
    
    vector_destory(v);
    return 0;
}
len:23
0 => 1  0 => 10
1 => 2  1 => 20
2 => 3  2 => 30
3 => 4  3 => 40
4 => 5  4 => 50
5 => 6  5 => 60
6 => 7  6 => 70
7 => 8  7 => 80
8 => 9  8 => 90
9 => 1  9 => 10
10 => 2         10 => 20
11 => 3         11 => 30
12 => 4         12 => 40
13 => 5         13 => 50
14 => 6         14 => 60
15 => 7         15 => 70
16 => 8         16 => 80
17 => 9         17 => 90
18 => 1         18 => 10
19 => 2         19 => 20
20 => 3         20 => 30
21 => 4         21 => 40
22 => 5         22 => 50
网友评论