关于这道题按照我最开始的思路写下去遇到了两个问题。
问题一:
我并没有先创建一个链表就直接调用了Insert()功能,导致我自己赋值的链表list1 list2一直未赋初值,编译时报错list1 list2未赋值后,我给初值NULL运行到Insert()内部也会报错 这里贴错误代码
int main()
{
int a[]={1,3,5,7,9};
int b[]={2,4,6,8,10};
List list1=NULL,list2=NULL,list3=NULL;
for(int i=0;i<5;i++)
{
Insert(a[i],list1);
Insert(b[i],list2);
}
Merge(list1,list2,list3);
prin(list3);
}
void Insert(Element x,List L)
{
List Next;
Next=(List)malloc(sizeof(struct Node));
if(Next==NULL)
{
printf("error");
}
Next->Date=x;
Next->Link=L->Link;
L->Link=Next;
}
因为如果我给NULL,运行到insert内部,
Next->Link = L->Link; 这句中,L是NULL(主函数中Insert(a[i], list1);调用时list1为NULL),你去访问 L->Link 自然导致崩溃。
后改进算法,加入链表创建函数,出现问题二
问题二:
输出发现顺序是倒的,也就是10 9 8 7这样的顺序,思考后发现如果是上边的Insert函数执行的是插入功能,每次一个新的结点都会被插入到链表L头结点后的位置,因此改进算法,完整代码如下所示
#include "stdafx.h"
#include "stdio.h"
#include<stdlib.h>
typedef int Element ;
typedef struct Node *List;
struct Node{
Element Date;
List Link;
};
List Merge(List list1,List list2,List list3);
void Insert(Element x,List L);
void prin(List l);
List InitList();
int main()
{
int a[]={1,3,5,7,9};
int b[]={2,4,6,8,10};
List list1,list2,list3;
list1=InitList();
list2=InitList();
list3=InitList();
for(int i=0;i<5;i++)
{
Insert(a[i],list1);
Insert(b[i],list2);
}
//prin(list1);
Merge(list1,list2,list3);
prin(list3);
}
void Insert(Element x,List L)
{
List temp;
temp=L;//这里应该是L的指针指向的地址赋给了temp,所以并不需要传出temp,因为temp指的正是L;
while(temp->Link!=NULL)
{
temp=temp->Link;//加入的循环会一直到尾部再进行插入
}
List Next;
Next=(List)malloc(sizeof(struct Node));
if(Next==NULL)
{
printf("error");
return;
}
Next->Date=x;
Next->Link=temp->Link;
temp->Link=Next;
}
List Merge(List list1,List list2,List list3)
{
List temp1=list1->Link;
List temp2=list2->Link;
while(temp1&&temp2)
{
if(temp1->Date<temp2->Date)
{ list3->Link=temp1;
temp1=temp1->Link;
list3=list3->Link;
}
else
{
list3->Link=temp2;
temp2=temp2->Link;
list3=list3->Link;
}
}
while(temp1!=NULL)
{
list3->Link=temp1;
temp1=temp1->Link;
list3=list3->Link;
}
while(temp2!=NULL)
{
list3->Link=temp2;
temp2=temp2->Link;
list3=list3->Link;
}
list1->Link=NULL;
list2->Link=NULL;
list3->Link=NULL;
return list3;
}
void prin(List l)
{
l=l->Link;
while(l)
{printf("%d\t",l->Date);
l=l->Link;
}
}
List InitList()
{
List l;
l=(List)malloc(sizeof(struct Node));
if(l!=NULL)
l->Link=NULL;
return l;
}
以上就是我的代码,如有错误,劳烦指出,感激不尽!