C++实现两个已经排序的链表进行合并

来源:互联网 发布:淘宝下单微信返现 编辑:程序博客网 时间:2024/06/04 20:03

  1. //定义两个同种单向链表,包含一个整数值和一个指向本节点的类型的指针,该链表中的数据都已经排好序  
  2. //编制程序,合并两个链表  
  3. #include<iostream.h>  
  4. #include<iomanip.h>  
  5. struct Node  
  6. {  
  7.     int key;  
  8.     Node *next;  
  9. };  
  10. void Create(Node *&);  
  11. void Print(Node *);  
  12. Node *Compare(Node *,Node *);   //合并  
  13. int main()  
  14. {  
  15.     Node *list1,*list2,*head;  
  16.     Create(list1);  
  17.     cout<<"The list1 is:\n";  
  18.     Print(list1);  
  19.   
  20.     Create(list2);  
  21.     cout<<"The list2 is:\n";  
  22.     Print(list2);  
  23.   
  24.     cout<<"Compare the link is:\n";  
  25.     head=Compare(list1,list2);  
  26.     Print(head);  
  27.     return 0;  
  28. }  
  29. void Create(Node *&head)    //接受引用,形参head就是指向实参的那个变量的别名  
  30. {  
  31.     Node *pb,*pend;  
  32.     head=NULL;  
  33.     pb=pend=new Node;  
  34.     cout<<"Please input value(input 0 is over!):\n";  
  35.     cin>>pb->key;  
  36.     while(pb->key!=0)  
  37.     {  
  38.         if(head==NULL)  
  39.             head=pb;  
  40.         else  
  41.             pend->next=pb;  
  42.         pend=pb;  
  43.         pb=new Node;  
  44.         cin>>pb->key;  
  45.     }  
  46.     pend->next=NULL;  
  47.     delete pb;  
  48. }  
  49. void Print(Node *head)  
  50. {  
  51.     while(head)  
  52.     {  
  53.         if(head->next==NULL)  
  54.             cout<<head->key<<endl;  
  55.         else  
  56.             cout<<head->key<<"->";  
  57.         head=head->next;  
  58.     }  
  59. }  
  60. Node *Compare(Node *list1,Node *list2)  
  61. {  
  62.     Node *newhead;  
  63.     if(list1->key<=list2->key) //设置新的头结点  
  64.         newhead=list1;  
  65.     else  
  66.         newhead=list2;  
  67.     Node *prev1,*prev2;  
  68.     prev1=list1;  
  69.     prev2=list2;  
  70.     while(list1 && list2)        //遍历两条链表开始合并  
  71.     {  
  72.         if(prev1->key<=prev2->key)  
  73.         {  
  74.             if(prev1->next==NULL)//是最后一个节点时终止循环  
  75.                 break;  
  76.             list1=prev1->next;    //预存下一个节点  
  77.             if(prev1->next->key>prev2->key)  
  78.                 prev1->next=prev2;   //将两个节点联系起来  
  79.             prev1=list1;         //移动节点  
  80.         }  
  81.         else  
  82.         {  
  83.             if(prev2->next==NULL)  
  84.                 break;  
  85.             list2=prev2->next;  
  86.             if(prev2->next->key>prev1->key)  
  87.                 prev2->next=prev1;  
  88.             prev2=list2;        //移动节点  
  89.         }  
  90.     }  
  91.     if(list1==NULL)             //list1链表比较短时  
  92.         prev1->next=prev2;  
  93.     else  
  94.         prev2->next=prev1;  
  95.     return newhead;  
  96. }  
0 0