线性表的合并
问题描述
解题思路
依次取出Lb中的每个元素,执行以下操作
在La中查找该元素
如果找不到,则将其插入到La的最后
代码
void unionList(SqList *La,SqList *Lb){
int La_lenth=GetLength(La);
int Lb_lenth=GetLength(Lb);
for(int i=0;i<Lb_lenth;i++){
ElemType e;
GetElem(Lb,i,e);
if(LocateElem(La,e)!=0){
ListInsert(La,La_lenth+1,e);
}
}
}
有序表的合并
顺序表实现
void MergeList_Sq(SqList *La,SqList *Lb,SqList *Lc){
ElemType *pa =La->elem;
ElemType *pb =Lb->elem;
Lc->length=Lb->length+Lc->length;
Lc->elem=(ElemType *)malloc(Lc->length * sizeof(ElemType));
ElemType *pc=Lc->elem;
ElemType *pa_last=La->elem+La->length-1;//pa_last 指向La的最后一个元素 地址=基地址+偏移量-1
ElemType *pb_last=La->elem+La->length-1;
while(pa<=pa_last && pb<=pb_last){//两个表都非空
if(*pa<=*pb){
*(pc++)=*(pa++);
}else{
*(pc++)=*(pb++);
}
}
while(pa<pa_last){ //看看La还有没有剩余,有剩余直接添加
*(pc++)=*(pa++);
}
while(pb<pb_last){
*(pc++)=*(pb++);
}
}
链表实现
void Merge_LinkedList(LinkList *La, LinkList *Lb, LinkList *Lc)
{
*Lc = *La; // 让Lc使用La的头节点进行合并
LinkList pa = (*La)->next, pb = (*Lb)->next; // pa, pb分别表示合并时所指节点
LinkList pc = *Lc; // pc表示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;
}
}
if(pa!=NULL){
pc->next=pa;
}else{
pc->next=pb;
}
// pc->next不需要NULL,因为合并时一定会剩下一串节点,只需指向该剩下的节点就OK
free(*Lb);
*La = *Lb = NULL;
}