关于LocateElem算法

来源:百度知道 编辑:UC知道 时间:2024/05/15 08:44:34
int LocateElem_Sq(Sq_List L,ElemType e,Status(*compare)(ElemType,ElemType))
{//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回O
i=1;
p=L.elem;
while(i<=L.Length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return;
else return 0;
}// LocateElem_Sq
很简短的一个算法,但是不是很明白。虽然书中有注释。
(1)这里的ElemType是不是一个抽象的类型,它可以代表是整型等一系列的数据类型?
(2)还有就是while(i<=L.Length&&!(*compare)(*p++,e)) ++i;中的!(*compare)(*p++,e))不是很明白是什么意思?
(3)while(i<=L.Length&&!(*compare)(*p++,e)) ++i;是不是相当于
while(i<=L.Length&&!(*compare)(*p++,e))
{++i;}

Status(*compare)(ElemType,ElemType)

这个函数就是个普通的比较相等的函数.如果相等就为true,不等就为false

while(i<=L.Length&&!(*compare)(*p++,e))

这一句的意思是,如果表没遍历完<i<=L>和(*p++)不等于e<就是还未找到相等的>

那么就执行循环,只要是表遍历完了或者找到了,循环结束.

if(i<=L.length) return;

上面这句的意思是:i是在表长之内,说明一定找到了

如果i在表长之外,就是说没有,这里i的值准确的为L.length+1;

其他的2个问题,就是你理解的那样!

由于评论限制字数,只能在回复中说了,LZ采用的最佳答案(好像只有唯一一个回答),是有问题的。讨论如下:
Status(*compare)(ElemType c1,ElemType c2)
并非是比较相等的函数,它也可以判断大于或小于,甚至e2是不是e1平方的关系(这里为了方便讨论加入c1和c2)。取决于ElemType的类型所能具有的操作,和程序员对它的定义。比如,我这么定义:
Status big(ElemType c1,ElemType c2)
{
if(c1>c2)
return TRUE;
else
return FALSE;
}
然后我这么调用:
j=3;
k=LocateElem(L,j,big);
if(k)
printf("L中的第%d个元素的值比%d大,",k,j);
else
printf("没有值比%d大的元素\n",j);

这里你可能要问为什么调用时候没有看到compare,这是因为它是形参,是在定义时候用的,真正调