c语言实现任何数据类型的vector(动态数组)

 已经重新整理,并且拆分成多文件,阅读更方便

  跳转链接

面向对象方式重写源码

函数众多都只是简单测试了,不保证没有BUG,有兴趣的可以拷贝下来测试

众所周知vector是C++中的,但c没有所以就写了这个,尽量将名字都写成一样的,好方便后期使用

因为c没有模板这个概念,所以此代码为了实现所有数据类型,本身是无类型的,采用内存拷贝实现。

内置函数获取的数据都是以void指针的形式返回,需要强转成自己使用的类型

目录

内置函数

插入函数

void Vector_Push_Back(vector* vec, void* x);// 向量尾部增加一个元素X

void Vector_insert_front(struct vector* vec, const void* p, const void* x);// 向量中指向元素p前增加一个元素x

void Vector_insert_nfront(struct vector* vec, const void* p, const int n, const void* x);// 向量中指向元素p前增加n个相同的元素x

void Vector_insert(struct vector* vec, const void* p, const void* p1, const void* p2);// 向量中指向元素p前插入另一个相同类型向量的指针[p1,p2)间的数据

删除函数

void Vector_pop_back(struct vector* vec);//删除向量中最后一个元素

void Vector_erase_p(struct vector* vec, const void* p1, const void* p2);//删除指针区间内的数据

void Vector_erase_int(struct vector* vec, const int left, const int right);//删除区间内的数据

void Vector_clear(struct vector* vec);//清空vector的队列,释放内存

遍历函数

void* Vector_at(const struct vector* vec, int i);// 返回元素的指针,以数组下标形式访问

void* Vector_front(const struct vector* vec);//返回向量头指针,指向第一个元素

void* Vector_back(const struct vector* vec);//返回向量尾指针,指向向量最后一个元素

void* Vector_find(const struct vector* vec, const void* val);//查找数据,返回找到的指针,没有返回NULL

判断函数 

bool Vector_empty(const struct vector* vec);//检测vector内是否为空,空为真 O(1)

大小函数

int Vector_size(const struct vector* vec);//返回vector内元素的个数 O(1)

int  Vector_capacity(const struct vector* vec);//返回当前向量所能容纳的最大元素值

其他函数

void  Vector_sort(struct vector* vec,bool (*Sort)(void *x,void *y));//排序

void Vector_swap(struct vector*vec1, struct vector*vec2);//交换两个同类型向量的数据

初始化函数

void VectorInitial(vector* vec, int n);//初始化函数

测试结果

完整代码

vector.h(头文件)

vector.c(函数实现)

test.c(测试代码)


内置函数

插入函数


void Vector_Push_Back(vector* vec, void* x);// 向量尾部增加一个元素X

void Vector_Push_Back(vector* vec,void* x)// 向量尾部增加一个元素X
{
	Capacity(vec);
	char* str1 = (char*)vec->_date + vec->_type * vec->_current;
	memcpy(str1,x, vec->_type);
	vec->_current++;
}

void Vector_insert_front(struct vector* vec, const void* p, const void* x);// 向量中指向元素p前增加一个元素x
 

void Vector_insert_front(vector* vec,const void* p, const void* x)// 向量中指向元素p前增加一个元素x
{
	Capacity(vec);
	if (p >= vec->front(vec) && p <= vec->back(vec))
	{
		int size = (char*)vec->back(vec) - p + vec->_type;
		void* ptr = malloc(size);
		memcpy(ptr, p, size);
		memcpy(p, x, vec->_type);
		memcpy((char*)p + vec->_type, ptr, size);
		vec->_current++;
		free(ptr);
	}
}

void Vector_insert_nfront(struct vector* vec, const void* p, const int n, const void* x);// 向量中指向元素p前增加n个相同的元素x

void Vector_insert_nfront(vector* vec, const void* p, const int n, const void* x)// 向量中指向元素p前增加n个相同的元素x
{
	if (p >= vec->front(vec) && p <= vec->back(vec))
	{
		Capacity(vec);
		int size = (char*)vec->back(vec) - p + vec->_type;
		void* ptr = malloc(size);
		memcpy(ptr, p, size);
		int sizen= ((char*)p-vec->front(vec))/vec->_type;
		for (size_t i = 0; i < n; i++)
		{
			Capacity(vec);
			memcpy((char*)vec->at(vec,sizen), x, vec->_type);
			sizen++;
			vec->_current++;
		}
		memcpy((char*)vec->at(vec, sizen), ptr, size);
		free(ptr);
	}
}

void Vector_insert(struct vector* vec, const void* p, const void* p1, const void* p2);// 向量中指向元素p前插入另一个相同类型向量的指针[p1,p2)间的数据

void Vector_insert(vector* vec, const void* p, const void* p1, const void* p2)// 向量中指向元素p前插入另一个相同类型向量的指针[p1,p2)间的数据
{
	if (p >= vec->front(vec) && p <= vec->back(vec))
	{
		Capacity(vec);
		int size = (char*)vec->back(vec) - p + vec->_type;
		void* ptr = malloc(size);
		memcpy(ptr, p, size);
		int sizen = ((char*)p - vec->front(vec)) / vec->_type;
		int push_n = ((char*)p2 - (char*)p1) / vec->_type+1;
		for (size_t i = 0; i < push_n; i++)
		{
			Capacity(vec);
			memcpy((char*)vec->at(vec, sizen),(char*)p1+i*vec->_type, vec->_type);
			sizen++;
			vec->_current++;
		}
		memcpy((char*)vec->at(vec, sizen), ptr, size);
		free(ptr);
	}
}

删除函数


void Vector_pop_back(struct vector* vec);//删除向量中最后一个元素

void Vector_pop_back(struct vector* vec)//删除向量中最后一个元素
{
	vec->_current--;
}

void Vector_erase_p(struct vector* vec, const void* p1, const void* p2);//删除指针区间内的数据

void Vector_erase_p(struct vector* vec, const void* p1, const void* p2)//删除指针区间内的数据
{
	if (p1<=p2&&vec->front(vec)<=p1&&p2<=vec->back(vec))
	{
		memcpy(p1, (char*)p2 + vec->_type,(int)((char*)vec->back(vec)-(char*)p2));
		vec->_current -= (((int)((char*)p2 - (char*)p1))/vec->_type+1);
	}
}

void Vector_erase_int(struct vector* vec, const int left, const int right);//删除区间内的数据

void Vector_erase_int(struct VECTOR* vec, const int left, const int right)//删除区间内的数据
{
	if (left <= right && left >= 0 && right < vec->_current)
	{
		memcpy(vec->at(vec,left),vec->at(vec,right+1),(vec->_current-1-right)*vec->_type);
		vec->_current -= (right - left + 1);
	}
}

void Vector_clear(struct vector* vec);//清空vector的队列,释放内存

void Vector_clear(struct vector* vec)//清空vector的数组,释放内存
{
	free(vec->_date);
	vec->_date = NULL;
	vec->_current = 0;
	vec->_size = 0;
}

遍历函数

void* Vector_at(const struct vector* vec, int i);// 返回元素的指针,以数组下标形式访问

void* Vector_at(const struct vector* vec, int i)// 返回元素的指针
{
	if (i+1 > vec->_current)
	{
		return NULL
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值