美文网首页
数据结构之【实现数组】

数据结构之【实现数组】

作者: Sky_Mao | 来源:发表于2019-03-15 22:57 被阅读0次

    首先需要定义一个存放数据的结构体(如果是C++的话可以使用类)

    //定义数据结构体
    struct MyArry
    {
        int* pBase;  //存储数组第一个元素的地址
        int nCnt;    //当前有效元素的个数
        int nLen;    //数组能够存放元素最大的个数
    };
    

    接着实现一下数组的追加、插入、删除、排序、显示等方法

    bool append_arry(MyArry * pArr, int nValue); //追加
    bool insert_arry(MyArry * pArr, int nPos, int nValue); //插入
    bool delete_arry(MyArry * pArr, int nPos, int *pValue); //删除数组内容
    bool isEmpty(MyArry * pArr); //是否为空
    bool isFull(MyArry * pArr); //是否满了
    void sort_arry(MyArry* pArr);
    void show_arry(MyArry * pArr);
    void inversion_arry(MyArry * pArr);                    //反转数组元素
    void init_arry(MyArry* pArr, int nLength);
    

    在定义一个结构体变量的时候,需要对结构体的内容进行初始化,那么初始化的函数实现是这么来实现的
    形参列表为指向数组地址的指针变量,一个初始化数组大小的长度

    具体代码如下:

    void init_arry(MyArry* pArr, int nLength)
    {
        pArr->pBase = (int*)malloc(sizeof(int) * nLength);
    
        if (nullptr == pArr->pBase)
        {
            printf_s("%s \n", "内存分配失败");
            exit(-1);
        }
        else
        {
            pArr->nCnt = 0;
            pArr->nLen = nLength;
        }
    }
    

    接下来实现一下追加的函数

    bool append_arry(MyArry* pArr, int nValue)
    {
        if (isFull(pArr))
        {
            return false;
        }
    
        pArr->pBase[pArr->nCnt] = nValue;
        ++(pArr->nCnt);
    
        return true;
    }
    

    那么较为复杂的为插入、删除元素,重点讲解一下

    比如数组中已有5个元素

    存储5个元素的数组

    假设在第三个位置插入一个元素,那么可以传入一个数组位置,假设定义为:

    int nPos = 3;

    在第三个数组位置插入元素

    那么插入的方法是这样的,需要把位置为3的内容移动到后面,在移动的时候需要从最后一个元素进行移动

    大概是这样的:

    插入元素移动示意图

    在插入的过程中,是有一些约束条件的,比如传入的nPos是不能小于1的,并且nPos不能大与当前有效元素个数+1

    因为传入的nPos是从1开始的,而数组元素是从0开始的,当nPos大与当前有效元素的个数的时候,造成了跨越插入

    因为数组是连续存储的,所以不支持这么插入

    还有一个条件是当数组已经满的时候也是无法插入的

    具体代码实现如下:

    bool insert_arry(MyArry* pArr, int nPos, int nValue)
    {
        if (isFull(pArr))
        {
            return false;
        }
    
        if (nPos < 1 || nPos > pArr->nCnt + 1)
        {
            return false;
        }
    
        //插入数据
        for (int i = pArr->nCnt - 1; i >= nPos - 1; --i)
        {
            pArr->pBase[i + 1] = pArr->pBase[i];
        }
    
        pArr->pBase[nPos - 1] = nValue;
        ++(pArr->nCnt);
    
        return true;
    }
    

    删除某一个位置的元素应该怎么实现?

    举个例子,假如这里还有一个元素为5个的数组

    存储5个元素的数组

    假设需要删除第三个元素

    删除第三个元素

    那么是不是只需要把后面的元素移动到删除的位置就可以了

    示例图:


    移动元素示意图

    具体的代码实现如下:

    bool delete_arry(MyArry* pArr, int nPos, int* pValue)
    {
        if (isEmpty(pArr))
        {
            return false;
        }
    
        if (nPos < 1 || nPos > pArr->nCnt)
        {
            return false;
        }
    
        *pValue = pArr->pBase[nPos - 1];
    
        for (int i = nPos; i < pArr->nCnt; i++)
        {
            pArr->pBase[i - 1] = pArr->pBase[i];
        }
    
        --(pArr->nCnt);
    
        return true;
    }
    

    其他函数实现:

    //判断数组是不是为空
    bool isEmpty(MyArry* pArr)
    {
        if (0 == pArr->nCnt)
        {
            return true;
        }
    
        return false;
    }
    
    //判断数组是不是满了
    bool isFull(MyArry* pArr)
    {
        if (pArr->nCnt == pArr->nLen)
        {
            return true;
        }
    
        return false;
    }
    
    //使用冒泡排序
    void sort_arry(MyArry* pArr)
    {
        int k = 0;
    
        for (int i = 0; i < pArr->nCnt; i++)
        {
            for (int j = i + 1; j < pArr->nCnt; j++)
            {
                //升序
                if (pArr->pBase[i] > pArr->pBase[j])
                {
                    k = pArr->pBase[i];
                    pArr->pBase[i] = pArr->pBase[j];
                    pArr->pBase[j] = k;
                }
            }
        }
    }
    
    void show_arry(MyArry* pArr)
    {
        if (isEmpty(pArr))
        {
            printf_s("%s \n", "数组为空");
        }
        else
        {
            for (int i = 0; i < pArr->nCnt; i++)
            {
                printf_s("%d \n", pArr->pBase[i]);
            }
        }
    }
    
    void inversion_arry(MyArry* pArr)
    {
        int i = 0;
        int j = pArr->nCnt - 1;
    
        int t = 0;
    
        while (i < j)
        {
            t = pArr->pBase[i];
            pArr->pBase[i] = pArr->pBase[j];
            pArr->pBase[j] = t;
    
            ++i;
            --j;
        }
    }
    
    int main()
    {
        MyArry arr;
        init_arry(&arr, 6);
        
        show_arry(&arr);
    
        append_arry(&arr, 1);
        append_arry(&arr, 2);
        append_arry(&arr, 80);
        append_arry(&arr, 4);
        append_arry(&arr, 5);
        //append_arry(&arr, 6);
    
        insert_arry(&arr, 6, 99);
    
        inversion_arry(&arr);
    
        sort_arry(&arr);
    
        /*int nDeleteValue = -1;
        if (delete_arry(&arr, 6, &nDeleteValue))
        {
            printf_s("%s \n", "删除成功");
            printf_s("删除的值是:%d \n", nDeleteValue);
        }
        else
        {
            printf_s("%s \n", "删除失败");
        }*/
        
    
        show_arry(&arr);
        //printf_s("%d \n", arr.nCnt);
    }
    

    相关文章

      网友评论

          本文标题:数据结构之【实现数组】

          本文链接:https://www.haomeiwen.com/subject/ygpdmqtx.html