列表

详情


阅读以下说明和C函数,回答问题l和问题2,将解答填入答题纸的对应栏内。

【说明】

对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为0的数组元素,并将a中所有的非O元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1CompactArr v2来实现上述处理要求,函数的返回值为非零元素的个数。

函数CompactArr_vl(int a[]int n)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非O元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。

函数CompactArr_v2(int a[]int n)的处理思路是:利用下标i(初值为0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1


【问题1 (12)

请根据说明中函数CompactArr_v1的处理思路填补空缺(1)(3),根据CompactArr_v2的处理思路填补空缺(4)

【问题2】(3分)

请说明函数CompactArr vl存在的缺点。

参考答案:

【问题1】
(1)  sizeof(int)   
(2)temp[k++]  或*(temp+k++)或等价表示  
(3) i<k   或等价表示   
(4)a[k++]   或*(a+k++)或等价表示   
【问题2】
可能由于动态内存申请操作失败而导致函数功能无法实现,时间和空间效率低。
 

详细解析:

申请数组a大小的空间,a为一整型数组,所以我们可以用求sizeof的方式来达到目的。复制完后将k的值增1,数组需要下移一位。将数组元素传回a中,使用for循环来达到目得,循环的条件是i<k。
遇到非0元素并将其前移后k才增1,所以形式为a[k++]而非a[++k]。
函数CompactArr vl存在的缺点有可能是时间和控件效率低。

上一题