/*
* 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. 导出excel-NPOI

    前台调用: view: <a href='/Admin/NurseUser/Excel' target='_blank'>导出Excel</a>或js: window.loca ...

  2. 三、redis学习(jedis连接池)

    一.jedis连接池 二.jedis连接池+config配置文件 三.jedis连接池+config配置文件+util工具类 util类 public class JedisPoolUtils { / ...

  3. Tcp之心跳包

    Tcp之心跳包 心跳包 跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着. 事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很 ...

  4. java在遍历列表的时候删除列表中某个元素

    在遍历list的时候需要删除其中的某些元素,不要用foreach遍历,需要用Iterator. List<String> list = new ArrayList<String> ...

  5. AES加密解密 Java中运用

    AES全称 Advanced Encryption Standard, 高级加密算法,更加安全,可取代DES. Aes: package com.blog.d201706.encrypt; impor ...

  6. 虚拟机Linux下扩展硬盘的方法

    [原文链接]:http://blog.csdn.net/tianlesoftware/article/details/5642883 装虚拟机时空间划小了,于是又加了5G的空间,折腾了半天,挂上去了. ...

  7. deep_learning_Function_tensorflow_transpose()

    tf.transpose()的用法 一.tensorflow官方文档内容 transpose(     a,     perm=None,     name='transpose' ) Defined ...

  8. Eclipse设置模板codetemplates

    在Window->Preferences->Java->Code Style->Code Templates,点击"Import",导入模板codetemp ...

  9. 利用SAX解析读取XML文件

    xml     这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读 ...

  10. 【CF208E】Blood Cousins

    题目大意:给定一个 N 个点的森林,M 个询问,每次询问对于点 u 来说,有多少个点和 u 有相同的 K 级祖先. 题解:线段树合并适合处理子树贡献的问题. 发现要回答这个询问在点 u 处计算很困难, ...