合并两个有序链表

在纠错中不断进步

以下是合并两个有序链表为一个有序链表的代码(错误的):

#include <stdio.h>
#include <stdlib.h>
//假设都是从小到大排列 
typedef struct LNode{
    int data;
    LNode *next;
}*List,LNode;

void Creat(List &L,int n){//创建链表
   List p;//用于循环创建的节点
    L=(List)malloc(sizeof(struct LNode));
    L->next=NULL;
    for(int i=1;i<=n;i++){
        p=(List)malloc(sizeof(struct LNode));
        scanf("%d",&p->data);
        p->next =L->next;
        L->next=p;
    } 
}//创建成功



void Combine(List &L1,List &L2,List &L3){//合并两个成为第三个
   L3=L1;
   List Lc=L3;//Lc代替L3移动并完成建立,L3一直指向头节点
   L1=L1->next;
   L2=L2->next;//两者都不再指向头节点,而是含有数字的节点 
    while(L1&&L2){
        if(La->data<=Lb->data){
           Lc->next=La;
           Lc=La;
           La=La->next;
        } 
        if(La->data>Lb->data){
            Lc->next=Lb;
            Lc=Lb;
            Lb=Lb->next;
        }       
        }       
    } 
    if(L1){//说明L1还没有结束
       Lc->next=L1;         
    }
    if(L2){
        Lc->next=L2;
    }   
} //合并完成



void Print(List L3){
    L3=L3->next; 
    while(L3){      
        printf("%d",L3->data);
        L3=L3->next;
    }
}



int main(){
    List L1,L2,L3;
    int a,b;//分别表示两个已知列表的元素个数
    printf("请输入元素的个数:");
    scanf("%d,%d",&a,&b);
    Creat(L1,a);
    Creat(L2,b);
    Combine(L1,L2,L3); 
    Print(L3);
    return 0;
} 

以下是正确的:

#include <stdio.h>
#include <stdlib.h>
//假设都是从小到大排列 
typedef struct LNode{
    int data;
    LNode *next;
}*List,LNode;

void Creat(List &L,int n){//创建链表
   List p;//用于循环创建的节点
    L=(List)malloc(sizeof(struct LNode));
    L->next=NULL;
    for(int i=1;i<=n;i++){
        p=(List)malloc(sizeof(struct LNode));
        scanf("%d",&p->data);
        p->next =L->next;
        L->next=p;
    } 
}//创建成功



void Combine(List &L1,List &L2,List &L3){//合并两个成为第三个
   L3=L1;
   List Lc=L3;//Lc代替L3移动并完成建立,L3一直指向头节点
   L1=L1->next;
   L2=L2->next;//两者都不再指向头节点,而是含有数字的节点 
    while(L1&&L2){
        if(L1->data<=L2->data){
           Lc->next=L1;
           Lc=L1;
           L1=L1->next;
        } 
        else{
            Lc->next=L2;
            Lc=L2;
            L2=L2->next;
        }       
    } 
    if(L1){//说明L1还没有结束
       Lc->next=L1;         
    }
    if(L2){
        Lc->next=L2;
    }   
} //合并完成



void Print(List L3){
    L3=L3->next; 
    while(L3){      
        printf("%d",L3->data);
        L3=L3->next;
    }
}



int main(){
    List L1,L2,L3;
    int a,b;//分别表示两个已知列表的元素个数
    printf("请输入元素的个数:");
    scanf("%d,%d",&a,&b);
    Creat(L1,a);
    Creat(L2,b);
    Combine(L1,L2,L3); 
    Print(L3);
    return 0;
}

修改的地方是:

while(L1&&L2){
        if(L1->data<=L2->data){
           Lc->next=L1;
           Lc=L1;
           L1=L1->next;
        } 
        else{
            Lc->next=L2;
            Lc=L2;
            L2=L2->next;
        }       
    } 

把里面的两个if改成了一个if 两个else。这种错误实在是不该犯!!!继续加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱码仕1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值