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 其它常见算法 ...
随机推荐
- 启动分区查找可以通过 fdisk -l命令
这里有两个硬盘,一个硬盘有两个分区,sda1 的boot列 带*表示是启动分区,否则为空
- [已解决] 含gorm、sqlite3包的go程序构建失败 C:\Program Files\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
gorm官方文档教程实例,构建出现错误.C:\Program Files\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit st ...
- Python BeautifulSoup4 爬虫基础、多线程学习
针对 崔庆才老师 的 https://ssr1.scrape.center 的爬虫基础练习.Threading多线程库.Time库.json库.BeautifulSoup4 爬虫库.py基本语法
- Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务
前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.多组织共同运行维护Orderer服务中,我们已经完成了让普通组织运行维护 Orderer 服务,但是 ...
- 关于C++类定义中不能声明该类对象,而Java中可以的原因
相信接触过C++的人,在学习Java的过程当中,会遇到这样一个问题:在Java中常常会在类定义中声明一个该类的对象(例如Person类定义中声明一些叫parents之类的Person对象),但是在C+ ...
- 记一次sql注入的解决方案
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 本文在公众号文章已同步,还有各种一线大厂面试原题.我的学习系列笔记. 今天业务提了个模糊查询,一听就知道这种问题有坑,肯定涉及到sql注入, ...
- Maven基础学习笔记
Maven基础学习笔记 下载链接 官网:https://maven.apache.org/ 所有版本:https://archive.apache.org/dist/maven/maven-3/ 阿里 ...
- CNN-Backbone的Pytorch实现
创建日期: 2020-07-04 17:19:39 简介:卷积神经网络非常适合处理图像相关任务,其优势一是权值共享策略,降低了模型复杂度和参数量,本质上也对应着生物视觉神经的感受野.二是其强大的特征提 ...
- 一文详解 Ansible 自动化运维
开源Linux 一个执着于技术的公众号 一.Ansible 概述 Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误 ...
- content应用