/*
* 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. oa_mvc_easyui_删除(6)

    1.删除列,添加a标签,绑定参数 <a href="javascript:void(0)" class="delete" ids="@newli ...

  2. ionic 提示 Error: Could not find gradle wrapper within Android SDK.

    Error: Could not find gradle wrapper within Android SDK. Might need to update your Android SDK. 到And ...

  3. Centos固定IP

    centos7 联网 在虚拟机中以最小化方式安装centos7,后无法上网,因为centos7默认网卡未激活. 而且在sbin目录中没有ifconfig文件,这是因为centos7已经不使用 ifco ...

  4. mybatis和spring的整合

    Mybatis与Spring的集成 1.配置Spring环境 创建maven工程 pom.xml导入依赖 <project xmlns="http://maven.apache.org ...

  5. less 经典范例 bootstrap 的 less 版本 常用 less 代码

    1. bootstrap 的 less 版本 2.less 文件分布 /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011 ...

  6. HashMap原理探究

    一.写随笔的原因:HashMap我们在平时都会用,一般面试题也都会问,借此篇文章分析下HashMap(基于JDK1.8)的源码. 二.具体的内容: 1.简介: HashMap在基于数组+链表来实现的, ...

  7. strings、strconv:让你高效的处理字符串

    strings包 strings.HasPrefix(s, prefix string) bool 判断字符串s是否以prefix开头.类似于python中的startswith. package m ...

  8. wordcloud:让你的词语变成黑云

    介绍 对文本中出现频率较高的关键词给予视觉化的显示 使用 import jieba import codecs import wordcloud file = r"C:\Users\Admi ...

  9. 01--springmvc分布式项目Web项目配置

    springmvc的配置文件,放在resources目录下: 文件名:applicationContext-mvc.xml <?xml version="1.0" encod ...

  10. java字符串函数用法汇总

    替换字符串中的字符 例如有如下x的字符串 String x = "[kllkklk\kk\kllkk]"; 要将里面的"kk"替换为++,可以使用两种方法得到相 ...