前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构之【实现数组】

数据结构之【实现数组】

作者头像
Sky_Mao
发布2020-07-24 10:11:34
3570
发布2020-07-24 10:11:34
举报

首先需要定义一个存放数据的结构体(如果是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);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档