C语言-删除原数组中0值并连续存储

对于具有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,然后再复制回来,因此需要更多的空间支持,处理速度时间也更长。另外,其 代码执行时也可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现, 虽然发生这种情况的概率很低,但也有可能发生。此外,数结束前也没有释放所申请 的内存块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangvalue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值