C语言- 基础数据结构和算法 - 动态数组
听黑马程序员教程《基础数据结构和算法 (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语言- 基础数据结构和算法 - 动态数组的更多相关文章
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言- 基础数据结构和算法 - 队列的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...
- C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 循环链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...
随机推荐
- axios路径变量传到后端没有被解析的问题
目录就这一个(/-/) 这是一个小小的坑,大家注意一下就好,先上代码 //监听用户状态 async userStateChange(userInfo) { console.log(userInfo); ...
- int bool str
一. python的基本数据类型 1. int 整数 2. bool 布尔. 判断. if while 3. str 字符串 ,一般存放小量的数据 4. list 列表. 可以存放大量的数据 ...
- 小程序容器助力打造企业超级App
阿拉丁研究院发布<2021 年度小程序互联网发展白皮书>显示,2021 年全网小程序数量已超 700 万,其中微信小程序开发者突破 300 万,DAU 超过 4.5 亿:日均使用次数同比增 ...
- 学习打卡day14&&构建之法阅读笔记第二篇
对于书中所提到的结对编程我还是有些许感受的,在大二上学期我就有和同学合作,共同完成编码.有时候可能是我来做非常非常简易的前端页面部分,然后给同学一个基础框架,让同学往框架里面填充,时而遇到问题我再来沟 ...
- 数据库基础知识详解四:存储过程、视图、游标、SQL语句优化以及索引
写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正. 11.存储过程 存储过程是事先经过编译并存储在数 ...
- UnrealEngine创建自定义资产类型
导语 这篇文章记录了将UObject实例保存在Asset文件的方法,用这个方法可以将自定义的UObject数据序列化保存到文件,可以用于自定义UE资源类型. 创建UObject类 这一步比较简单,按照 ...
- python基础练习题(题目 使用lambda来创建匿名函数。)
day34 --------------------------------------------------------------- 实例049:lambda 题目 使用lambda来创建匿名函 ...
- wireshark、tcpdump使用笔记
最近使用wireshark抓包icmp协议,过滤的命令如下所示: ip.addr eq 192.168.20.54 and ip.addr eq 192.168.50.131 and (icmp) 如 ...
- .NET性能优化-你应该为集合类型设置初始大小
前言 计划开一个新的系列,来讲一讲在工作中经常用到的性能优化手段.思路和如何发现性能瓶颈,后续有时间的话应该会整理一系列的博文出来. 今天要谈的一个性能优化的Tips是一个老生常谈的点,但是也是很多人 ...
- [题解][YZOJ50104] 密码 | 简单计数
同步发表于 Mina! 题目大意 对于满足以下要求的长度为 \(n\) 的序列进行计数: 序列的值域为 \([1,k]\); 对于序列的任意位置 \(p\in[1,n]\),可以找到至少一个 \(i\ ...