分享

合并单链表

 BUPT-BYR 2010-12-08

3.完成下面算法,它将两个有序单链表看做集合,求其并集。

Node* set_union(Node* a,Node* b);

函数返回表示并集合的单链表第一个节点指针。注意,并集中不存在相同元素。函数返回后,链表啊,ab消失。

/*****************************************************************************/

/*==================================================================*/

/*****************************************************************************/

#include<iostream>

using namespace std;

 

#define SIZE1 7

#define SIZE2 8                                    //两个链表的长度;

 

struct Node{

       double value_;

       Node *next_;

};

 

 

//已注释

/*****************************************************************************

Node* set_union(Node* a,Node* b)                  //题目中要设计的函数(无序)

{

       int same=0;

       Node* currentPtr,*endPtr;

       currentPtr=a;

       endPtr=a;

       while(endPtr->next_!=NULL){

              endPtr=endPtr->next_;

       }

       while(b!=NULL){

              while(currentPtr!=NULL){

                     if(b->value_==currentPtr->value_) { same=1; }

                     currentPtr=currentPtr->next_;

              }

              currentPtr=a;

              if(same==0){

                     endPtr->next_=b;

              }

              same=0;

              b=b->next_;

       }

       return a;

}

*****************************************************************************/

 

 

Node* set_union(Node* a,Node* b)                   //题目中要设计的函数,适用升序;

{

       Node *previousPtr,*currentPtr;

       currentPtr=a;

       previousPtr=NULL;

    while(currentPtr!=NULL){

              if(b->value_<currentPtr->value_){         //满足该条件,将b中该节点插入a表;             

                     if(previousPtr==NULL){                //插入最前节点的处理;

                            a=b;

                         b=b->next_;

                            previousPtr=a;

                         a->next_=currentPtr;

                     }

                     else{                                 //插入非头结点的处理;

                         previousPtr->next_=b;

                         b=b->next_;   

                            previousPtr=previousPtr->next_;

                         previousPtr->next_=currentPtr;

                     }

              }

              else if(b->value_==currentPtr->value_){   //两者相等时,a表,b表同时推进;

                   b=b->next_;

                  previousPtr=currentPtr;

                   currentPtr=currentPtr->next_;

              }

              else if(b->value_>currentPtr->value_){    //满足该条件时,推进a表;

                  previousPtr=currentPtr;

                   currentPtr=currentPtr->next_;

              }

       }

       if(b!=NULL){                                  //a表遍历完而b表还没,则将b表接到a表后;

              previousPtr->next_=b;

       }

       return a;

}

 

 

int main()

{

    Node heada,headb,a[SIZE1],b[SIZE2],*currentPtr;    //开始创建链表;

       int x[SIZE1]={0,2,3,4,6,8,9};

       int y[SIZE2]={0,3,4,5,7,10,13,15};                 //用来初始化链表的数组;

    a[0].value_=x[0];

       a[0].next_=NULL;

       b[0].value_=y[0];

       b[0].next_=NULL;

 

       for(int i=1;i<SIZE1;i++){                          //赋值链表heada                

              a[i].value_=x[i];

              a[i-1].next_=&(a[i]);

       }

       a[i-1].next_=NULL;

       heada=a[0];

 

       for(int j=1;j<SIZE2;j++){                          //赋值链表headb                

              b[j].value_=y[j];

              b[j-1].next_=&(b[j]);

       }

       b[j-1].next_=NULL;

       headb=b[0];                                        //创建链表完毕;

      

    cout<<"默认链表a为:"<<endl;                       //开始输出链表heada

       currentPtr=&heada;                         

       while(currentPtr->next_!=NULL){

              cout<<currentPtr->value_<<"->";

              currentPtr=currentPtr->next_;

       }

       cout<<currentPtr->value_<<endl<<endl;    

 

    cout<<"默认链表b为:"<<endl;                       //开始输出链表headb

       currentPtr=&headb;                         

       while(currentPtr->next_!=NULL){

              cout<<currentPtr->value_<<"->";

              currentPtr=currentPtr->next_;

       }

       cout<<currentPtr->value_<<endl<<endl;  

 

    cout<<"合并后链表c为:"<<endl;                     //开始输出合并后链表;

       currentPtr=set_union(&heada,&headb);               //题目中函数的运用;                        

       while(currentPtr->next_!=NULL){

              cout<<currentPtr->value_<<"->";

              currentPtr=currentPtr->next_;

       }

       cout<<currentPtr->value_<<endl<<endl;

      

       return 0;

}
 

/****************************************************************************/

/*==================================================================*/

/****************************************************************************/

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约