设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C(该程序中的功能包含了上几个博客中的部分功能)

//头文件
#ifndef LIST_H
#define LIST_H

#include
   
   
    
    
#include
    
    
     
     
using namespace std;
template
     
     
      
      
class LinkNode{
public:
	T data;
	LinkNode
      
      
       
       * link;
	LinkNode()
	{

	}
	LinkNode(const T& item,LinkNode
       
       
         *ptr=NULL){ data = item; link = ptr; } }; template 
        
          class List{ private: LinkNode 
         
           * head; LinkNode 
          
            * currPos; public: List(); ~List(); void Append(const T value);//为链表赋值,规定链表长度 void clear(); void print(); void HeadToTail();//将链表倒置 //最大值,节点数,平均值 T MaxValue(); int Count(); T Average(); //合并链表 void AppendIncre(const T value); void Merge(List 
           
             & ptr);//合并两个已排序的链表 }; template 
            
              void List 
             
               ::AppendIncre(const T value) { if (head == NULL) { head = new LinkNode 
              
                (value); currPos = head; } else { LinkNode 
               
                 * p = currPos; if (value < (p->data)) { return ; } p->link = new LinkNode 
                
                  (value); p = p->link; p->link = NULL; currPos = p; } } template 
                 
                   void List 
                  
                    ::Merge(List 
                   
                     & ptr) { LinkNode 
                    
                      * pa = head; LinkNode 
                     
                       * pb = ptr.head; //由于链表不带头结点,所以先比较第一个数据的大小,从而确定合并后的链表的头指针的位置 LinkNode 
                      
                        * pd = (pa->data >= pb->data) ? pa : pb; LinkNode 
                       
                         * p = new LinkNode 
                        
                          (pd->data); LinkNode 
                         
                           * pHead = p; if (p->data == pa->data) pa = pa->link; else { pb = pb->link; delete ptr.head; ptr.head = pb; } while (pa&&pb) { if (pa->data >= pb->data) { p->link = new LinkNode 
                          
                            (pa->data); p = p->link; pa = pa->link; } else { p->link = new LinkNode 
                           
                             (pb->data); p = p->link; pb = pb->link; //删除ptr的空间 delete ptr.head; ptr.head = pb; } } if (pa) { while (pa) { p->link = new LinkNode 
                            
                              (pa->data); p = p->link; pa = pa->link; } } else { while (pb) { p->link = new LinkNode 
                             
                               (pb->data); p = p->link; pb = pb->link; //删除ptr的空间 delete ptr.head; ptr.head = pb; } } p->link = NULL; //删除调用该函数的链表的原空间 clear(); head = pHead; } //最大值,节点数,平均值 template 
                              
                                T List 
                               
                                 ::MaxValue() { T maxValue = 0; LinkNode 
                                
                                  * p = head; while (p != NULL) { if (maxValue < (p->data)) maxValue = p->data; p = p->link; } return maxValue; } template 
                                 
                                   int List 
                                  
                                    ::Count() { int count = 0; LinkNode 
                                   
                                     * p = head; while (p != NULL) { p = p->link; count++; } return count; } template 
                                    
                                      T List 
                                     
                                       ::Average() { T average = 0; T sum = 0; LinkNode 
                                      
                                        * p = head; while (p != NULL) { sum += (p->data); p = p->link; } return average = (sum / Count()); } template 
                                       
                                         List 
                                        
                                          ::List() { //默认构造函数 head = NULL; currPos = NULL; } template 
                                         
                                           List 
                                          
                                            ::~List() { clear(); } template 
                                           
                                             void List 
                                            
                                              ::Append(const T value) { if (head == NULL) { head = new LinkNode 
                                             
                                               (value); currPos = head; } else { LinkNode 
                                              
                                                * p = currPos; p->link = new LinkNode 
                                               
                                                 (value); p = p->link; p->link = NULL; currPos = p; } } template 
                                                
                                                  void List 
                                                 
                                                   ::clear() { LinkNode 
                                                  
                                                    * p = head; while (p != NULL) { p = p->link; delete head; head = p; } } template 
                                                   
                                                     void List 
                                                    
                                                      ::print() { LinkNode 
                                                     
                                                       * p = head; while (p != NULL) { cout << p->data << " "; p = p->link; } cout << endl; } template 
                                                      
                                                        void List 
                                                       
                                                         ::HeadToTail() { int top = -1; stack 
                                                        
                                                          temp; LinkNode 
                                                         
                                                           * p = head; while (p != NULL) { temp.push(p->data); p = p->link; } p = head; while (p != NULL) { p->data = temp.top(); p = p->link; temp.pop(); } } #endif //主函数 #include"List.h" int main(int argc, char argv[]) { List 
                                                          
                                                            list; List 
                                                           
                                                             list1; int count; cout << "请输入单链表的长度:"; cin >> count; /*int value; for (int i = 0; i < count; i++) { cin >> value; list.Append(value); }*/ int value; for (int i = 0; i < count; i++) { cin >> value; list.AppendIncre(value); } for (int i = 0; i < count; i++) { cin >> value; list1.AppendIncre(value); } /*list.print(); list.HeadToTail(); list.print();*/ /*int maxValue = list.MaxValue(); cout << "最大值:" << maxValue << endl; int listCount = list.Count(); cout << "链表的节点数:" << listCount << endl; int average = list.Average(); cout << "平均数:" << average << endl;*/ list.print(); list.HeadToTail(); list.print(); list1.HeadToTail(); list.Merge(list1); list.print(); return 0; } 
                                                            
                                                           
                                                          
                                                         
                                                        
                                                       
                                                      
                                                     
                                                    
                                                   
                                                  
                                                 
                                                
                                               
                                              
                                             
                                            
                                           
                                          
                                         
                                        
                                       
                                      
                                     
                                    
                                   
                                  
                                 
                                
                               
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值