- 前面线性表ADT说到了一个功能——查找:有时我们想知道,某个小朋友,比如麦兜是否是班里的小朋友,老师会告诉我说,不是,麦兜在春田花花幼儿园里,不在我们幼儿园。这种査找某个元素是否存在的操作很常用。那么今天我们就来实现一下查找的功能。
- 如何设计查找功能的函数呢。首先参数,我们需要传入线性表L,仅仅查找的话是不需要对表进行变化的,所以用值传递就行。然后就是传入需要查找元素的位置 i,最后还需要一个参数 *e,这个需要用地址传递,因为要保存函数的查找结构。所以函数设计如下:
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
调用如下:
SqList L;
ElemType e;
int pos;
printf("你要查找第几个元素? ");
scanf("%d",&pos);
GetElem(L,pos,&e);
printf("第%d个元素的值为:%dn",pos,e);
- 查找蛮简单的嘛,就是 *e=L.data[i-1]; 把线性表数据数组的第 i 个,也就是下标 i - 1 的元素赋值给 *e; 只是要注意,保存数据的 e 需要地址传值。
- 还没完噢。还有一个查找需求,就是知道一个数值,查找这个值是否在表中。函数原型大概这样吧。int locateElem(L,e); //查找线性表中是否有e,如果有返回它的位置(从1开始),否则返回0表示失败。
我们提供线性表,还有需要查找的数值,然后遍历线性表,如果发现 L.data[i]==e,那就跳出循环,再返回跳出循环时的 i 值就行。
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length==0)
return 0;
for(i=0;i < L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
- 线性表的查找大概就这两种类型啦,今天的任务完成。