The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
          原文題是嚴蔚敏同志的數據結構習題中第二章線性表中提出的問題。

          原問如下:

          2.24 假設有兩個按元素值遞增有序排列的線性表A和B,均以單鏈表作存儲結構,請編寫算法將A表與B表歸并成一個按元素值遞減有序(即非遞增有序,允許表中含有值相同的元表)排列的線性表C,并要求利用原表(即A表與B表)的結點空間構造C表。

          分析:對兩個或兩個以上,結點按元素值遞增/減排列的單鏈表進行操作時,應采用"指針平行移動、一次掃描完成"的策略。且鏈表A與鏈表B的長度大小不一定相等。

          代碼:

          #include<iostream>   
          using namespace std;  
          typedef 
          int ElemType;  
            
          //兩個遞增的鏈表合并成遞增的鏈表。   
          typedef struct LNode  
          {  
              ElemType data;  
              
          struct LNode *next;  
          }
            
          LNode;  
          typedef LNode 
          *LinkList;  
          void CreatList(LinkList &L,int n)  
          {  
              LinkList p,q;  
              L
          =new LNode;  
              L
          ->next=NULL;  
              q
          =L;  
              cout
          <<"請從小到大輸入鏈表的元素:";  
              
          for (int i=1;i<=n;i++)  
              
          {  
                  p
          =new LNode;  
                  cin
          >>p->data;  
                  p
          ->next=q->next;  
                  q
          ->next=p;  
                  q
          =q->next;  
              }
            
              cout
          <<"所創建得的遞增有序鏈表為:";  
              p
          =L->next;  
              
          for (int j=1;j<=n;j++)  
              
          {  
                  cout
          <<p->data<<" ";  
                  p
          =p->next;  
              }
            
              cout
          <<endl;  
          }
            
          void CreatC(LinkList &A,LinkList &B,LinkList &C,int n)  
          {  
              LinkList pa,pb,pc,pre
          =NULL/*C結點的上一個結點*/,q/*t*/;  
              pa
          =A->next;  
              pb
          =B->next;  
            
          //  C=t=A;// A   
              while (pa||pb)  
              
          {  
                  
          if (!pb||((pa&&pb)&&(pa->data<pb->data)))  
                  
          {  
                      
          ////將A的元素插入新表   
                      pc=pa;  
                      q
          =pa->next;  
                      pa
          ->next=pre;  
                      pa
          =q;  
                  }
            
                  
          else  
                  
          {  
                      pc
          =pb;  
                      q
          =pb->next;  
                      pb
          ->next=pre;  
                      pb
          =q; //將B的元素插入新表   
                  }
            
                  pre
          =pc;  
              }
            
              cout
          <<"合并后的遞減有序鏈表為:";  
              C
          =A;  
              A
          ->next=pc;  
              pa
          =pc;  
              
          for (int j=1;j<=n;j++)  
              
          {  
                  cout
          <<pa->data<<" ";  
                  pa
          =pa->next;  
              }
            
              cout
          <<endl;  
              getchar();  
          }
            
          void main()  
          {  
              LinkList A,B,C;  
              
          int n,m,k;  
              cout
          <<"請輸入鏈表***A***的長度:";  
              cin
          >>n;  
              CreatList(A,n);  
              cout
          <<"請輸入鏈表***B***的長度:";  
              cin
          >>m;  
              CreatList(B,m);  
              k
          =m+n;  
              CreatC(A,B,C,k);  
              system(
          0);  
              getchar();  
          }
            


          posted on 2012-06-04 09:44 Eric_jiang 閱讀(2915) 評論(2)  編輯  收藏 所屬分類: C/C++

          Feedback

          # re: 把兩個遞增的單鏈表La,Lb,合并成一個遞減的單鏈表Lc 2012-06-04 12:17 葡語翻譯公司
           ISAM文件由多級主索引、柱面索引、磁道索引和主文件組成。
            回復  更多評論
            

          # re: 把兩個遞增的單鏈表La,Lb,合并成一個遞減的單鏈表Lc 2012-11-05 20:39 566
          算法很巧妙!謝謝分享!
          還想問一下算法的時間復雜度是多少呢?  回復  更多評論
            

          主站蜘蛛池模板: 神木县| 石台县| 清水县| 九台市| 镇赉县| 武功县| 长乐市| 崇礼县| 施甸县| 南投市| 塔河县| 彭泽县| 进贤县| 东至县| 库伦旗| 万荣县| 林西县| 武安市| 新营市| 正安县| 济南市| 馆陶县| 肃宁县| 永靖县| 来凤县| 满城县| 潼南县| 拜泉县| 扶风县| 洮南市| 清涧县| 顺平县| 泗水县| 庆阳市| 凌海市| 周口市| 琼结县| 木里| 盖州市| 淮安市| 绩溪县|