考研复习(3)链表操作续

几个感觉不错的简单算法

void merge1(LinkList *La,LinkList *Lb,LinkList *Lc);//将俩有序链表合并成有序链表
void merge2(LinkList *La,LinkList *Lb,LinkList *Lc);//将两个非递减的链表合并成一个非递增的链表
void Dif(LinkList *La,LinkList Lb,LinkList Lc);//删除有序链表A中B,C共有的元素

//union two sorted linklist

void merge1(LinkList *La,LinkList *Lb,LinkList *Lc)
{
Lnode *p=(*La)->next,*q=(*Lb)->next,*r;
*Lc=r=*La;//r和*lc同时指向**la
while(p&&q)
{
if(p->data<=q->data)
{
r->next=p;//将下一节点指向la的当前节点
r=p;//将r移向当前节点
p=p->next;//指针后移
}
else
{
r->next=q;
r=q;
q=q->next;
}


}
r->next=p?p:q;
// free(q);
//书上写有这句,加上它之后再vc过不了,感觉也没什么意义。


}
void merge2(LinkList *La,LinkList *Lb,LinkList *Lc)
{


Lnode *p=(*La)->next,*q=(*Lb)->next,*r;
while(p||q)
{
if(p==NULL)
{
r=q;q=q->next;
}
else if(!q)
{
r=p;p=p->next;


}
else if(p->data<=q->data)
{


r=p;p=p->next;
}
else
{
r=q;q=q->next;
}
r->next=(*Lc)->next;//insert at front
(*Lc)->next=r;
}
//delete La;delete Lb;
}
void Dif(LinkList *La,LinkList Lb,LinkList Lc)
{


Lnode *pa=(*La)->next,*pb=Lb->next,*pc=Lc->next,*r,*pre;//when you want to delete a node you need know the last node's point
pre=*La;//pre point to the head node at begining
while(pa&&pb&&pc)
{


if(pa->data<pb->data)
{
pre=pa;pa=pa->next;
printf("hahha");
}
else if(pb->data<pc->data) pb=pb->next;
else if(pc->data<pa->data) pc=pc->next;
else{
pre->next=pa->next;
//delete pa;
pa=pa->next;
}
}
}

你可能感兴趣的:(链表)