链表的升序,降序排列及逆转,合并

代码说明:
输入四个数,la为升序链表,再输入四个数,ld为降序链表
若要将la与ld合并成升序链表,则首先将ld逆转成升序链表lb,在构造合并函数lc,具体代码讲解看链表

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct link{
    int data;
    link *next;
}link;

link *Initlink(){//初始化,创建头结点
    link *l;
    l=(link*)malloc(sizeof(link));
    l->next=NULL;
    return l;
}

link *upInsert(link *l,int x){//构造升序链表
    link *p=l->next,*prep=l;
    while(p){
        if(p->data>x){//一旦找到比x小的,立即停止,将x插在prep 与p之间
            break;
        }
        else{
            prep=p;
            p=p->next;
        }

    }
        link *s=(link*)malloc(sizeof(link));
        s->data=x;
        s->next=p;
        prep->next=s;
    return l;
}


link *downInsert(link *l,int x){//构造降序链表
    link *p=l->next,*prep=l;
    while(p){
        if(p->data<x){//一旦找到比x大的,立即停止,将x插在prep 与p之间
            break;
        }
        else{
            prep=p;
            p=p->next;
        }

    }


        link *s=(link*)malloc(sizeof(link));
        s->data=x;
        s->next=p;
        prep->next=s;

    return l;
}




void print_gewei(link *l){//这个函数是打印出链表数字的个位数
    link *p=l->next;
    while(p){
            int y=p->data;
        if(y>10){
            y=y%10;
        }
    cout<<y<<" ";
    p=p->next;
    }
    cout<<endl;
}


void print(link *l){
    link *p=l->next;
    while(p){
        cout<<p->data<<" ";
        p=p->next;//打印链表别忘了这句
    }
    cout<<endl;
}


link *Reverse(link *l){//翻转链表
    link *pre=l,*cu=l->next,*ne;
    while(cu){//设置三个参数,pre为前序节点,cu为当前节点,ne为下一个节点,所以循环条件为cu!=NULL;
        ne=cu->next;
        cu->next=pre;
        pre=cu;
        cu=ne;

    }
    link *q=l->next;//这是逆转到最后头结点的处理办法 q是个临时节点
    l->next=pre;
    q->next=NULL;
    return l;
}


link *mergeAD(link *la,link *ld){//合并一升一降链表为升序链表
    link *lb=Reverse(ld);//首先将降序链表ld逆转成升序的链表lb
    link *pb=lb->next;
    link *pa=la->next;
    link *lc=la;link *pc=lc;
    while(pb&&pa){//当pa与pb都不为零时循环
        if(pa->data<pb->data){
            pc->next=pa;
            pa=pa->next;
        }
        else{
            pc->next=pb;
            pb=pb->next;
        }
        pc=pc->next;//可以在这写,简洁
    }//截止这个括号,pa&&pb不再成立,有走到尽头的链表
       if(!pb){//若lb链表走到尽头,剩下的la直接脸上lc即可
            pc->next=pa;
        }
        else{
            pc->next=pb;
        }

    return lc;
}


int main()
{
    int x;
    link *la=Initlink();
    link *ld=Initlink();

    for(int i=0;i<4;i++){
        cin>>x;
        la=upInsert(la,x);
        //ld=downInsert(ld,x);

    }
    for(int i=0;i<4;i++){
        cin>>x;
        //la=upInsert(la,x);
        ld=downInsert(ld,x);

    }
    //print_gewei(la);
    //print_gewei(ld);
    print(la);
    print(ld);

    //link *lb=Reverse(la);
    //print(lb);


    link *lc;
    lc=mergeAD(la,ld);
    print(lc);
    return 0;
}

详见博文:https://blog.csdn.net/fanwu72/article/details/8740866

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值