加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:15:17 所属栏目:百科 来源:网络整理
导读:起因 已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺, 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现一 完全封装,隐藏结构体细节,不支持栈创建 如果需要在栈使用,请自行修改(公开Vector细节,vector_

起因

已经很少接触纯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,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,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,void* elem_in) {
    byte* p = v->data;
    if (pos < v->size) {
        p += v->elem_size * pos;
        memcpy(p,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,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",x);
        x *= 10;
        vector_set(v,&x);
        vector_get(v,&y);
        printf("%d => %d n",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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读