int型动态数组总结

Posted 菜鸟沃土

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了int型动态数组总结相关的知识,希望对你有一定的参考价值。

简单的数据结构之-int型动态数组

这个貌似没有参考可以借鉴,如果哪位有幸看到,请您给我说一下哈!再次感谢各位了!

想关的参看的资料来自某培训机构,我是参照动态数组写的

想关的介绍文章 C语言中文网:http://c.biancheng.net/cpp/html/2790.html

 

 

数组都有一个固定的长度,超出它的长度就无法再添加新的元素,但是动态数组可以动态的增加数组的长度,可以无限的插入数据。

 

 

// 动态数组是一个不存在的数据类型,所以需要定义一个结构体来说明动态数组的类型,数组需要空间存储数据,因为对初始容量什么的未知,所以需要定义一个指针(int*):

数组有自己的容量,当容量不够时,需要动态增加容量,既然有容量,那么就需要一个变量来存储数组的实际长度

 

typedef struct _INT_DYNAMICARRAY

{

    int *array;

    int arrayLen;

    int capacity;

}IntDynamicArray;

 

数组结构体,定义好了之后,还需要定义想关的操作函数,增删改查是基本数据结构的四个函数,还有初始化、打印、释放,数组的大小、容量、数据的排序,

 

动态数组的初始化:

主要功能就是对动态数据的结构体分配内存空间

 

int Init_IntDynamicArray(IntDynamicArray **Array, int Capacity)

{

    // 对传入的参数进行判断,如果为空,则终止下面的执行,没空间没法执行

    if (Array == NULL)

    {

        exit(-1);

    }

 

    // 为动态数组的结构体开辟空间

    *Array = (IntDynamicArray *)malloc(sizeof(IntDynamicArray));

    if (*Array == NULL)

    {

        exit(-2);

    }

 

    // 为(*Array)->array 开辟一段长度为 Capacity 的空间用来存储数组的数据

    (*Array)->array = (int *)malloc(sizeof(int)*Capacity);

 

    // 对开辟的空间一定要判断,这儿没有用return 的原因是开辟空间失败,后面的操作有报错的可能

    if ((*Array)->array == NULL)

        exit(-2);

   

    // 对开辟的空间赋初始值

    for (int i = 0; i < Capacity; ++i)

        (*Array)->array[i] = 0;

    // 对结构体中的关键字进行初始化

    (*Array)->arrayLen = 0;

    (*Array)->capacity = Capacity;

 

    return 0;

}

 

// 元素的插入

int Insert_IntDynamicArray(IntDynamicArray *Array, int Data,int Pos)

{

    // 对传入的参数进行检查

    if (Array == NULL)

    {

        return -1;

    }

 

    // 对传入的参数进行合理化处理

    if (Pos < 0 )

    {

        Pos = 0;

    }

    if (Pos > Array->arrayLen)

    {

        Pos = Array->arrayLen;

    }

 

    // 如果空间不够,那么开辟一段空间来存储新的数据

    if (Array->arrayLen == Array->capacity)

    {

        // 开辟两倍的空间

        int *array = (int *)malloc(sizeof(int) * 2 * Array->capacity);

        if (array == NULL)

        {

            return -2;

        }

       

        // 将原数据的元素拷贝过来,这儿也可以用循环

        memcpy(array, Array->array, sizeof(int)*Array->arrayLen);

       

        // 释放原来的空间

        free(Array->array);

 

        Array->array = array;

        Array->capacity *= 2;

 

        // 对新开辟的空间进行初始化

        for (int i = Array->arrayLen; i < Array->capacity; ++i)

        {

            array[i] = 0;

        }

    }

    // 为插入元素腾出空间

    for (int i = Array->arrayLen-1; i >= Pos; --i)

    {

        Array->array[i+1] = Array->array[i];

    }

 

    // 插入新元素

    Array->array[Pos] = Data;

 

    ++ Array->arrayLen;

 

    return 0;

}

 

// 元素的删除

int EraseByPos_IntDynamicArray(IntDynamicArray *Array, int Pos)

{

    if (Array == NULL)

    {

        return -1;

    }

    if (Pos < 0 || Pos >= Array->arrayLen)

    {

        return -2;

    }

 

    // 直接通过覆盖的方式删除

    for (int i = Pos; i < Array->arrayLen - 1; ++i)

    {

        Array->array[i] = Array->array[i + 1];

    }

 

    -- Array->arrayLen;

    return 0;

}

 

// 修改

int Modif_IntDynamicArray(IntDynamicArray *Array, int Pos, int Data)

{

    if (Array == NULL)

    {

        return -1;

    }

    if (Pos<0 || Pos>Array->arrayLen - 1)

    {

        return -2;

    }

 

    Array->array[Pos] = Data;

 

    return 0;

}

 

// 通过位置查找

int SeekByPos_IntDynamicArray(IntDynamicArray *Array, int Pos)

{

    if (Array == NULL)

    {

        return 0x00;

    }

    if(Pos<0||Pos>Array->arrayLen-1)

    {

        return 0x01;

    }

    return Array->array[Pos];

}

 

// 查找第一次出现某值的位置

int SeekByVal_IntDynamicArray(IntDynamicArray *Array, int Val)

{

    if (Array == NULL)

    {

        return 0x00;

    }

    for (int i = 0; i < Array->arrayLen; ++i)

    {

        if (Array->array[i] == Val)

            return i;

    }

    return -1;

}

 

// 打印动态数组

void Print_IntDynamicArray(IntDynamicArray *Array)

{

    if (Array == NULL)

    {

        return;

    }

    for (int i = 0; i < Array->arrayLen; ++i)

    {

        printf("%d ", Array->array[i]);

    }

    printf("\n");

}

 

 

// 数组长度

int Size_IntDynamicArray(IntDynamicArray *Array)

{

    if (Array == NULL)

    {

        return -1;

    }

    return Array->arrayLen;

}

 

 

// 数组容量

int Capacity_IntDynamicArray(IntDynamicArray *Array)

{

    if (Array == NULL)

    {

        return -1;

    }

    return Array->capacity;

}

 

// 销毁

int Destroy_IntDynamicArray(IntDynamicArray *Array)

{

    if (Array == NULL)

    {

        return -1;

    }

    if (Array->array != NULL)

    {

        free(Array->array);

    }

 

    free(Array);

 

    return 0;

}

 

呵呵!结束了!

 

以上是关于int型动态数组总结的主要内容,如果未能解决你的问题,请参考以下文章

怎么动态分配指针数组

用new运算符动态分配一个长度为n的整型数组

C语言如何定义动态数组

C语言如何定义动态数组

指针与变量(或数组)的动态创建与释放

初始化动态分配数组