【C语言】实现简单动态数组(线程安全)
头文件
#ifndef_CVECTOR_H_#define_CVECTOR_H_typedefvoid*cvector;// 初始化cvectorcvector_create(size_tcapacity);// 销毁voidcvector_destroy(cvector vector);// 一次性分配内存size_tcvector_reserve(cvector vector,size_tcapacity);// 获取元素个数size_tcvector_size(cvector vector);// 获取容量size_tcvector_capacity(cvector vector);// 遍历打印voidcvector_display(cvector vector,void(*display)(void*data));// 尾部添加一个元素voidcvector_push_back(cvector vector,void*data);// 尾部删除一个元素void*cvector_pop_back(cvector vector);// 指定位置插入一个元素voidcvector_insert(cvector vector,size_tindex,void*data);// 指定位置删除一个元素void*cvector_erase(cvector vector,size_tindex);// 清空voidcvector_clear(cvector vector);#endif// _CVECTOR_H_c文件
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#include"cvector.h"// -----------------------------------------------------------------------------// cvector结构体// - data: 存储数据的指针// - size: 当前存储的数据个数// - capacity: 当前容量// -----------------------------------------------------------------------------typedefstructcvector{void**data;size_tsize;size_tcapacity;SRWLOCK srwlock;}CVECTOR,*PCVECTOR;// 抽取扩容函数staticintcvector_resize(cvector vector){if(NULL==vector)return0;PCVECTOR v=(PCVECTOR)vector;// 扩容新容量大小size_tnew_capacity=v->capacity+v->capacity/2;if(new_capacity<v->capacity)return0;void**data=(void**)realloc(v->data,new_capacity*sizeof(void*));if(NULL==data)return0;v->data=data;v->capacity=new_capacity;return1;}// 抽取的尾部插入函数staticvoid_cvector_push_back(cvector vector,void*data){if(NULL==vector||NULL==data)return;PCVECTOR v=(PCVECTOR)vector;if(v->size>=v->capacity){if(!cvector_resize(vector))return;}v->data[v->size++]=data;}// -----------------------------------------------------------------------------// 创建一个cvector// - capacity: 初始容量// -----------------------------------------------------------------------------cvectorcvector_create(size_tcapacity){if(capacity==0){returnNULL;}PCVECTOR vector=(PCVECTOR)malloc(sizeof(CVECTOR));if(NULL==vector){returnNULL;}memset(vector,0,sizeof(CVECTOR));vector->data=malloc(sizeof(void*)*capacity);if(NULL==vector->data){free(vector);returnNULL;}vector->size=0;vector->capacity=capacity;// 初始化读写锁InitializeSRWLock(&(vector->srwlock));returnvector;}// -----------------------------------------------------------------------------// 销毁// - vector: cvector指针, 传入NULL则不操作// -----------------------------------------------------------------------------voidcvector_destroy(cvector vector){if(NULL==vector){return;}// 类型转换PCVECTOR v=(PCVECTOR)vector;// 写锁AcquireSRWLockExclusive(&(v->srwlock));// 释放数据if(NULL!=v->data){free(v->data);}// 解锁ReleaseSRWLockExclusive(&(v->srwlock));// 释放结构体free(v);}// 一次性分配内存size_tcvector_reserve(cvector vector,size_tcapacity){if(NULL==vector||capacity==0)return0;PCVECTOR v=(PCVECTOR)vector;// 写锁AcquireSRWLockExclusive(&(v->srwlock));if(v->capacity>=capacity){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}void**_temp=realloc(v->data,sizeof(void*)*capacity);if(NULL==_temp){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}v->data=_temp;v->capacity=capacity;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}// -----------------------------------------------------------------------------// 获取当前存储的数据个数// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_size(cvector vector){if(NULL==vector){return0;}PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));size_t_size=v->size;// 解锁ReleaseSRWLockShared(&(v->srwlock));return_size;}// -----------------------------------------------------------------------------// 获取当前容量// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_capacity(cvector vector){if(NULL==vector)return0;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));size_t_capacity=v->capacity;// 解锁ReleaseSRWLockShared(&(v->srwlock));return_capacity;}// -----------------------------------------------------------------------------// 遍历打印// - vector: cvector指针// - display: 打印函数指针// -----------------------------------------------------------------------------voidcvector_display(cvector vector,void(*display)(void*data)){if(NULL==vector||NULL==display)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));for(inti=0;i<v->size;i++){display(v->data[i]);}// 解锁ReleaseSRWLockShared(&(v->srwlock));}// -----------------------------------------------------------------------------// 在尾部插入数据// - vector: cvector指针// - data: 数据指针// -----------------------------------------------------------------------------voidcvector_push_back(cvector vector,void*data){if(NULL==vector)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));_cvector_push_back(vector,data);// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}// -----------------------------------------------------------------------------// 在尾部删除一个元素// - vector: cvector指针//// Return:// - 返回被删除的元素指针// -----------------------------------------------------------------------------void*cvector_pop_back(cvector vector){// 当列表为NULL或者或者size为0时,返回NULLif(NULL==vector)returnNULL;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));if(v->size<=0){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnNULL;}void*_temp=v->data[v->size-1];v->size--;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return_temp;}// 指定位置插入一个元素voidcvector_insert(cvector vector,size_tindex,void*data){if(NULL==vector||NULL==data)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));// 判断是否需要扩容if(v->size>=v->capacity){intret=cvector_resize(vector);if(0==ret){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return;}}// 如果index >= size 则进行尾部插入if(index>=v->size){_cvector_push_back(vector,data);// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return;}// 其他情况,进行中间插入//for (int i = v->size; i > index; i--)//{// v->data[i] = v->data[i - 1];//}// 数据后移memmove(&v->data[index+1],&v->data[index],sizeof(void*)*(v->size-index));v->data[index]=data;v->size++;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}// 指定位置删除一个元素void*cvector_erase(cvector vector,size_tindex){if(NULL==vector)returnNULL;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));if(index>=v->size||v->size==0){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnNULL;}void*_temp=v->data[index];// 数据前移//for (int i = index; i < v->size - 1; i++)//{// v->data[i] = v->data[i + 1];//}memmove(&v->data[index],&v->data[index+1],sizeof(void*)*(v->size-index-1));v->size--;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return_temp;}// -----------------------------------------------------------------------------// 清空// - vector: cvector指针// -----------------------------------------------------------------------------voidcvector_clear(cvector vector){if(NULL==vector)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));v->size=0;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}