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;

    }

    呵呵!结束了!

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5879599.html
Copyright © 2011-2022 走看看