The NoteBook of EricKong

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
          原文題是嚴(yán)蔚敏同志的數(shù)據(jù)結(jié)構(gòu)習(xí)題中第二章線性表中提出的問(wèn)題。

          原問(wèn)如下:

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

          分析:對(duì)兩個(gè)或兩個(gè)以上,結(jié)點(diǎn)按元素值遞增/減排列的單鏈表進(jìn)行操作時(shí),應(yīng)采用"指針平行移動(dòng)、一次掃描完成"的策略。且鏈表A與鏈表B的長(zhǎng)度大小不一定相等。

          代碼:

          #include<iostream>   
          using namespace std;  
          typedef 
          int ElemType;  
            
          //兩個(gè)遞增的鏈表合并成遞增的鏈表。   
          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
          <<"請(qǐng)從小到大輸入鏈表的元素:";  
              
          for (int i=1;i<=n;i++)  
              
          {  
                  p
          =new LNode;  
                  cin
          >>p->data;  
                  p
          ->next=q->next;  
                  q
          ->next=p;  
                  q
          =q->next;  
              }
            
              cout
          <<"所創(chuàng)建得的遞增有序鏈表為:";  
              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結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)*/,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
          <<"請(qǐng)輸入鏈表***A***的長(zhǎng)度:";  
              cin
          >>n;  
              CreatList(A,n);  
              cout
          <<"請(qǐng)輸入鏈表***B***的長(zhǎng)度:";  
              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) 評(píng)論(2)  編輯  收藏 所屬分類: C/C++

          Feedback

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

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

          主站蜘蛛池模板: 岢岚县| 奇台县| 兰溪市| 永寿县| 谢通门县| 保定市| 陇川县| 荆州市| 湄潭县| 藁城市| 江山市| 平潭县| 那坡县| 突泉县| 晋城| 视频| 高雄市| 南投市| 香港 | 许昌市| 兰西县| 偃师市| 古田县| 将乐县| 晋城| 冕宁县| 呼和浩特市| 博兴县| 朝阳县| 南陵县| 岑溪市| 伊宁县| 岳阳市| 灵武市| 高碑店市| 鹤岗市| 峨眉山市| 壶关县| 樟树市| 汉寿县| 蕲春县|