struct SqList
{
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.2
{ // 已知线性表La和Lb中的数据元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
int i=1,j=1,k=0;
int La_len,Lb_len;
ElemType ai,bj;
InitList(Lc); // 创建空表Lc
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len) // 表La和表Lb均非空
{
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) // 表La非空且表Lb空
{
GetElem(La,i++,ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) // 表Lb非空且表La空
{
GetElem(Lb,j++,bj);
ListInsert(Lc,++k,bj);
}
}
void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.7
{ // 已知顺序线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
ElemType *pa,*pa_last,*pb,*pb_last,*pc;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;//不用InitList()创建空表Lc
pc=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) // 表La和表Lb均非空
{ // 归并
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last) // 表La非空且表Lb空
*pc++=*pa++; // 插入La的剩余元素
while(pb<=pb_last) // 表Lb非空且表La空
*pc++=*pb++; // 插入Lb的剩余元素
}
void MergeList(SqList La,SqList Lb,SqList &Lc)
{ // 另一种合并线性表的方法(根据算法2.7下的要求修改算法2.7)
ElemType *pa,*pa_last,*pb,*pb_last,*pc;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=La.length+Lb.length; // 此句与算法2.7不同
pc=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) // 表La和表Lb均非空
switch(comp(*pa,*pb)) // 此句与算法2.7不同
{
case 0: pb++;
case 1: *pc++=*pa++;
break;
case -1: *pc++=*pb++;
}
while(pa<=pa_last) // 表La非空且表Lb空
*pc++=*pa++;
while(pb<=pb_last) // 表Lb非空且表La空
*pc++=*pb++;
Lc.length=pc-Lc.elem; // 加此句
}
void MergeList(LinkList La,LinkList &Lb,LinkList &Lc)// 算法2.12
{ // 已知单链线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
LinkList pa=La->next,pb=Lb->next,pc;
Lc=pc=La; // 用La的头结点作为Lc的头结点
while(pa&&pb)
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb; // 插入剩余段
free(Lb); // 释放Lb的头结点
Lb=NULL;
}