02-线性结构1 两个有序链表序列的合并 (15 分)

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

用久了比C更高级的语言感觉C才是万物本源,C/C++学好了才能打遍天下无敌手

这道题的指针又折磨了我很久,不过我也对指针有了2点更进一步的认知(做题一定要仔细认真看链表有没有空的头结点)

1.函数形参是指针类型时,其实也并未直接是使用实参传来的指针进行操作,而是自动重新malloc了一个新指针出来,用新指针指向形参指向的那一块变量,所以说如这道题的代码这么写,merge函数里面使用L1,L2往下遍历链表,(按照sample)这就使得这个函数作用域里的L1最终指向NULL,而指针L2最终指向数字6,但是main函数里面L1,L2指针位置仍然没有变,仍然都指向两个链表的头结点(),所以下面的print函数输出的仍然是链表数字序列而不是NULL。所以这道题应该在题目内部设置一个新指针p1,p2用来进行链表合成,L1,L2两个系统自动创建的指针(在当前函数作用域内)仍旧指向main函数里面的两个链表的头结点,最后在merge函数里面L1->next=NULL进行把两个原始链表置空

2.指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。如:*pointer_1=100;//pointer_1 是指针变量,100是整数,不合法。*p = 1,表示将1赋值给p 所指的变量或地址空间,在这步上面肯定有*p的初始化或已赋地址。不然你直接这样写肯定是错的。

假设:int  *p;

    *p = 7;

则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

int k;

int *p;

p = &k;  //给p赋值

*p = 7; //给p所指向的内存赋值,即k= 7

所以这种写法必须要避免,devc++并不会报错,注意好变量声明和初始化(赋值时分配内存空间),所以这样的值一定是野值

下面是AC代码

输入样例:

3
1 3 5
5
2 4 6 8 10

输出样例:

1 2 3 4 5 6 8 10 
NULL
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(); /* 细节在此不表     (也就是说提交的时候可以不考虑,不过还是要写的!)    */
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 Read()
{
    int n;
    scanf("%d",&n);
    List L=(List)malloc(sizeof(PtrToNode));   ///申请一个头结点
    L->Next = NULL;        ///头指针为空
    if(n)    ///当n不是0时
    {
        List r=L;     ///r是一个中间变量的节点
        for(int i=0;i<n;i++) 
        {
            List p=(List)malloc(sizeof(struct Node));
            scanf("%d",&(p->Data));    ///尾插法
            r->Next = p;
            r = p;
        }
        r->Next = NULL;         
    }
    return L;
}
 
void Print( List L )
{
   List p=L->Next;
   if(p)
   {
       List r;
       r = L;
       while(r->Next)
       {
           r = r->Next;
           printf("%d ",r->Data);
       }
   }
   else
   {
       printf("NULL");
   }
   printf("\n");
}
 
List  Merge(List L1,List L2)//算法工程师 
{
    List bupt=(List)malloc(sizeof(struct Node));
    List L=bupt;
    bupt->Next=NULL;
    List P1=L1->Next;
    List P2=L2->Next;
	while(P1&&P2)
   	{
        if( P1->Data<=P2->Data)
        {
            List newnode=(List)malloc(sizeof(struct Node));
            newnode->Data=P1->Data;
            bupt->Next=newnode;
            P1=P1->Next;
            bupt=newnode;
        }
        else
        {
            List newnode=(List)malloc(sizeof(struct Node));
            newnode->Data=P2->Data;
            bupt->Next=newnode;
            P2=P2->Next;  
            bupt=newnode;  
        }
   }
   bupt->Next= P2?P2:P1;
   L1->Next=NULL; 
   L2->Next=NULL;
   return L;
}

​

猜你喜欢

转载自blog.csdn.net/wyh196646/article/details/90139154