单链表合并操作

来源:互联网 发布:蓝色滤镜软件 编辑:程序博客网 时间:2024/06/02 10:17

1.无序 

list   prio(list   a,list   b)  
  {  
  int   m=0,n=0;  
  node*p=a.first;  
  node*q=b.first;  
  while(p)  
  {  
  m++;  
  p=p->next;  
  }  
  while(q)  
  {  
  n++;  
  q=q->next;  
  }  
  if(m>=n)  
  {  
  p=a.first;  
  q=b.first;  
  while(q)  
  {  
  node*p1=p->next;  
          node*q1=q->next;  
  p->next=q;  
  q->next=p1;  
  p=p1;  
  q=q1;  
  }  
  }  
  else  
  {  
  q=a.first;  
  p=b.first;  
  while(q)  
  {  
  node*p1=p->next;  
                    node*q1=q->next;  
  p->next=q;  
  q->next=p1;  
  p=p1;  
  q=q1;  
  }  
  a.first=b.first;  
  }  
  return   a;  
  }

2.有序

 void   MergeList_L(LinkList   La,LinkList   Lb,LinkList   &Lc,Status(*compare)(ElemType,ElemType))  
  {  
  //已知单链现形表La和Lb中的数据元素按值非递减排列  
  //归并La和Lb得到的新的线形表Lc,Lc的数据元素也按值非递减排列  
  LNode   *pa,*pb,*pc;  
  pa=La->next;  
  pb=Lb->next;  
  //Lc=pc=La;//用La的头结点作为Lc的头结点  
  InitList_L(   Lc   );   //creat   the   header   for   Lc.  
  pc   =   Lc;  
   
  while(pa&&pb)  
  {  
  pc->next   =   (   LNode*   )malloc(   sizeof(   LNode   )   );  
   
  if((*compare)(pa->data,pb->data))  
  {  
  memcpy(   pc->next,   pa,   sizeof(   LNode   )   );  
  pc=pc->next;pa=pa->next;  
  }  
  else  
  {  
  memcpy(   pc->next,   pb,   sizeof(   LNode   )   );  
  pc=pc->next;pb=pb->next;  
  }  
  }  
  pc->next=pa?pa:pb;//插入剩余段  
  }