当前位置: 首页 > 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.rkmt.cn/news/1475259.html

相关文章:

  • 探索oled高级显示:借助快马ai模型生成动画与特效代码
  • 嘴炮Hermes:我干完了!实际啥也没做,咋整?
  • 当Git操作失误时,如何优雅地按下“撤销“键?
  • 2026 成都黄金回收商户实力测评,收的顶全国连锁高价夺冠稳居同城榜首 - 奢侈品回收评测
  • 上班族 AI 学习方案 第九周Agent 智能体原理 + 实操LangChain
  • deepseek 适配了 华为升腾 是不是 用了类似Megatron-LM deepSpeed框架的??
  • 智能进化算法:借助快马平台AI模型优化杜鹃算法的莱维飞行与参数策略
  • 工程师思维:冗余|冗余越多,容错能力越强
  • 2026合肥黄金回收权威常识,龙头品牌测评,高效变现攻略 - 奢侈品回收评测
  • 别再只盯着SENet了!用PyTorch手把手实现STN,让你的CNN模型学会‘自动对焦’
  • 2026年动态人机工学椅主流生产企业发展现状分析(附核心数据) - 多才菠萝
  • 2026年AI模型接入深度复盘:六大聚合平台实测,谁才是生产环境的最优解?
  • 2026古法黄金出手指南!沈阳高分回收龙头透明高价收的顶夺魁 - 奢侈品回收评测
  • 为什么92%的CSDN AI营销新人第一周就踩坑?揭秘内容营销与信息流广告的3层组织墙、2套数据底座、1个不可逆分账逻辑
  • 基于DS18B20与AT89S51的高精度数字温度计设计与实现
  • 终极GNOME Shell扩展管理工具:一站式轻松定制你的Linux桌面
  • RC复位电路不可靠?专业复位芯片设计原理与实战指南
  • 2026年隧道装饰板厂家:无机隧道防火板、硅酸钙隧道防火板、高速隧道盖板、隧道防火隔板、隧道用钢钙板源头厂家实力之选 - 品牌企业推荐师(官方)
  • 别再盲目续费!CSDN AI数字营销的“软性上限”已启动:3类高频触发场景+2种扩容优先级通道
  • 告别仿真!手把手教你用ADC0809和51单片机搭建一个真实的八通道电压采集器(附完整代码和PCB)
  • 2026年 开炼机生产厂家:自动/手动/电热/精密/水冷/冷热型开炼机源头工厂深度解析 - 品牌企业推荐师(官方)
  • Awoo Installer:轻松搞定Switch游戏安装的终极方案
  • 超详细-从0配置Claude Code[Windows 10 / 11版]
  • 英雄联盟R3nzSkin国服版:5分钟免费解锁全皮肤的终极指南
  • 2026 济南黄金典当对比专业回收,五家门店深度测评,变现收益排名出炉 - 奢侈品回收评测
  • 技术方案:Windows平台DualShock 3控制器虚拟HID驱动架构解析
  • GetQzonehistory终极指南:完整备份QQ空间历史说说的智能解决方案
  • Translumo:3步掌握开源实时屏幕翻译的终极指南
  • 2026年石家庄六西格玛绿带黑带资料怎么领取?课程入口说明 - 众智商学院官方
  • 金华市有哪些官方授权的CPPM注册职业采购经理培训机构? - 众智商学院课程中心