顺序表删除最小值后已用最后元素填充,为何仍执行L.length--?
关于顺序表删除最小元素代码中
L.length--的逻辑解释 问题需求回顾
从顺序表中删除值最小的元素(假设唯一),函数返回被删除元素的值。空出的位置由最后一个元素填充,若顺序表为空则显示错误信息并退出运行。
对应代码
bool Del_Min(SqList &L,ElemType &value) { if(L.length==0) return false; value=L.data[0]; int pos=0; for(int i=1;i<L.length;i++) if(L.data[i]<value){ value=L.data[i]; pos=i; } L.data[pos]=L.data[L.length-1]; L.length--; return true; }
逻辑解释
首先得明确:顺序表的length属性记录的是当前有效元素的个数,不是底层数组的容量。你疑惑的核心是没搞懂“填补空位”和“删除元素”的本质区别:
L.data[pos] = L.data[L.length-1]这一步只是用最后一个有效元素,把最小元素所在的位置填满,避免顺序表出现“空洞”(顺序表要求元素连续存储)。但这时候原末尾的元素相当于在数组里存了两份——一份在pos位置,一份在原末尾位置。- 执行
L.length--是把原末尾的那份“重复元素”排除在有效范围之外,这样顺序表的有效元素个数就减少了1,真正完成了“删除一个元素”的操作。
举个实际例子:假设顺序表当前有效元素是[3,1,4,2],length=4:
- 找到最小元素是1,位置
pos=1 - 把最后一个元素2放到pos=1的位置,数组变成
[3,2,4,2] - 执行
L.length--后,有效元素个数变为3,此时顺序表的有效元素是前3个[3,2,4],原末尾的2不再被视为有效元素,完全符合题目“删除最小元素,用最后一个元素填空位”的要求。
如果不执行L.length--,顺序表的有效元素个数还是4,相当于只是把最小元素的值替换成了最后一个元素的值,根本没完成“删除元素”的要求。
内容的提问来源于stack exchange,提问作者WinnieJiang
相关产品推荐
相关产品推荐

