假设线性表采用顺序存储结构,表中元素值为整型。阅读算法f 30,并回答下列问题

来源:百度知道 编辑:UC知道 时间:2024/05/31 12:27:03
30.假设线性表采用顺序存储结构,表中元素值为整型。阅读算法f 30,并回答下列问题:
(1)设顺序表L=(3,7,3,2,1,1,8,7,3),写出执行算法f 30后的L;
(2)简述算法f 30的功能。
void f 30(SeqList *L)
{ int i,j,k;
k=0;
for(i=0;i<L->length;i++)
{ for(j=0;j<k && L->data[i]!=L->data[j];j++);
if(j==k)
{ if(k!=i)L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}

答案是:
(1) 3 7 2 1 8
(2) 删除线性表中重复元素,重复元素仅记一次

请求详细解答程序,要注释,谢谢@!

可以先试想:如果是人来做这件事应该怎样入手。
很简答,
1.拿到一个数,
2.检验这个数是否与已经看过的数重复了。如果重复了则...否则...
显然,两步各要一重循环。

这样相像:序列中有若干个标记了数字的白球,顺序去看这些白球,如果球上是一个新的数字那么将球涂成红的,反之如果是重复的数字将球涂成绿的。顺便想一想,每次检查新的数字的时候,需要和所有已经看过的球比较吗?不需要的,只要和红球比较即可。

程序还做了移位覆盖操作:找到一个未重复的球时,若序列中有绿球,就将序列中的第一个绿球替换成当前球,并将之标红。若序列中无绿球,就将当前球涂红。
这样保证了序列中永远保持着这样的顺序:
若干个红球,若干个绿球,若干个白球。

接下来明确各变量的含义:
i是遍历白球用的变量,由于只遍历一次,又可以解释为序列中第一个白球的位置。

k是所有红球后的第一个位置,如果k=i说明暂时没有绿球。否则k指向了序列中第一个绿球的位置。

j是遍历红球用的变量,红球的范围是[0,k),因此j的取值是[0,k],如果j=k说明并无重复。

说到这你明白了吗?再看代码。注释请自己写。