ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态数组

2021-01-10 13:32:15  阅读:201  来源: 互联网

标签:arr shu jia st liang 数组 zhi 动态


计算机小白。请大神指教,不喜勿喷!!!谢谢

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//函数声明
//给数组初始化
void chu_shi_hua(struct dong_tai* p_st_arr);
//判断数组容量
void pan_duan_rong_liang(struct dong_tai* p_st_arr);
//往数组里添加数据
void tian_jia_shu_ju(struct dong_tai* p_st_arr, int shu_ju);
//输出结果
void shu_chu(struct dong_tai* p_st_arr);
//删除结尾
void shan_jie_wei(struct dong_tai* p_st_arr);
//从数组中间增加数据
void zeng_jia_zhong_jian(struct dong_tai* p_st_arr, int shu_ju, int wei_zhi);
//删除指定数据(删除下标数据)
void shan_chu_zhi_ding(struct dong_tai* p_st_arr, int xia_biao);
//删除指定数据(删除数量即第几个)
void shan_chu_zhi_ding_wei_zhi(struct dong_tai* p_st_arr, int shu_liang);
//删除全部数据
void shan_chu_quan_bu(struct dong_tai* p_st_arr);
//释放数组
void shi_fang_shu_zu(struct dong_tai* p_st_arr);

//定义一个动态数组
struct dong_tai
{
    int rong_liang;     //数组的容量即大小
    int* pshou_di_zhi;  //数组的首地址
    int shu_liang;      //数组里面所装的元素的数量

};


int main(void)
{
    struct dong_tai st_arr;
    chu_shi_hua(&st_arr);
    //添加数据
    tian_jia_shu_ju(&st_arr, 3);
    tian_jia_shu_ju(&st_arr, 2);
    tian_jia_shu_ju(&st_arr, 1);
    tian_jia_shu_ju(&st_arr, 0);
    tian_jia_shu_ju(&st_arr, 9);
    tian_jia_shu_ju(&st_arr, 8);
    tian_jia_shu_ju(&st_arr, 7);
    tian_jia_shu_ju(&st_arr, 6);


    //从任意位置添加数据
    zeng_jia_zhong_jian(&st_arr, 99999, 1);
    zeng_jia_zhong_jian(&st_arr, 888, 24);
    zeng_jia_zhong_jian(&st_arr, 777, 245);
    zeng_jia_zhong_jian(&st_arr, 666, 524);
    zeng_jia_zhong_jian(&st_arr, 555, 124);
    zeng_jia_zhong_jian(&st_arr, 444, 10);
    zeng_jia_zhong_jian(&st_arr, 777, 18);
    zeng_jia_zhong_jian(&st_arr, 111, 11);
    zeng_jia_zhong_jian(&st_arr, 6666, 15);
    zeng_jia_zhong_jian(&st_arr, 23, 30);
    zeng_jia_zhong_jian(&st_arr, 123, 2);
    zeng_jia_zhong_jian(&st_arr, 456, 12);
    zeng_jia_zhong_jian(&st_arr, 789, 9);
    //删除结尾
    shan_jie_wei(&st_arr);
    shan_jie_wei(&st_arr);
    shan_jie_wei(&st_arr);

    //删除指定元素
    shan_chu_zhi_ding(&st_arr, 2);   //删除的是下标元素
    //删除指定位置数据
    shan_chu_zhi_ding_wei_zhi(&st_arr, 34);
    //输出结果
    shu_chu(&st_arr);
    //删除全部数据
    shan_chu_quan_bu(&st_arr);
    //输出结果
    shu_chu(&st_arr);
    //释放数组
    shi_fang_shu_zu(&st_arr);
    //输出结果
    shu_chu(&st_arr);

    //释放容量不够时申请的空间
       free(st_arr.pshou_di_zhi);

    system("pause");
    return 0;
}



//给数组初始化
void chu_shi_hua(struct dong_tai* p_st_arr)
{
    //参数合法性检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }

    p_st_arr->rong_liang = 5;
    p_st_arr->shu_liang = 0;
    p_st_arr->pshou_di_zhi = (int *)malloc(sizeof(int) * p_st_arr->rong_liang);
    //检测空间是否申请成功
    if (NULL == p_st_arr->pshou_di_zhi)
    {
        printf("空间申请失败\n");
        return;
    }
    
}

//判断数组容量
void pan_duan_rong_liang(struct dong_tai* p_st_arr)
{
    //参数合法性检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;

    }

    if (p_st_arr->shu_liang == p_st_arr->rong_liang)
    {
        p_st_arr->rong_liang += 10;

        //重新申请空间
        int* pTemp = (int*)malloc(sizeof(int) * p_st_arr->rong_liang);
        //检测新空间是否申请成功
        if(NULL ==pTemp)
        {
            printf("空间申请失败");
        }
        //将原空间数据复制进新空间
        for (int i = 0; i < p_st_arr->shu_liang; i++)
        {
            pTemp[i] = p_st_arr->pshou_di_zhi[i];
        }
        //释放原空间
        free(p_st_arr->pshou_di_zhi);
        //使首地址指向新空间
        p_st_arr->pshou_di_zhi = pTemp;
        
    }
}

//往数组里添加数据
void tian_jia_shu_ju(struct dong_tai* p_st_arr, int shu_ju)
{
    //参数判断
    if (NULL == p_st_arr)
    {
        printf("参数错误");
        return;

    }
    //判断数组容量
    pan_duan_rong_liang(p_st_arr);
    //把数据传进数组
    p_st_arr->pshou_di_zhi[p_st_arr->shu_liang] = shu_ju;
    p_st_arr->shu_liang++;

}

//从数组中间增加数据
void zeng_jia_zhong_jian(struct dong_tai* p_st_arr, int shu_ju,int wei_zhi)
{
    //参数检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //判断容量
    pan_duan_rong_liang(p_st_arr);
    //如果位置大于数量 则将数据直接插入数组结尾
    if (wei_zhi > p_st_arr->shu_liang)
    {
        p_st_arr->pshou_di_zhi[p_st_arr->shu_liang] = shu_ju;
        p_st_arr->shu_liang++;
        return;
        //wei_zhi = p_st_arr->shu_liang;
    }
    
    //将指定位置数据后面的数据依次向后移
    for (int i = p_st_arr->shu_liang; i >= wei_zhi; i--)//注:如果所传递的是下标 那么就不需要i>wei_zhi-1就直接是i>xia_biao
    {
        p_st_arr->pshou_di_zhi[i] = p_st_arr->pshou_di_zhi[i - 1];
    }
    //将指定数据放入指定位置
    p_st_arr->pshou_di_zhi[wei_zhi-1] = shu_ju;//注:如果所传递的是下标 那么就不需要i>wei_zhi-1就直接是i>xia_biao
    p_st_arr->shu_liang++;
    



 }

//删除数组结尾数据
void shan_jie_wei(struct dong_tai* p_st_arr)
{
    //参数检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    p_st_arr->shu_liang--;
}

//删除指定数据(删除下标元素)
void shan_chu_zhi_ding(struct dong_tai* p_st_arr,int xia_biao)
{
    //参数检测
    if(NULL==p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //下标大于数量时
    if (xia_biao >= p_st_arr->shu_liang)
    {
        printf("删除数据发生错误\n");
        return;
    }
    //将删除指定下标后面的数据依次前移
    for (int i = xia_biao; i < p_st_arr->shu_liang; i++)
    {
        p_st_arr->pshou_di_zhi[i] = p_st_arr->pshou_di_zhi[i+1];
    }
    //删除后数量减一
    p_st_arr->shu_liang--;
}

//删除指定数据(删除数量即第几个)
void shan_chu_zhi_ding_wei_zhi(struct dong_tai* p_st_arr,int wei_zhi)
{
    //参数检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //下标大于数量时
    if (wei_zhi >= p_st_arr->shu_liang)
    {
        printf("删除数据发生错误\n");
        return;
    }
    //将删除指定位置的数字后面的数据依次前移
    for (int i = wei_zhi-1; i < p_st_arr->shu_liang-1; i++)
    {
        p_st_arr->pshou_di_zhi[i] = p_st_arr->pshou_di_zhi[i + 1];
    }
    //删除后数量减一
    p_st_arr->shu_liang--;
}

//删除全部数据
void shan_chu_quan_bu(struct dong_tai* p_st_arr)
{
    //参数检测
    if(NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //令数量为零
    p_st_arr->shu_liang = 0;

}

//释放数组
void shi_fang_shu_zu(struct dong_tai* p_st_arr)
{
    //参数检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //容量等于0
    p_st_arr->rong_liang = 0;
    //数量等于0
    p_st_arr->shu_liang = 0;
    //释放空间
    free(p_st_arr->pshou_di_zhi);
    p_st_arr->pshou_di_zhi = NULL;

}

//输出结果
void shu_chu(struct dong_tai* p_st_arr)
{
    //参数检测
    if (NULL == p_st_arr)
    {
        printf("参数错误\n");
        return;
    }
    //输出容量、数量、以及数组里面的数据
    printf("数量: %d, 容量: %d\n", p_st_arr->shu_liang, p_st_arr->rong_liang);
    printf("数据: ");
    for (int i = 0; i < p_st_arr->shu_liang; i++)
    {
        printf("%d ", p_st_arr->pshou_di_zhi[i]);
    }

    printf("\n\n\n");
}

 

标签:arr,shu,jia,st,liang,数组,zhi,动态
来源: https://www.cnblogs.com/Bleak-mamba/p/14258078.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有