链表的合并(升序和降序)

链表的合并 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;     

扫描二维码关注公众号,回复: 4895114 查看本文章

};

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;

}

猜你喜欢

转载自blog.csdn.net/cyx_chen/article/details/79918973