鏈表的合併(升序和降序)

鏈表的合併 la+lb->lc升序

問題描述:

la :2 4 6 8

lb: 3 5 7 9

lc  :   2 3 4 5 6 7 8 9

#include <iostream>

#include <cstdlib>

typedef int elemtype;

using namespace std;

每一個節點都包含數據域與指針域

struct Lnode{

        elemtype data;

        Lnode*    next;     

};

typedef Lnode* linklist;

/*先創建一個頭結點  怎麼創建頭結點 L=(Lnode*)malloc(sizeof(Lnode))新創建的結點都不能懸空

然後依次創造結點,創造的結點都不能懸空,通過循環把要插入的數輸進去->data

插的時候又分爲頭插和尾插尾插法:定義一個尾指針  頭插法:可以實現逆序

*/

void createlist_L(linklist&L,int n){

        linklistS,tali;

        L=(Lnode*)malloc(sizeof(Lnode));

        L->next = NULL;

        tali=L;//記錄尾端很重要

        for(inti = 0;i <= n;i++){

                 S=(Lnode*)malloc(sizeof(Lnode));

                 cin>>S->data;

                 S->next = NULL;

                 tali->next = S;

                 tali=S;

        }

}

void show(linklist L){

        linklistp;

        p=L->next;

        while(p){

                 cout<<p->data<<"";

                 p=p->next;

        }

        cout<<endl;

}

void mergelist(linklist&la,linklist& lb,linklist& lc){//用頭插法實現逆序

        linklist pa,pb,panext,pbnext,pctail;

        lc=la;//a的頭結點賦給c

        pctail=lc;記錄lc的尾部

        pa=la->next;

        pb=lb->next;

        lc->next=NULL;//新建的頭結點都不能懸空若放在pa=la->next;語句的前面,la鏈表就會丟失

        free(lb);釋放lb的頭結點

        while(pa&&pb){當la lb都存在時

                 if(pa->data<=pb->data){

                 pctail->next=pa;

                 pctail=pa;

                 pa=pa->next;

        }

        else{

        pctail->next=pb;

                 pctail=pb;

                 pb=pb->next;

        }

        }

        while(pa){只有la存在時

        pctail->next=pa;

                 pctail=pa;

                 pa=pa->next;

        }

        while(pb){只有lb存在時

        pctail->next=pb;

                 pctail=pb;

                 pb=pb->next;

        }

 }

int main(){

        linklistl,m,n;

        createlist_L(l,3);

        createlist_L(m,3);

        mergelist(l,m,n);

        show(n);

        return0;

}

鏈表的合併 la+lb->lc降

問題描述:

la :2 4 6 8

lb: 3 5 7 9

lc  :   9 8 7 6 5 4 3 2

#include <iostream>

#include <cstdlib>

typedef int elemtype;

using namespace std;

struct Lnode{

        elemtype data;

        Lnode*   next;

};

typedef Lnode* linklist;

void createlist_L(linklist&L,int n){

        linklistS,tali;

        L=(Lnode*)malloc(sizeof(Lnode));

        L->next=NULL;

        tali=L;//記錄尾端很重要

        for(inti=0;i<=n;i++){

                 S=(Lnode*)malloc(sizeof(Lnode));

                 cin>>S->data;

                 S->next=NULL;

                 tali->next=S;

                 tali=S;

        }

}

void show(linklist L){

        linklistp;

        p=L->next;

        while(p){

                 cout<<p->data<<"";

                 p=p->next;

        }

        cout<<endl;

}

void mergelist(linklist&la,linklist& lb,linklist& lc){尾插法實現逆序

        linklist pa,pb,panext,pbnext;

        lc=la;//a的頭結點賦給c

        pa=la->next;

        pb=lb->next;

        lc->next=NULL;//新建的頭結點都不能懸空若放在pa=la->next;語句的前面,la鏈表就會丟失

        free(lb);

        while(pa&&pb){

                 if(pa->data<=pb->data){

                 panext=pa->next;//先記錄一下因爲後面pa->next改變了

                 pa->next=lc->next;

                 lc->next=pa;

                 pa=panext;

        }

        else{

                 pbnext=pb->next;//先記錄一下

                 pb->next=lc->next;

                 lc->next=pb;

                 pb=pbnext;

        }

        }

        while(pa){

                 panext=pa->next;//先記錄一下

                 pa->next=lc->next;

                 lc->next=pa;

                 pa=panext;

        }

        while(pb){

                 pbnext=pb->next;//先記錄一下

                 pb->next=lc->next;

                 lc->next=pb;

                 pb=pbnext;

        }

 

}

int main(){

        linklistl,m,n;

        createlist_L(l,3);

        createlist_L(m,3);

        mergelist(l,m,n);

        show(n);

        return0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章