删除2个非递增链表相同的元素,并且合并为一个非递增链表

来源:互联网 发布:rax户外鞋怎么样知乎 编辑:程序博客网 时间:2024/04/29 04:51

while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}

linklist fun(linklist ha,linklist hb)
{   linklist pa,pb,u,r;                                 //ha,hb分别是带头结点的两个单链表的头指针,链表中的元素值按非递减有序,本算法将两链表合并成一个按元素值非递增有序的单链表,并删除重复元素
  pa=ha->next;                                //pa是链表ha的工作指针
    pb=hb->next;                               //pb是链表hb的工作指针
    ha->next=NULL;                                 //ha作结果链表的头指针,先将结果链表初始化为空
   while(pa!=NULL && pb!=NULL)                   //当两链表均不为空时作
   {       while(pa->next && pa->data==pa->next->data)
          {u=pa->next; pa->next=u->next; free(u);}//删除pa链表中的重复元素
           while(pb->next && pb->data==pb->next->data)
          {u=pb->next; pb->next=u->next; free(u);}//删除pb链表中的重复元素
      
     if(pa->data<pb->data)
          {r=pa->next;           //将pa 的后继结点暂存于r
           pa->next=ha->next;   //将pa结点链于结果表中,同时逆置
           ha->next=pa;
           pa=r;                //恢复pa为当前待比较结点
     }
           else if(pb->data<pa->data)
     {r=pb->next;           // 将pb 的后继结点暂存于r
            pb->next=ha->next;    //将pb结点链于结果表中,同时逆置
            ha->next=pb;
            pb=r;                 //恢复pb为当前待比较结点
     }
           else{u=pb;pb=pb->next;free(u);}//删除链表pb和pa中的重复元素
   }                                         // while(pa!=null && pb!=null)
 if(pa) pb=pa;                            //避免再对pa写下面的while语句
 
 while(pb)                            //将尚未到尾的表逆置到结果表中,注意也要删除重复元素
 {
 while(pb->next && pb->data==pb->next->data)
 {u=pb->next;
  pb->next=u->next;
  free(u);
 }//∥删除链表中的重复元素
     r=pb->next;
  pb->next=ha->next;
  ha->next=pb;
  pb=r;
 }
         return ha;
}                                       //∥算法Union结束


void main()
{linklist h,h1,h3;
initlist(h);
initlist(h1);
listinsert(h);
listinsert(h1);
h3=fun(h,h1);

if(h!=NULL)
{
printf_list(h3);
//释放

}

}