对于具有n个元素的整型数组a,需要进行的处理是删除a中所有值为0的数组元素,并将a中所有非0元素按照原顺序连续地存储在数组空间的前端。
下面分别用函数CompactArr_vl和CompactArr_v2来实现上述处理要求,函数的返回值为非零元素的个数。
函数CompactArr_vl(int a[], intn)的处理思路是:首先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组.a的每一个元素,将遇到的非0元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。
函数CompaetArr_v2(int a[], intn)的处理思路是:利用下标i (初值为0)顺序扫描数组a的每一个元素,下标k (初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1。
函数CompactArr_vl的缺点是什么?
解析:
(1) sizeof(int)
(2) temp[k++] 或 (temp+k++)或等价表示
(3) i (4) a[k++] 或(a+k++)或等价
本问题考査C程序结构、数组及运算的应用知识。
根据题目中对函数CompactArr_vl的处理思路描述,空(1) 处应填入sizeof(int)。 以下代码将数组a中的非0元素复制到动态数组temp中。
显然,k应作为temp的下标索引变量使用,因此空(2) 处应填入temp[k++],当该 循环语句结束后,k的值也就是a中非0元素的个数。据此,空(3) 处应填入i 可能由于动态内存申请操作失败而导致函数功能无法实现,没有释放动态数组空间 (存在内存泄漏问题),时间和空间效率低。
本问题考查程序分析基本能力。
解决同一个问题会有多种不同的方法,务种方法都有其特点。在本问题中,相比于函数CompactArr_v2, CompactArr vl的处理思路容易理解,由于数组a的数据需要复制 给temp,然后再复制回来,因此需要更多的空间支持,处理速度时间也更长。另外,其 代码执行时也可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现, 虽然发生这种情况的概率很低,但也有可能发生。此外,数结束前也没有释放所申请 的内存块。