纯C语言(C89)实现动态数组
发布时间:2020-12-16 09:15:17 所属栏目:百科 来源:网络整理
导读:起因 已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺, 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现一 完全封装,隐藏结构体细节,不支持栈创建 如果需要在栈使用,请自行修改(公开Vector细节,vector_
起因已经很少接触纯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,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
