首页 > 其他分享 >数据结构【动态数组】

数据结构【动态数组】

时间:2023-12-07 14:46:37浏览次数:23  
标签:index 动态 int elementData DynamicArray 数组 array 数据结构 size

数据结构【动态数组】

在堆中申请数组空间,扩容时realloc,注意不可增删改的情况并处理即可。

以下代码不一定完全正确。

#include <stdio.h>
#include <stdlib.h>

/**
 * 声明动态数组,并提供相关的函数操作
 */


// 动态数组结构体
typedef struct Array
{

    // 动态数组
    int *elementData;

    // 容量
    size_t capacity;

    // 长度
    size_t size;

} DynamicArray;



// 初始化动态数组
void initDynamicArray(DynamicArray *array, size_t initialCapacity);
// 释放动态数组内存
void destroyDynamicArray(DynamicArray *array);
// 调整动态数组内存大小
void resizeDynamicArray(DynamicArray *array, size_t newCapacity);
// 获取动态数组长度(元素个数)
size_t getLength(const DynamicArray *array);
// 在指定位置插入新元素
void insertAt(DynamicArray *array, size_t index, int element);
// 在末尾插入新元素
void insertEnd(DynamicArray *array, int element);
// 删除指定位置的元素并返回被删除的元素
int deleteAt(DynamicArray *array, size_t index);
// 删除末尾的元素并返回被删除的元素
int deleteEnd(DynamicArray *array);
// 遍历所有的元素
void print(DynamicArray *array);


/**
 * 主函数
*/
int main(int argc, char const *argv[])
{
    DynamicArray array;
    initDynamicArray(&array, 2);
    insertAt(&array, 0, 10);
    insertAt(&array, 0, 20);
    insertAt(&array, 0, 20);
    print(&array);


    getchar();
    return 0;
}


// 初始化动态数组
void initDynamicArray(DynamicArray *array, size_t initialCapacity){

    // 分配空间
    if (initialCapacity > 0) {
        array->elementData = (int *) malloc(initialCapacity * (sizeof(int)));
    } else if (initialCapacity == 0) {
        array->elementData = NULL;
    } else {
        printf("您输入的长度不合法。");
        return;
    }

    // 初始化capacity
    array->capacity = initialCapacity;

    // todo 初始化size
    array->size = 0;
}
// 释放动态数组内存
void destroyDynamicArray(DynamicArray *array){
    free(array->elementData);
}

// 扩容
void resizeDynamicArray(DynamicArray *array, size_t newCapacity){
    printf("1.5倍扩容启动\n");
    array->elementData = realloc(array->elementData, newCapacity*sizeof(int));
    array->capacity += array->capacity>>1;
}

// 获取动态数组长度(元素个数)
size_t getLength(const DynamicArray *array){
    return array->size;
}

// 在指定位置插入新元素
void insertAt(DynamicArray *array, size_t index, int element){
    // index 不符合规则的情况
    if(index < 0 || index > array->size){
        printf("无效的位置输入\n");
        return;
    }
    (array->size == array->capacity) ? resizeDynamicArray(array, array->capacity += array->capacity>>1) : 0;
    //
    for(int i = array->size; i>index; i--){
        array->elementData[i] = array->elementData[i-1];
    }
    array->elementData[index] = element;
    array->size++;
}

// 在末尾插入新元素
void insertEnd(DynamicArray *array, int element){
    insertAt(array, array->size, element);
}

// 删除指定位置的元素并返回被删除的元素
int deleteAt(DynamicArray *array, size_t index){
    if(index < 0 || index >= array->size){
        printf("无效的元素删除\n");
        return -1;
    }
    int temp = array->elementData[index];
    for(int i = index+1; i<array->size; i++){
        array->elementData[i-1] = array->elementData[i];
    }
    array->size--;
    return temp;
}

// 删除末尾的元素并返回被删除的元素
int deleteEnd(DynamicArray *array){
    return deleteAt(array, array->size-1);
}

// 遍历所有的元素
void print(DynamicArray *array){
    for(int i = 0; i<array->size; i++){
        printf("%d\n", array->elementData[i]);
    }
    printf("\n");
}

标签:index,动态,int,elementData,DynamicArray,数组,array,数据结构,size
From: https://www.cnblogs.com/wangsiyaoa/p/17881944.html

相关文章

  • 前端歌谣的刷题之路-第一百一十六题-数组去重
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 【Kubernetes存储篇】StorageClass存储类动态生成PV详解
    一、StorageClass存储类理论StorageClass的作用主要有以下几个方面:动态存储卷分配:StorageClass可以根据定义的属性动态地创建存储卷,无需手动创建和管理存储卷。存储卷的属性管理:StorageClass可以定义存储卷的属性,如存储类型、存储容量、访问模式等,从而更好地满足应用程序的存储需......
  • python 中的 collections 模块:常用数据结构和工具详解
    Python的collections模块提供了许多有用的数据结构,超越了标准的内置数据类型。这些数据结构解决了各种常见的编程问题,包括但不限于高效的容器类型、特定目的的容器、默认值字典等。让我们深入了解其中的几个重要数据结构和工具。1.defaultdict:带有默认值的字典defaultdict是d......
  • 【SpringBootWeb入门-6】请求响应-请求参数-数组集合参数&Json参数&路径参数
    这篇我们接着上一篇的请求参数来讲解另外几个常见参数的接收以及封装:数组集合参数、Json参数、路径参数。数组集合参数1、数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数在Postman接口测试新建测试,获取请求数组参数type。然后新建参数处......
  • 第1章. 动态数组(ArrayList)
    动态数组一、动态数组接口设计//这里可以写一个List接口,然后ArrayList类去实现这个接口,实现接口中的方法。但为了方便起见,直接将这些方法写在类中。//这些方法暂时不添加泛型、和正确的返回值publicclassArrayList{//动态数组的长度privateintsize;......
  • 【数据结构】线段树 (二) 学习笔记
    线段树(二)点击查看:线段树(一)学习笔记本文介绍权值线段树与动态开点线段树,(可能后面还会加线段树合并等等)。权值线段树线段树的动态开点线段树合并推荐题目&&参考资料&&拓展阅读《算法竞赛进阶指南》0x43线段树P3870 [TJOI2009]开关P1438 无聊的数列P1253 扶苏的问......
  • 【数据结构和算法】搜索算法
    ①搜索最小值python的min函数返回列表中的最小项1defindexOfMin(lyst):2minIndex=03currentIndex=14whilecurrentIndex<len(lyst):5iflyst[currentIndex]<lyst[minIndex]:6minIndex=currentIndex7currentI......
  • 【转】编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
    编译型和解释型我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译......
  • 【数据结构和算法】排序算法
    使用swap函数来交换列表中的两项的位置1defswap(lyst,i,j):2'''交换列表中两项的位置'''3temp=lyst[i]4lyst[i]=lyst[j]5lyst[j]=temp①选择排序处于列表第一项,先找到最小项的位置,如果该位置不是列表的第一项,算法会交换这两个位置的项,然后......
  • VBA-Excel数组应用
    1)数组创建A类:动态数组Dimarr()  创建一个动态变量数组,不受长度/数据类型受制B类:静态数组Dimarr(5) asstring  创建一个一维数组,下标从0开始,最大下标值为5Dimarr(3,3)asInteger创建一个二维数组,开始arr(0,0),最后一个arr(3,3)Dimarr=array(1,2,3)创建一......