概述
我们已经完成动态数组,但是将所有方法写在同一个函数里,十分的繁杂,所以要把操作动态数组的所有功能设计成一个个独立的函数。
整体的主函数框架不变,但是要把具体的操作方法拿出来写到另外的函数中。
扩容方法
形式:返回值 方法名(需要用到的数据){}
int *expand(int *arrP, int *len) { //在原数组长度上2陪扩容(开辟新的内存空间,以字节为单位) int nLen = (*len) * 2; int *nArrP = (int *)malloc(nLen *sizeof(int)); //复制数据 for (int i = 0; i < *len; i++) { nArrP[i] = arrP[i]; } //更新内存地址 arrP = nArrP; len = &nLen; return arrP; }在这里的用到的参数不是数组本身和长度本身,而是他们所在的地址。长度本身不能随着我们之后的变化而变化,只有地址的变化才可以。
***需要注意长度更新的时候要有取值符。从而去改变长度的大小。
并且数据是应该要返回的,所以在这里我们用的是int返回值。可以理解为数组的长度属于int形式,所以这里返回值也是int形式。
添加数据
int *add(int *arrP, int *size, int *len, int data) { //判断是否需要扩容 if (*size == *len) { arrP = expand(arrP, len); } arrP[(*size)] = data; (*size)++; return arrP; }在添加数据的方法当中扩容就可以直接调用expand方法。需要注意其中的属性如size,len等等这些都需要用到他们的地址,去改变他们的具体数值。
删除数据
删除数据分为两种。
①删除具体的某个位置的数据。
②删除具体某个数据。
在这里需要多加的一个就是第二种当中如果输入的index时候需要发出的指令。
if (index < 0 || index >= (*size)) { printf("index 越界,请重新输入!\n"); return -1; }这里return -1表示操作停止。
并且这里需要多加一步,先保存被删除的数据。
int removeData = arrP[index];然后再将后面的数据前移,
for (int i = index; i < (*size); i++) { arrP[i] = arrP[i + 1]; } (*size)--; return removeData;然后再返回到被删除的数据。
另外一种情况是删除指定数据。
int del(int *arrP, int *size, int data) { for (int i = 0; i < *size; i++) { if (arrP[i] == data) { for (int j = i; j < *size - 1; j++) arrP[j] = arrP[j + 1]; (*size)--; return 1; } } return 0; }利用循环一个一个确认数组中是否有对应的数据。如果有的话,删除运行成功。
方法调用
最后在主函数中调用写好的各个方法,避免重复。可以使代码更加简洁。