这道题又折磨了我将近2个小时,我真菜
刚开始以为链表的创建与题意不符,debug了半天后发现没问题
后来出现的问题是
1.我想写成p3->next->data=p2->data
结果没开辟新结点,p3->next
根本找不到存储地址,导致报错
2.写完
List p=(PtrToNode)malloc(sizeof(PtrToNode));
p->data=p1->data;//递增序
p1=p1->next;
p3=p;
容易发现我p3
没有后移,这就导致p3
一直都是指向NULL
最后L3
也是NULL
入门级别的题,指针理解不好,细节处理不好真的要命啊!!!
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType data;
PtrToNode next;
};
typedef PtrToNode List;
List Read()
{
List L=(PtrToNode)malloc(sizeof(PtrToNode));
L->next=NULL;//建立一个带头结点的新链表
if(!L) exit(-1);
PtrToNode p=L,t;//一个尾指针,一个指向新节点的指针
int n,e;
scanf("%d",&n);
while(n>0)
{
scanf("%d",&e);
t=(PtrToNode)malloc(sizeof(PtrToNode));//开辟新空间用来存放新数据
t->data=e;
t->next=NULL;
p->next=t;
p=t;
n--;
}
p->next=NULL;
return L;
}
void Print( List L )
{
PtrToNode p=L->next;
if(!p){
printf("NULL\n");
return;
}
while(p!=NULL)
{
if(p->next!=NULL)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();//Print(L1);
L2 = Read();//Print(L2);
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
/* 你的代码将被嵌在这里 */
List Merge( List L1, List L2 )
{
PtrToNode p1,p2,p3;//创建三个指针分别指向三个链表
p1=L1->next;
p2=L2->next;
List L3=(PtrToNode)malloc(sizeof(PtrToNode));
L3->next=NULL;
p3=L3;
while(p1&&p2)
{
if(p1->data>=p2->data)
{
// List p=(PtrToNode)malloc(sizeof(PtrToNode));//写法一,每次都给L3开辟新结点
// p->data=p2->data;//递增序
// p3->next=p;
// p2=p2->next;
// p3=p;//p3后移
p3->next=p2;
p3=p3->next;//或写成p3=p2,都相当于p3后移
p2=p2->next;
}
else
{
// List p=(PtrToNode)malloc(sizeof(PtrToNode));
// p->data=p1->data;//递增序
// p3->next=p;
// p1=p1->next;
// p3=p;
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
}
if(p1)
{
p3->next=p1;
}
if(p2)
{
p3->next=p2;
}
L1->next=NULL;//根据题目,合并完成后需将L1,L2赋空
L2->next=NULL;
return L3;
}
/*3
1 3 5
5
2 4 6 8 10*/