zoukankan      html  css  js  c++  java
  • 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(" ");

    }

    // 数组长度

    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;

    }

    呵呵!结束了!

  • 相关阅读:
    PHP Context学习系列《十》
    学习php记录《九》
    学习php记录《八》
    php学习记录《七》
    换到新工作后
    学习php记录《六》
    学习php记录《五》
    学习php记录《四》
    学习php记录《三》
    html基础
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5879599.html
Copyright © 2011-2022 走看看