听黑马程序员教程《基础数据结构和算法 (C版本)》,照着老师所讲抄的,

视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看。

动态数组

#include<stdio.h>
#include<stdlib.h>
#include<string.h> /*
动态数组,视频地址https://www.bilibili.com/video/BV1vE411f7Jh?spm_id_from=333.999.0.0
动态增长内存,,策略-将存放数据的内存放在 - 堆上。 */
// 定义动态数组的结构体
typedef struct DYNAMICARRAY{
int* pAddr; // 存放数组的地址(首地址) 获取地址上的值方式为:pAddr[i]
int size; // 元数个数
int capacity; // 空间容量,申请的容量最多能放多少个元素。
}Dynamic_Array; // 对 DYNAMICARRAY 结构体操作的函数 // 初始化
Dynamic_Array* Init_Array(); // 插入元素
void Push_back_Array(Dynamic_Array* array,int value); // 删除(根据位置删除)
void RemoveByPos_Array(Dynamic_Array* arr,int pos); // 删除(根据值删除)
void RemoveByValue_Array(Dynamic_Array* arr,int value); // 查找,根据值查找位置
int Find_Array(Dynamic_Array* arr,int value); // 打印
void Print_Array(Dynamic_Array* arr); // 释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr); // 清空数组
void Clear_Array(Dynamic_Array* arr); // 获得动态数组的容量
int capacity_Array(Dynamic_Array* arr); // 获得动态数组当前元素个数
int Size_Array(Dynamic_Array* arr); // 根据位置获得某个元素的值
int At_Array(Dynamic_Array* arr,int pos); // 测试 ------------------------------------------------------------------------
void test01(){
// 初始化动态数组
Dynamic_Array* myArray = Init_Array(); // 输出容量、元素个数
printf("元素个数:%d\n",myArray->size);
printf("容量大小:%d\n",myArray->capacity); // 插入元素
int i;
for(i=0;i<10;i++){
Push_back_Array(myArray,i);
}
// 打印
Print_Array(myArray); // 插入
Push_back_Array(myArray,99);
// 打印
Print_Array(myArray); // 删除(根据值删除)
RemoveByValue_Array(myArray,9);
// 打印
Print_Array(myArray); // 删除(根据位置删除)
RemoveByPos_Array(myArray,2);
// 打印
Print_Array(myArray); // 输出容量、元素个数
printf("元素个数:%d\n",myArray->size);
printf("容量大小:%d\n",myArray->capacity); // 查找第5个位置元素值(从 0 开始数)
printf("第5位元素的值是:%d\n",At_Array(myArray,5)); // 销毁
FreeSpace_Array(myArray);
} int main(){
printf("好好学习,天天向上~!(动态数组 20220529)\n\n"); test01(); return 0;
} // 对 DYNAMICARRAY 结构体操作的函数
// 初始化
Dynamic_Array* Init_Array(){
// 申请内存,开辟空间,
Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
// 初始化
myArray->size = 0;
// 预设20个元素的空间
myArray->capacity=20;
// 按预设的20个空间,申请内存,并取得首地址。
myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity); return myArray;
} // 插入元素
void Push_back_Array(Dynamic_Array* arr,int value){
if(arr==NULL){
return ;
}
// 判断空间是否够,如果不够,则申请原空间2倍的空间
if(arr->size == arr->capacity){
// 1、申请更大的空间。默认新空间是旧空间的2倍。
int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
// 2、拷贝数据到新的空间
memcpy(newSpace,arr->pAddr,arr->capacity * sizeof(int));
// 3、释放旧空间内存
free(arr->pAddr);
// 4、更新容量和首地址
arr->capacity = arr->capacity * 2 ;
arr->pAddr = newSpace;
}
// 插入元素
arr->pAddr[arr->size] = value;
arr->size++; } // 删除(根据位置删除)
void RemoveByPos_Array(Dynamic_Array* arr,int pos){
if(arr==NULL){
return;
}
if(pos <0 || pos >= arr->size){ // 位置不能小于0或大于元素个数
return;
}
// 用for循环,把要删除的位置下一个位置的元素全部前移一位覆盖
int i;
for(i=pos;i<=arr->size-1;i++){
arr->pAddr[i] = arr->pAddr[i+1];
}
// 重新标识元素个数(减 1)
arr->size--;
} // 删除(根据值删除) 第一次出现的位置
void RemoveByValue_Array(Dynamic_Array* arr,int value){
if(arr==NULL){
return;
}
// 先找值的位置
int pos = Find_Array(arr,value);
// 找到位置后,根据位置删除
RemoveByPos_Array(arr,pos);
} // 查找,根据值查找位置
int Find_Array(Dynamic_Array* arr,int value){
if(arr==NULL){
return 0;
}
// 先找值的位置
int pos = -1; // 默认 -1 也就是没找到
int i;
for(i=0;i<arr->size;i++){
if(arr->pAddr[i]==value){
pos = i;
break; // 找到后退出,要不然会找到最后一个值的位置
}
}
return pos;
} // 打印
void Print_Array(Dynamic_Array* arr){
if(arr==NULL){
return;
}
int i;
for(i=0;i<=arr->size-1;i++){
printf("%d ",arr->pAddr[i]);
}
printf("\n\n");
} // 释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr){
if(arr==NULL){
return;
}
if(arr->pAddr!=NULL){
free(arr->pAddr);
}
free(arr);
} // 清空数组
void Clear_Array(Dynamic_Array* arr){
if(arr==NULL){
return;
}
arr->size=0;
} // 获得动态数组的容量
int capacity_Array(Dynamic_Array* arr){
if(arr==NULL){
return ;
}
return arr->capacity;
} // 获得动态数组当前元素个数
int Size_Array(Dynamic_Array* arr){
if(arr==NULL){
return ;
}
return arr->size;
} // 根据位置获得某个元素的值
int At_Array(Dynamic_Array* arr,int pos){
if(arr==NULL){
return ;
}
return arr->pAddr[pos];
}

C语言- 基础数据结构和算法 - 动态数组的更多相关文章

  1. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  2. C语言- 基础数据结构和算法 - 队列的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  3. C语言- 基础数据结构和算法 - 栈的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  4. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  5. C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  6. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  7. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  8. C语言 - 基础数据结构和算法 - 企业链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  9. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...

随机推荐

  1. 数组 indexOf()

    众所周知,indexOf()这个方法经常出现在字符串的使用中,也许是用来寻找字符串中某一字符在字符串中的位置,或者也可以用来寻找字符串中重复出现的字符有哪些.对于刚接触 JS 的我们来说,在对数组的操 ...

  2. Spring5-IOC容器实现方式

    spring提供了两个接口实现IOC容器 (1)BeanFactory:IOC容器基本实现,是Spring内部使用的接口,不提倡开发人员使用 特点:加载配置文件时侯不会创建对象,在获取对象时才会创建对 ...

  3. 物理层(PHY)

    一.物理层的定义 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境.如果您想要用尽量少的词来记住这个第一层, ...

  4. 记一次线上websocket返回400问题排查

    现象 生产环境websocket无法正常连接,服务端返回400 bad request,开发及测试环境均正常. 抓包排查 src:nginx服务器 172.16.177.193dst:imp应用服务器 ...

  5. Go xmas2020 学习笔记 07、Formatted & File I/O

    07-Formatted & File I/O. I/O steams. formatted I/O. fmt functions. file I/O. Practice ① I/O. Alw ...

  6. upsource 配置git仓库时的 rsa 问题

    在使用 upsource 时,当 通过 SSH-key 需要配置一个 git 仓库代码时,在使用本机已有配置的 rsa 是出现无法连接的问题.这是需要看下具体的提示,如下图的显示 其实关键的地方看这个 ...

  7. EF Core忽略某个属性保存

    1.事情起因 某天朋友突然问我他的EF不能保存,让我帮忙看看,观察发现主表中存在明细表的集合,导致保存失败. 2.解决方案 方案1:DTO模型与DO模型分开,保存时映射. 分层领域模型规约名词解释: ...

  8. Spring从入门到源码(一)

    Spring 1.什么是框架? 人话就是:方便干活,架子有了,直接拿来用就完事了. spring,springmvc,mybatis三大开框架 2.架构的演变过程 单一应用架构 垂直应用架构 分布式服 ...

  9. CentOS8更换yum源后出现同步仓库缓存失败的问题

    1.错误情况更新yum时报错: 按照网上教程,更换阿里源.清华源都还是无法使用.可参考: centos8更换国内源(阿里源)_大山的博客-CSDN博客_centos8更换阿里源icon-default ...

  10. CA周记 - 带你进⼊ OpenAI 的世界

    2021年11月的 Microsoft Ignite , 微软带来了全新的 Azure OpenAI Service,通过新的 Azure 认知服务能够访问 OpenAI 强大的 GPT-3 模型 . ...