题目:从有序顺序表中删除所有其值重复的元素,使表中的值均不同。
算法思想:有序顺序表,值重复的元素一定在连续的位置上。用i记录不重复的元素。用顺序表前面的i个位置保存不重复的元素,后面的元素如果与要保留的顺序表最后一个元素不相同,则留下。扫描完成后,留下的0~i位就是值不重复的元素。
代码:
bool Delete_Same(SeqList &L){
if(L.length==0) return false;
int i, j; //i记录要留下的那个元素存放位置,j用来遍历数组
for(i=0, j=1; j<L.length; j++)
if(L.data[i] != L.data[j])
L.data[++i] = L.data[j];
L.length = i+1;
return true;
}
解析:
- 函数类型为bool,函数会返回true或false
- for循环中i从0开始,j从1开始,因为第一个元素肯定会被留下,放在L.data[0]的位置。初始时,比较第二个元素和第一个元素的值是否相同就好。
- if条件不成立,即当前扫描的元素,和前面留下来的最后一个元素相等。那么不会执行之后的语句,i不变,j自增1。
- if条件成立,当前元素和前面保留下来的元素都不相等。i自增1,当前元素会被保留在第i+1个位置。继续扫描下一个元素。
- 扫描完成后,L.data[0]~L.data[i]就是要值不重复的顺序表。
- 修改L.length为i+1,保留的都是不重复的元素,即删除了重复元素。L.length从1开始计数,数组下标从0开始计数。