/*
* 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. java中内部类

    package com.xt.instanceoftest; import com.xt.instanceoftest.Body.Heart; public class StaticInnerClas ...

  2. 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

    今天使用npm安装插件时出现了以下错误: 经查,原因:现用执行策略是 Restricted(默认设置) 解决办法: 1.win+X键,使用管理员身份运行power shell 2.输入命令:set-e ...

  3. RSA 加密长度计算公式

    The length of data that can be encrypted using RSA is determined primarily by the size of the key yo ...

  4. MySQL 主从同步架构中你不知道的“坑”(2)

    指定同步库情况 1.binlog_format= ROW模式‍ mysql> use testdb; Database changed mysql> show tables; +----- ...

  5. 多线程的些许理解(平台x86,具体考虑linux,windows)

    多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...

  6. 2019/9/18 IIS服务器 ftp站安装:隔离模式

    net user ftp1  /add 添加两个账户 在d盘下创建ftp站的文件夹ftptest,进入文件夹,创建文件夹LocalUser,进入LocalUser 分别创建administrator ...

  7. Mac OSX编译安装php7.1.8

    laravel中用到ldap认证包,要求php7.0以上版本,而且安装Mews\Captcha包的时候 验证码无法显示 报错如下: Call to undefined function Interve ...

  8. Foo, Bar的含义

    有些朋友问:foo, bar是什么意思, 为什么C++书籍中老见到这个词.我google了一下, 发现没有很好的中文答案.这个问题,在维基百科上有很好的回答.在这里翻译给大家. 译文: 术语fooba ...

  9. LeetCode_Bit Manipulation

    231. Power of Two Given an integer, write a function to determine if it is a power of two. class Sol ...

  10. 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统

    题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...