/*
* DynamicArray.h
*
* Created on: 2019年7月22日
* Author: Jarvis
*/ #ifndef SRC_DYNAMICARRAY_H_
#define SRC_DYNAMICARRAY_H_ //动态增长内存 策略 将数据放到堆上
//动态数组 如果5个元素 申请内存 拷贝数据 释放内存
// 容量 capacity 表示我的这块内存空间一共可以存放多少个元素
// size 记录当前数组中具体的元素个数 //定义动态数组的结构体
typedef struct DYNAMICARRAY {
int *pAddr;// 存放数据的地址
int size;//当前有多少个元素
int capacity;//容量, 容器当前能容纳多少个元素
}Dynamic_Array; //操作函数
//初始化
Dynamic_Array *Init_Array(); //插入
void PushBack_Array(Dynamic_Array *arr, 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); #endif /* SRC_DYNAMICARRAY_H_ */
/*
* DynamicArray.c
*
* Created on: 2019年7月22日
* Author: Administrator
*/ #include <stdlib.h> #include "DynamicArray.h"
Dynamic_Array *Init_Array() {
Dynamic_Array *myArray = (Dynamic_Array *)malloc(sizeof(Dynamic_Array));
myArray->size = 0;
myArray->capacity = 20;
myArray->pAddr = (int *)malloc(sizeof(int)*myArray->capacity);
return myArray;
} //插入
void PushBack_Array(Dynamic_Array *arr, int value) {
if(arr == NULL){
return;
}
//判断控件是否足够
if(arr->size == arr->capacity){
//第一步 申请一块更大的内存空间 ,新空间是旧空间的2倍
int *newSpace = malloc(sizeof(int) * arr->capacity*2);
//第二步 拷贝数据到新的空间
memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
//第三步 释放旧空间
free(arr->pAddr); //更新容量
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){
return;
} //删除元素
for(int i = pos; i < arr->size - 1; i++){
arr->pAddr[i] = arr->pAddr[i+1];
}
arr->size--; } //根据值删除
void RemoveByValue_Array(Dynamic_Array *arr, int value) {
if(arr == NULL){
return;
}
//找到值的位置
int pos = -1;
for(int i = 0; i< arr->size; i++){
if(arr->pAddr[i] == value){
pos = i;
break;
}
}
//根据位置 删除值
RemoveByPos_Array(arr, pos);
} //查找
int Find_Array(Dynamic_Array *arr, int value) {
if(arr == NULL){
return -1;
}
//找到值的位置
int pos = -1;
for(int i = 0; i< arr->size; i++){
if(arr->pAddr[i] == value){
pos = i;
break;
}
}
return pos;
} //打印
void Print_Array(Dynamic_Array *arr) {
for(int i = 0; i < arr->size; i++){
printf("%d ",arr->pAddr[i]);
}
printf("\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 -1;
}
return arr->capacity;
} //获得动态数组当前元素的个数
int Size_Array(Dynamic_Array *arr) {
if(arr == NULL){
return 0;
}
return arr->size;
} //根据位置获得某个位置的元素
int At_Array(Dynamic_Array *arr, int pos) {
return arr->pAddr[pos];
}
/*
* mian.c
*
* Created on: 2019年7月22日
* Author: Administrator
*/ #include "DynamicArray.h" #include <stdlib.h>
#include <stdio.h>
#include <string.h> void test01(){
//初始化动态数组
Dynamic_Array *arr = Init_Array(); //打印 capacity size
printf("after create arr, capacity: %d, size: %d \n",arr->capacity, arr->size);
//插入元素
for(int i = 0; i < 10; i++){
PushBack_Array(arr, i);
} //打印
printf("插入10个元素后 \n");
Print_Array(arr); //插入元素 for(int i = 0; i < 30; i++){
PushBack_Array(arr, i);
}
//打印
printf("重新插入30个元素后 \n");
Print_Array(arr); //删除
RemoveByPos_Array(arr, 0);
RemoveByValue_Array(arr, 5);
//
printf("删除两个元素后 \n");
Print_Array(arr); //查找
int pos = Find_Array(arr, 30);
printf("位置 5查找到 pos: %d value: %d \n",pos, At_Array(arr, pos));
//销毁
FreeSpace_Array(arr); } int main(){
printf("动态数组 \n");
test01();
system("pause");
return 0;
}

动态数组C语言实现的更多相关文章

  1. 可存放任意类型变量的动态数组--C语言实现

    之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...

  2. 【足迹C++primer】40、动态数组

    动态数组 C++语言定义了第二种new表达式语法.能够分配并初始化一个对象数组.标准库中包括 一个名为allocator的类.同意我们将分配和初始化分离. 12.2.1 new和数组 void fun ...

  3. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  4. c语言 动态数组

    C语言中,在声明数组时,必须明确告诉编译器数组的大小,之后编译器就会在内存中为该数组开辟固定大小的内存.有些时候,用户并不确定需要多大的内存,使用多大的数组,为了保险起见,有的用户采用定义一个大数组的 ...

  5. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  6. c语言,动态数组

    试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...

  7. C语言 动态数组实现

    一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...

  8. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  9. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

随机推荐

  1. 在不同电脑设备之间, 同步 VSCode 的插件和配置

    前提有一个码云或者github的账户,以下是我用github的示例(只有第二步不一样): Step1. 安装 同步插件"Settings Sync" Step2. 进入github ...

  2. java复制文件范例代码

    String url1 = "F:\\SuperMap-Projects\\region.udb";// 源文件路径 try { for(int i=1;i<101;i++) ...

  3. python爬去虎扑数据信息,完成可视化

    首先分析虎扑页面数据 如图我们所有需要的数据都在其中![image.png](1)所以我们获取需要的内容直接利用beaitifulsoupui4``` soup.find_all('a',class_ ...

  4. h5图片展示和ajax上传

    <img src="" id="img"/> <script src="http://static.lamian.tv//pc/pu ...

  5. python-装饰(高阶函数)

    python-装饰(高阶函数) 高阶函数 1.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码) 2.返回值 中包含函数名 高阶函数实现1的功能 def bar(): print(&qu ...

  6. PHP7安装redis扩展

    PHP7安装redis扩展优秀开源项目:http://github.crmeb.net/u/liaofeiyum -y install git git clone https://github.com ...

  7. linux pip使用国内源

    最近在Linux里面使用pip安装应用的速度十分的慢,于是便上网找了一些国内的源. 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:https:// ...

  8. 全面解析Java日期时间API

    时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间. UTC(Universal Time ...

  9. JetBrains IDEA Web开发简单配置

    很早前因为使用了一年的MyEclipse,不想更换其他的IDE工具,是因为各项配置,以及快捷键等.前段时间更换了IDEA工具,初步了解了一些功能,包括快捷,调试,配置,都很优于MyEclipse.但是 ...

  10. Laying out a webpage is easy with flex

    Flex写起来省劲很多,只用加上flex-wrap:wrap在container上.Html5 playground