动态数组
作者:互联网
计算机小白。请大神指教,不喜勿喷!!!谢谢
#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