【C语言】实现简单动态数组(线程安全)

发布时间:2026/6/6 19:50:51

【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文件#includestdio.h#includestdlib.h#includestring.h#includewindows.h#includecvector.h// -----------------------------------------------------------------------------// cvector结构体// - data: 存储数据的指针// - size: 当前存储的数据个数// - capacity: 当前容量// -----------------------------------------------------------------------------typedefstructcvector{void**data;size_tsize;size_tcapacity;SRWLOCK srwlock;}CVECTOR,*PCVECTOR;// 抽取扩容函数staticintcvector_resize(cvector vector){if(NULLvector)return0;PCVECTOR v(PCVECTOR)vector;// 扩容新容量大小size_tnew_capacityv-capacityv-capacity/2;if(new_capacityv-capacity)return0;void**data(void**)realloc(v-data,new_capacity*sizeof(void*));if(NULLdata)return0;v-datadata;v-capacitynew_capacity;return1;}// 抽取的尾部插入函数staticvoid_cvector_push_back(cvector vector,void*data){if(NULLvector||NULLdata)return;PCVECTOR v(PCVECTOR)vector;if(v-sizev-capacity){if(!cvector_resize(vector))return;}v-data[v-size]data;}// -----------------------------------------------------------------------------// 创建一个cvector// - capacity: 初始容量// -----------------------------------------------------------------------------cvectorcvector_create(size_tcapacity){if(capacity0){returnNULL;}PCVECTOR vector(PCVECTOR)malloc(sizeof(CVECTOR));if(NULLvector){returnNULL;}memset(vector,0,sizeof(CVECTOR));vector-datamalloc(sizeof(void*)*capacity);if(NULLvector-data){free(vector);returnNULL;}vector-size0;vector-capacitycapacity;// 初始化读写锁InitializeSRWLock((vector-srwlock));returnvector;}// -----------------------------------------------------------------------------// 销毁// - vector: cvector指针, 传入NULL则不操作// -----------------------------------------------------------------------------voidcvector_destroy(cvector vector){if(NULLvector){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(NULLvector||capacity0)return0;PCVECTOR v(PCVECTOR)vector;// 写锁AcquireSRWLockExclusive((v-srwlock));if(v-capacitycapacity){// 解锁ReleaseSRWLockExclusive((v-srwlock));returnv-capacity;}void**_temprealloc(v-data,sizeof(void*)*capacity);if(NULL_temp){// 解锁ReleaseSRWLockExclusive((v-srwlock));returnv-capacity;}v-data_temp;v-capacitycapacity;// 解锁ReleaseSRWLockExclusive((v-srwlock));returnv-capacity;}// -----------------------------------------------------------------------------// 获取当前存储的数据个数// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_size(cvector vector){if(NULLvector){return0;}PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockShared((v-srwlock));size_t_sizev-size;// 解锁ReleaseSRWLockShared((v-srwlock));return_size;}// -----------------------------------------------------------------------------// 获取当前容量// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_capacity(cvector vector){if(NULLvector)return0;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockShared((v-srwlock));size_t_capacityv-capacity;// 解锁ReleaseSRWLockShared((v-srwlock));return_capacity;}// -----------------------------------------------------------------------------// 遍历打印// - vector: cvector指针// - display: 打印函数指针// -----------------------------------------------------------------------------voidcvector_display(cvector vector,void(*display)(void*data)){if(NULLvector||NULLdisplay)return;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockShared((v-srwlock));for(inti0;iv-size;i){display(v-data[i]);}// 解锁ReleaseSRWLockShared((v-srwlock));}// -----------------------------------------------------------------------------// 在尾部插入数据// - vector: cvector指针// - data: 数据指针// -----------------------------------------------------------------------------voidcvector_push_back(cvector vector,void*data){if(NULLvector)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(NULLvector)returnNULL;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive((v-srwlock));if(v-size0){// 解锁ReleaseSRWLockExclusive((v-srwlock));returnNULL;}void*_tempv-data[v-size-1];v-size--;// 解锁ReleaseSRWLockExclusive((v-srwlock));return_temp;}// 指定位置插入一个元素voidcvector_insert(cvector vector,size_tindex,void*data){if(NULLvector||NULLdata)return;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive((v-srwlock));// 判断是否需要扩容if(v-sizev-capacity){intretcvector_resize(vector);if(0ret){// 解锁ReleaseSRWLockExclusive((v-srwlock));return;}}// 如果index size 则进行尾部插入if(indexv-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[index1],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(NULLvector)returnNULL;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive((v-srwlock));if(indexv-size||v-size0){// 解锁ReleaseSRWLockExclusive((v-srwlock));returnNULL;}void*_tempv-data[index];// 数据前移//for (int i index; i v-size - 1; i)//{// v-data[i] v-data[i 1];//}memmove(v-data[index],v-data[index1],sizeof(void*)*(v-size-index-1));v-size--;// 解锁ReleaseSRWLockExclusive((v-srwlock));return_temp;}// -----------------------------------------------------------------------------// 清空// - vector: cvector指针// -----------------------------------------------------------------------------voidcvector_clear(cvector vector){if(NULLvector)return;PCVECTOR v(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive((v-srwlock));v-size0;// 解锁ReleaseSRWLockExclusive((v-srwlock));}

相关新闻