动态数组

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

#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");
}

 

上一篇:WPF数据绑定


下一篇:裁剪算法——中点分割算法/Liang-Barsky算法