阅读以下说明和C函数,回答问题1和问题2,将解答填入对应栏内。 [说明] 对于具有n个元素的整型数组a,需要进行的处理是删除a中所有值为0的数组元素,并将a中所有非0元素按照原顺序连续地存储在数组空间的前端。 下面分别用函数compact

admin2012-01-13  28

问题 阅读以下说明和C函数,回答问题1和问题2,将解答填入对应栏内。
   [说明]
   对于具有n个元素的整型数组a,需要进行的处理是删除a中所有值为0的数组元素,并将a中所有非0元素按照原顺序连续地存储在数组空间的前端。
   下面分别用函数compactArr_v1和compactArr_v2来实现上述处理要求,函数的返回值为非零元素的个数。
   函数CompactArr(int a[],int n)的处理思路是:首先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非0元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。
   函数CompactArr_v2(int a[],int n)的处理思路是:利用下标i(初值为0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1。
   [C函数1]
   int CompactArr vl(int a[],int n)
   {
   int i, k;
   int *temp=(int*)malloc(n*  (1)  );
   if(!temp)
   return-1;
   for(i=0, k=0; i<n; i++)
   if(a!=0){
     (2)   =a;
   }
   for(i=0;  (3)  ; i++)
   a=temp;
   return k;
   }
   [C函数2]
   intCompactArr v2(inta[],intn)
   {
   int i, k;
   for(i=0, k=0; i<n; i++)  {
   if(a!=0){
     (4)  =a;
   }
   }
   return k;
   }

请说明函数CompactArr_v1存在的缺点。

选项

答案可能由于动态内存申请操作失败而导致函数功能无法实现,没有释放动态数组空间(存在内存泄漏问题),时问和空间效率低。

解析 本问题考查程序分析基本能力。
   解决同一个问题会有多种不同的方法,各种方法都有其特点。在本问题中,相比于函数CompactArr v2,CompactArr_v1的处理思路容易理解,由于数组a的数据需要复制给temp,然后再复制回来,因此需要更多的空间支持,处理速度时间也更长。另外,其代码执行时也可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现,虽然发生这种情况的概率很低,但也有可能发生。此外,函数结束前也没有释放所申请的内存块。
转载请注明原文地址:https://jikaoti.com/ti/l5W7FFFM
0

最新回复(0)