tnblog
首页
登录

c 动态数组

87人阅读 2019/8/15 23:18 评论:0 手机 收藏 关注
分类: 传说中的c

国人随便写的

可以存储一些小的数据

DynamicArray.h

#ifndef _New_DynamicArray_
#define _New_DynamicArray_

typedef struct _vector_array
{
	unsigned char* mem_data; //存放我们数组的元素
	int max_mele;//当这块内存最大的容量;
	int elem_count;//当前这块内存存放的元素个数
	int sizeof_elem;//每个元素占的内存大小
}vector_array,*vector_arrayPointer;
//定义配置
//v 表示指向哪个 sizeof_elem元素大小
void vector_define(vector_arrayPointer v, int sizeof_elem);
//清楚
void vector_clear(vector_arrayPointer v); 
//往动态数组里面最后存放我们的元素
void vector_push_back(vector_arrayPointer v,const void* elem_ptr);

// 获取第i个元素的地址
void* vector_at(vector_arrayPointer v,int index);
//返回开始第一个数据指针
void* vector_begin(vector_arrayPointer v);
#define vector_size(v) ((v)->sizeof_elem);

// 清理到这个数组所有元素,但是我们还要继续存放
void vector_popall(vector_arrayPointer v);

//删除元素
void Remove_item(vector_arrayPointer v, int start, int count);

//弹出最后一个元素
//并把最后一个给准备好的内存里面
void vector_popback(vector_arrayPointer v, void* out_of_elem);
#endif

DynamicArray.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DynamicArray.h"


//定义自己的堆空间 叫my_malloc
#define my_malloc malloc;
//定义自己的释放方法 my_free
#define my_free free;
//定义自己的扩容方法my_realloc
#define my_realloc realloc;

#define ELEM_STMP 64

//初始化
//v 表示指向哪个 sizeof_elem元素大小
void vector_define(vector_arrayPointer v, int sizeof_elem) 
{
	memset(v, 0, sizeof(vector_array));
	v->sizeof_elem = sizeof_elem;
	

}
//clear item
void vector_clear(vector_arrayPointer v) 
{
	if (v->mem_data)
	{
		my_free(v->mem_data);
		v->mem_data = NULL;
		v->elem_count = 0;
		v->max_mele = 0;
	}
}
//存到数组
void vector_push_back(vector_arrayPointer v, const void* elem_ptr)
{
	//判断是否还有多余的空间够存储
	if (v->elem_count >= v->max_mele)
	{
		v->max_mele += ELEM_STMP;
		my_realloc(v->mem_data,v->max_mele * v->sizeof_elem);
	}
	//存放元素
	memcpy(v->mem_data + v->elem_count * v->sizeof_elem,elem_ptr, v->sizeof_elem);
	v->elem_count++;


}
//下标获取值
void* vector_at(vector_arrayPointer v, int index) 
{
	if (index < v->elem_count && index >=0)
	{
		return (void*)(v->mem_data + index * v->sizeof_elem);
	}
	return NULL;
}
//返回开始第一个数据指针
void* vector_begin(vector_arrayPointer v)
{
	return v->mem_data;
}
// 清理到这个数组所有元素,但是我们还要继续存放
void vector_popall(vector_arrayPointer v) 
{
	v->elem_count = 0;
}
void Remove_item(vector_arrayPointer v, int start, int count)
{
	if (start < 0 || start >= v->elem_count)
	{
		return;
	}
	if (start + count > v->elem_count)
	{
		count -= (start + count) - v->elem_count;
	}
	//判断元素大于0
	if ((v->elem_count - (start + count))>0)
	{
		memmove(v->mem_data + start * v->sizeof_elem,
			v->mem_data + (start + count) * v->sizeof_elem,
			(v->elem_count - (start + count)) * v->sizeof_elem);
	}
	v->elem_count -= count;
}

void vector_popback(vector_arrayPointer v, void* out_of_elem) 
{
	if (v->elem_count<=0)
	{
		return;
	}
	v->elem_count --;
	if (out_of_elem)
	{
		memcpy(out_of_elem,v->mem_data+v->elem_count * v->sizeof_elem,v->sizeof_elem);
	}
}


给国人一个小目标,三年后不干c#了!

转型不转行!



评价
!咖喱棒!
文章
6
粉丝
16
评论
8
分类
16
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}