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

来源:互联网 发布:日语汉字注音软件 编辑:程序博客网 时间:2024/06/07 18:31

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

问题一:

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

原创粉丝点击