2.2线性表的顺序表示和实现(3)
顺序表的查找和合并操作
基于例题2-1与2-2(清华大学数据结构教材p20、21)研究LocateElem函数与MergeList函数的实现方法。例2-1、2-1伪代码如下:
//例2-1
//将线性表LA与LB集中于LA中
void Union(List &LA,List LB)
{
LA_len=ListLength(LA);
LB_len=ListLength(LB);
for(i=1;i<=LB_len;i++)
{
GetElem(LB,i,e);//取LB中第i个元素赋值给e
if(!LocateElem(LA,e,equal))//在LA中寻找e
{
ListInsert(LA,++LA_len,e);//在LA中增添e
}
}
}
//例2-2
//线性表LA、LB非递减有序排列,将LA、LB归并至新线性表LC中,仍非递减排列
void MergeList(List La,List Lb,List &Lc)
{
InitList(Lc);//构建空白表Lc
i=j=1;k=0;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=La_len))
{
GetElem(La,i,ai);
GetElem(Lb,j,bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len)
{
GetElem(La,i,ai);
ListInsert(Lc,++k,ai);
++i;
}
while(j<=Lb_len)
{
GetElem(Lb,j,bj);
ListInsert(Lc,++k,bj);
++j;
}
}
1.查找操作
//顺序表查找操作
int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,Elemtype))
//在顺序线性表L中查找第1个值与e满足compare()的元素位序
//若找到,则返回其在L中的位序,否则返回0
{
i=1;//i的初值为第一个元素的位序
p=L.elem; //p的初值为第一个元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
2.合并操作
从例2-2代码中可直接写出形式上极其相似的算法
//顺序表合并操作
//线性表LA、LB非递减有序排列,将LA、LB归并至新线性表LC中,仍非递减排列
void MergeList_Sq (SqList La,SqList Lb,SqList &Lc)
{
i=j=1;k=0;
pa=La.elem;
Pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));//分配内存
if(!Lc.elem)
{
exit(OVERFLOW);//存储分配失败 退出程序
}
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while((pa<=pa_last)&&(pb<=pb_last))//归并
{
if(*pa<=*pb)
{
*pc++=*pa++;
}
else
{
*pc++=*pb++;
}
}
while(pa<=pa_last)
{
*pc++=*pa++;//插入La剩余元素
}
while(pb<=pb_last)
{
*pc++=*pb++;//插入Lb剩余元素
}
}