概述
本文主要解释了核心概念何为动态数组,以及为动态数组添加第一个功能(添加数据)并将输出数组,扩容,添加数据,删除数据,插入数据的功能写成函数的形式。
一、核心概念阐述
1,动态数组:数组在C语言中一旦被定义就不能更改,但在实际运用中经常涉及数组中数据要添加插入查询等功能,动态数组即为为数组添加这些功能后的载体。
2,扩容:一般在定义数组时就已经固定了其长度,但动态数组时常有添加数据插入数据等需求,这时就需要对数组进行扩容以达到存放更多数据的效果。
3,值得注意的是在使用函数与调用函数时应注意函数调用的参数顺序应与调用时的顺序保持一致。
二、如何添加数据
在添加数据前要先根据数组长度和有效数据判断其是否需要进行扩容,若二者相等则进行扩容操作,而后添加数据即为把输入的数据赋以当前有效数值的下标,最后记得将有效数值加一。
三、如何删除数据
删除数据的方法有两种,一种为删除指定位置的数据,另一种为删除指定数据,所以我们应先根据用户输入的数字判断应使用那种方法删除数据,删除指定位置的数据需要先让用户输入想要删除的下标,然后先保存数据,再利用循环体将从指定下标的数据进行前移,最后在将size减一;删除指定数据则需要用户输入想要删除的指定数据,再利用循环体将整个数组中的数据与指定数据进行比较,发现指定数据后将从这一数据开始的数据都向前移一个,再使size减一即可,最后函数需要返回数组的指针。
四、如何插入数据
首先要先将size与len进行比较,判断是否需要进行扩容,而后需要用户输入想要插入的位置(index)与想要插入的数据(data),将从index位置开始的数据都向后移一格,再将数据data输入到index位置最后使size加一,函数返回数组的指针
五、完整实操案例:
步骤 1:定义实体类
示例代码
#include<stdio.h>#include<stdlib.h>voidprintln(int*arr,intsize){printf("Arr当前数据:%d=",size);for(inti=0;i<size;i++){printf("%d ",arr[i]);}printf("\n");}int*expand(int*arr,int*len){intnlen=(*len)*2;int*narr=(int*)malloc(nlen*sizeof(int));for(inti=0;i<*len;i++){narr[i]=arr[i];}arr=narr;*len=nlen;returnarr;}int*add(int*arr,int*size,int*len,intdata){if(*size==*len){arr=expand(arr,len);}arr[(*size)]=data;(*size)++;printf("添加数据成功\n");returnarr;}int*shan(int*arr,int*size,intnum){if(num==21){printf("==== 21:删除指定位置数据 -> 请输入数据下标 ====\n");intindex=0;scanf("%d",&index);intremove=arr[index];for(inti=index;i<*size;i++){arr[i]=arr[i+1];}(*size)--;printf("删除数据:%d\n",remove);}elseif(num==22){printf("==== 21:删除指定数据 -> 请输入数据 ====\n");intdata=0;scanf("%d",&data);inti;for(i=0;i<*size;i++){if(arr[i]==data){for(intj=i;j<*size;j++){arr[j]=arr[j+1];}break;}}(*size)--;printf("删除数据成功:%d,对应下标:%d\n",data,i);}returnarr;}int*insert(int*arr,int*size,int*len,intindex,intdata){if(*size==*len){arr=expand(arr,len);}for(inti=(*size)-1;i>=index;i--){arr[i+1]=arr[i];}arr[index]=data;(*size)++;printf("在%d位置,插入数据%d 操作成功 \n",index,data);returnarr;}intmain(){intarr[]={1,2,3,4,5};int*arrp=arr;intsize=5;//数组中的有效数据intlen=5;//初数组的长度intid=0;while(1){printf("==== 动态数组 ====\n");printf("==== 1:添加数据 ====\n");printf("==== 2:删除数据 ====\n");printf("==== 3:插入数据 ====\n");printf("==== 4:查询数据 ====\n");printf("==== 5:替换数据 ====\n");printf("==== 请输入编号: ====\n");scanf("%d",&id);switch(id){case1:{printf("==== 1:添加数据 -> 请输入数据: ====\n");intdata=0;scanf("%d",&data);arrp=add(arrp,&size,&len,data);break;}case2:{printf("==== 2:删除数据 -> 21:删除指定位置数据 22:删除指定数据:\n");intnum=0;scanf("%d",&num);arrp=shan(arrp,&size,num);break;}case3:{printf("==== 3:插入数据 -> 输入插入位置和数据: ====\n");intindex=0;intdata=0;scanf("%d %d",&index,&data);arrp=insert(arrp,&size,&len,index,data);break;}break;case4:break;case5:break;}println(arrp,size);}return0;}