当前位置: 首页 > news >正文

【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));}
http://www.jsqmd.com/news/963557/

相关文章:

  • 2026散热风扇实力之选:卡固、台湾维宏、SUNON、台达、ADDA等品牌企业综合能力评估 - 品牌企业推荐师(官方)
  • 2026 成都黄金回收商户实力测评,收的顶全国连锁高价夺冠稳居同城榜首 - 奢侈品回收评测
  • 当Git操作失误时,如何优雅地按下“撤销“键?
  • 2026年6月光固化保护套生产厂家选哪家,环氧酚醛/环氧玻璃钢/石墨烯涂料/光固化保护套,光固化保护套批发厂家找哪家 - 品牌推荐师
  • AI智能体的分类及开发
  • 嘴炮Hermes:我干完了!实际啥也没做,咋整?
  • 体育场馆预约系统小程序/网站开发方案|功能详解+个人开发报价+合作全流程
  • 探索oled高级显示:借助快马ai模型生成动画与特效代码
  • 液动机械手回转臂结构设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Hello, Wilds!
  • deepseek 适配了 华为升腾 是不是 用了类似Megatron-LM deepSpeed框架的??
  • 基于PyTorch的农作物病害图像识别系统:含训练模型、多作物数据集与一键部署脚本
  • 从傅里叶到拉普拉斯:一个‘衰减因子’如何打通信号分析的任督二脉?
  • 2026精选:上海无损检测与材料检测服务公司——专业精准与深度技术解析 - 品牌企业推荐师(官方)
  • 手机App下载安装完全指南:2026最新教程(Android iOS)
  • 终极指南:使用Mod Engine 2轻松为《艾尔登法环》等魂系游戏创建模组
  • 上班族 AI 学习方案 第九周Agent 智能体原理 + 实操LangChain
  • Bandcamp音乐下载终极指南:bandcamp-dl让你的音乐库更完整
  • 智能进化算法:借助快马平台AI模型优化杜鹃算法的莱维飞行与参数策略
  • 2026 黄金回收避坑参考指南,入选行业白名单的 “禹竞名奢汇” 贴合要求 - 奢侈品交易观察员
  • 别再只盯着SENet了!用PyTorch手把手实现STN,让你的CNN模型学会‘自动对焦’
  • 工程师思维:冗余|冗余越多,容错能力越强
  • 实战部署指南:高效配置本地AI代码助手FauxPilot
  • 2026年动态人机工学椅主流生产企业发展现状分析(附核心数据) - 多才菠萝
  • 2026合肥黄金回收权威常识,龙头品牌测评,高效变现攻略 - 奢侈品回收评测
  • 不暴露身份随便聊|2026树洞公众号排行:树洞陪聊+倾诉+陪玩TOP5 - 时时资讯
  • 2026古法黄金出手指南!沈阳高分回收龙头透明高价收的顶夺魁 - 奢侈品回收评测
  • 2026年AI模型接入深度复盘:六大聚合平台实测,谁才是生产环境的最优解?
  • 告别繁琐配置:用快马平台实现云代码开发的效率倍增
  • 2026甄选:佛山奢侈品回收领域值得信赖的专业机构深度分析 - 品牌企业推荐师(官方)