PTA训练题——两个有序链表的合并(完整函数)
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
//增加链表删除的操作
List Merge( List L1, List L2 ){
List p;
List s;
List k;
List f;
List e1=L1;
List e2=L2;
p=(List )malloc(sizeof(struct Node));
p->Next=NULL;
k=p;
int i=0;
if((e1->Next==NULL)&&(e2->Next==NULL)){
return p;
}
e1=e1->Next;
e2=e2->Next;
while((e1!=NULL)||(e2!=NULL)){
if((e1==NULL)&&(e2!=NULL)){
while(e2!=NULL){
s=(List )malloc(sizeof(struct Node));
s->Data=e2->Data;
s->Next=NULL;
k->Next=s;
k=s;
e2=e2->Next;
f=L2->Next;
L2->Next=f->Next;
free(f);
}
}
else if((e1!=NULL)&&(e2==NULL)){
while(e1!=NULL){
s=(List )malloc(sizeof(struct Node));
s->Data=e1->Data;
s->Next=NULL;
k->Next=s;
k=s;
e1=e1->Next;
f=L1->Next;
L1->Next=f->Next;
free(f);
}
}
else if((e1!=NULL)&&(e2!=NULL)){
while((e1!=NULL)&&(e2!=NULL)){
if(e1->Data>e2->Data){
s=(List )malloc(sizeof(struct Node));
s->Data=e2->Data;
s->Next=NULL;
k->Next=s;
k=s;
e2=e2->Next;
f=L2->Next;
L2->Next=f->Next;
free(f);
}
else if(e1->Data<=e2->Data){
s=(List )malloc(sizeof(struct Node));
s->Data=e1->Data;
s->Next=NULL;
k->Next=s;
k=s;
e1=e1->Next;
f=L1->Next;
L1->Next=f->Next;
free(f);
}
}
}
}
return p;
}
List Read(){
int i=0;
scanf("%d",&i);
int j=0;
List L;
L=(List )malloc(sizeof(struct Node));
L->Next=NULL;
List s;
s=L;
List p;
while(j<i){
p=(List )malloc(sizeof(struct Node));
scanf("%d",&p->Data);
p->Next=NULL;
s->Next=p;
s=p;
j+=1;
}
return L;
}
void Print(List L){
if(L==NULL||(L->Next==NULL)){
printf("NULL\n");
return;
}
L=L->Next;
while(L!=NULL){
printf("%d ",L->Data);
L=L->Next;
}
printf("\n");
}
这题其实不难,但就是对于链表的考察太细致,必须要注意所有边界条件。你必须清楚你的链表到底有没有头节点,头节点里在输入时究竟有没有数据;必须要明白什么时候才需要退出循环,什么时候还需要进入其他类型的循环体里继续循环直到完成。不过总算把代码都码下来了,对于链表的掌握也更清楚了。开心~