两个有序链表序列的合并 PAT

关于这道题按照我最开始的思路写下去遇到了两个问题。

问题一:

             我并没有先创建一个链表就直接调用了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;
}
                           以上就是我的代码,如有错误,劳烦指出,感激不尽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值