算法设计分析(44页)

分别以两个(带头结点的)循环有序链表表示集合A和B,完成这两个集合并集的操作:

代码如下:

#include<stdio.h>
typedef struct LNode    {
    int data ;
    struct LNode *next ;
}LNode , *LinkList ;

void union_OL(LinkList &La , LinkList &Lb )  {
    LinkList pa = La->next->next ;
    LinkList pb = Lb->next->next ;
    LinkList rc = La->next ;
    while(pa != La->next && pb !=Lb->next)  {
        if((pa->data) < (pb->data)) {
            rc->next = pa ;
            rc = pa ;
            pa = pa->next ;
        }
        else if((pa->data) > (pb->data))    {
            rc->next = pb ;
            rc = pb ;
            pb = pb->next ;
        }
        else    {
            rc->next = pa ;
            rc = pa ;
            pa = pa->next ;
            pb = pb->next ;
        }
    }

    if(pb==(Lb->next))
        rc->next = pa ;
    else{
        Lb->next = La->next ;
        La->next = pb ;
        La = Lb ;
    }
    //printf("%d\n",La->next->next->data) ;
    LinkList hrc = La->next->next ;
    while(hrc != La->next)  {
        printf("%d ",hrc->data) ;
        hrc =hrc->next ;
    }
    printf("\n") ;
}

int main()  {
    LinkList La , Lb ;
    int a[] = {4,7,10,21,40,56} ;
    int b[] = {7,9,21,68} ;
    int i ;
    LinkList ha = new LNode ;
    La = ha ;
    for(i = 0 ; i < 6 ; i++)    {
        LinkList s = new LNode ;
        s->data = a[i] ;
        La->next = s ;
        La = s ;
    }
    La->next = ha ;
    LinkList hb = new LNode ;
    Lb = hb ;
    for(i = 0 ; i < 4 ; i++)   {
        LinkList s = new LNode ;
        s->data = b[i] ;
        Lb->next = s ;
        Lb = s ;
    }
    Lb->next = hb ;
    /*LinkList hrc = Lb->next->next ;
    printf("%d\n",hrc->data) ;
    while(hrc != Lb->next)  {
        printf("%d ",hrc->data) ;
        hrc = hrc->next ;
    }*/
   //inkList rc = La->next ;
   union_OL(La,Lb) ;
    return 0 ;
}

 

 

 

posted @ 2014-07-13 17:56  NYNU_ACM  阅读(123)  评论(0编辑  收藏  举报