在纠错中不断进步
以下是合并两个有序链表为一个有序链表的代码(错误的):
#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。这种错误实在是不该犯!!!继续加油~