听黑马程序员教程《基础数据结构和算法 (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. OllyDbg---call和ret指令

    call和ret call指令 cal指令是转移到指定的子程序处,后面紧跟的操作数就是给定的地址. 例如,call 401362表示转移到地址401362处,调用401362处的子程序,当子程序调用完 ...

  2. Spring-Bean依赖注入(引用数据类型和集合数据类型)

    为什么使用spring依赖注入详见–>依赖注入分析 1.创建实体类User类 package com.hao.domain; public class User { private String ...

  3. Intel主板芯片组

    写这个的初衷还是由于linux内核本身就是硬件的抽象,如果你对硬件的相关发展,机制以及架构不了解,实际你也是看不懂linux内核代码以及看不懂linux很多命令输出的结果的,如果你看内核代码就会发现内 ...

  4. Protoc安装

    系统:linux 记住,千万别混乱版本,一般protoc可执行文件在/usr/local/bin/或/usr/bin/下 个人这里使用3.13版本示例,下面两部分命令可以写入shell脚本,记住执行要 ...

  5. MySQL8.0.x 版本安装步骤傻瓜式教程【官方版】

    MySQL8.0.x 安装 一.下载 MySQL官网下载链接:https://downloads.mysql.com/archives/community/ 选择版本后下载zip文件 博主选择的是8. ...

  6. vue 跨域配置代理 get/post 请求

    1.第一步要有 axios 插件 : npm i axios 首先要在自己的项目手动添加一个文件 vue.config.js 个人理解的为 这是axios 封装的跨域文件. 2.vue.config. ...

  7. “浪潮杯”第九届山东省ACM大学生程序设计竞赛 F: Four-tuples容斥定理

    题目 F : Four-tuples  输入 1 1 1 2 2 3 3 4 4 输出 1 题意 给l1, r1, l2, r2, l3, r3,  l4, r4​ , 八个数据, 要求输出在区间[l ...

  8. C语言基础部分练习(http://acm.hgnu.edu.cn)

    前言 最近有朋友和同学找我要c语言基础练习答案,为了方便分享,放在我的博客上了,如果对你确实有帮助,可以考虑点下赞或打赏哦(都能通过,没有专注于搞算法,所以有的地方可以优化,欢迎在评论区留言) A. ...

  9. Bugku CTF练习题---杂项---隐写3

    Bugku CTF练习题---杂项---隐写3 flag:flag{He1l0_d4_ba1} 解题步骤: 1.观察题目,下载附件 2.打开图片,发现是一张大白,仔细观察一下总感觉少了点东西,这张图好 ...

  10. vue - git

    今天差不多从中午开始下午一点才开始学的,把git学了一大半了,还好任务不是很多,但是我上午用的时间挺值的,因为我去搞了个cnblogs的背景主题,就是你们现在所看到的这套,这个没搞明白有一通研究的,只 ...